"\"pepe\\u0026pepe-6ren">
gpt4 book ai didi

ruby-on-rails - Rails,为什么 '.to_json' 正在转义 html 实体

转载 作者:数据小太阳 更新时间:2023-10-29 08:44:53 28 4
gpt4 key购买 nike

这是在 rails console (Rails v4.0.4) 中发生的事情:

irb(main):020:0> "pepe&pepe <juan>".to_json
=> "\"pepe\\u0026pepe \\u003Cjuan\\u003E\""

这是在 irb 控制台 (Ruby 2.0.0p247) 中发生的事情:

irb(main):014:0> "pepe&pepe <juan>".to_json
=> "\"pepe&pepe <juan>\""

我知道我可以覆盖此行为,但我担心的是为什么 Rails 默认这样做?这可能是不这样做的后果?因为对我来说,覆盖此行为而不是转义 html 实体似乎是个好主意,但我确定我遗漏了一些东西。

最佳答案

JSON 被写入 HTML 上下文 - 脚本和属性 - 在 Rails 中很多

在这种情况下,此默认转义避免注入(inject):在特定上下文中有意义且未转义的字符会造成注入(inject)/XSS 风险。1

当且仅当处理不是这种情况的上下文时,才可以安全地禁用它:默认设置只是为了“安全”。因为这种 HTML 安全转换可以没有违反任何标准并且没有链接 JSON-equivalency2 这就是 Rail 的 ream 所做的 - 对他们有好处!3

特别是这避免了讨厌的“JSON”2,例如:

var x = {"foo": "</script><script>alert('owned')</script>"};

JSON 嵌入到其他 HTML 结构中,例如。数据属性,也可能有问题。即使使用需要额外编码步骤的 JSON.parse,也会留下同样的潜在问题。


1 标准的安全编码输出方法适用于 HTML PCDATA 上下文,但在将 JSON 发送到脚本元素 (CDATA) 的情况下,这是不可取的并有意跳过(例如,使用 原始)。

2 这是another answer of mine我在其中写了关于为什么这种转义总是有效以及使用 JSON 作为 JavaScript 文字的警告。与臭名昭著且设计不当的“添加斜杠”不同,HTML 安全的 JSON 表示相同的信息。

3 Microsoft 的 JavaScriptSerializer 和 PHP 中的 json_encode 具有相似的默认编码行为。使用这些库/函数的默认上下文可能对默认的 HTML 安全配置起着很大的作用。

关于ruby-on-rails - Rails,为什么 '.to_json' 正在转义 html 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32318261/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com