rails 3:
{"a" => "<br/>"}.to_json
=> "{\"a\":\"<br/>\"}"
rails 4:
{"a" => "<br/>"}.to_json
=> "{\"a\":\"\\u003Cbr/\\u003E\"}"
为什么???
它似乎导致了错误
Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8
当我的 Rails 3 应用程序尝试解析由我的 Rails 4 应用程序生成的 JSON 时。
最佳答案
WHY???
防御网络应用程序中的常见弱点。如果您在 HTML 页面中说,例如:
<script type="text/javascript">
var something = <%= @something.to_json.html_safe %>;
</script>
那么您可能会认为自己没问题,因为您已经对注入(inject) JavaScript 的数据进行了 JSON 转义。但实际上你并不安全:除了 JSON 语法之外,你还有周围的 HTML 语法,并且在 HTML 脚本 block 中 </
是带内信令。实际上,如果@something
包含字符串 </script>
您遇到了跨站点脚本漏洞,如下所示:
<script type="text/javascript">
var something = {"attack": "abc</script><script>alert('XSS');//"};
</script>
第一个脚本 block 在字符串中途结束(留下未闭合的字符串文字语法错误),第二个 <script>
被视为新的脚本 block ,并执行其中可能由用户提交的内容。
逃离<
字符为\u003C
JSON 不需要,但它是一个完全有效的替代方案,并且它会自动避免此类问题。如果 JSON 解析器拒绝它,那么这对阅读器来说是一个严重的错误。
产生该错误的代码是什么?我不相信该错误与 <
有关。 -转义,因为它谈论的是字节 0xC3 而不是 0x3C。这可能表明带有 UTF-8 编码内容的字符串未被标记为 UTF-8...也许您需要 force_encoding("UTF-8")
在输入上?
关于ruby-on-rails - 为什么 to_json 在 Rails 4 中自动转义 unicode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936318/