ruby-on-rails - 为什么 to_json 在 Rails 4 中自动转义 unicode?

标签 ruby-on-rails json encoding unicode ruby-on-rails-4

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/

相关文章:

android - 在 JSONArray 中具有 JSON 对象的 Android 中的 JSON 解析

image - 如何确定图像的编码

amazon-web-services - AZ64压缩格式性能

css - Sencha (v5) App Watch 未获取 SASS 更改

ruby-on-rails - image_tag 不使用 asset_host

ruby-on-rails - Rabl json 集合动态键

ruby-on-rails - 压缩来自 Rails 应用程序的 JSON 响应

javascript - 填充最后一个输入时 JQuery ajax 调用失败

ios - 如何获取json数据并通过segue传递它

swift - 可编码结构中的可编码变量