Rails,为什么 '.to_json' 正在转义 html 个实体
Rails, why '.to_json' is escaping html entities
这是 rails console
(Rails v4.0.4) 中发生的事情:
irb(main):020:0> "pepe&pepe <juan>".to_json
=> "\"pepe\u0026pepe \u003Cjuan\u003E\""
这是 irb console
(Ruby 2.0.0p247) 中发生的事情:
irb(main):014:0> "pepe&pepe <juan>".to_json
=> "\"pepe&pepe <juan>\""
我知道我可以覆盖此行为,但我担心的是 为什么 Rails 默认情况下这样做 ?这可能是不这样做的后果?因为对我来说,覆盖此行为而不是转义 html 实体似乎是个好主意,但我确定我遗漏了一些东西。
JSON 写入 HTML 上下文 - 脚本和属性 - 很多 in Rails.
此默认转义 避免 在这种情况下的注入:在特定上下文中有意义且未转义的字符会造成注入/XSS 风险。1
当且仅当在不是这种情况的上下文中处理时,才可以安全地禁用它:默认值只是支持 'safety'。因为这个HTML-安全的转换可以在没有破坏任何标准的情况下完成,并且没有链接JSON-等效2 这就是 Rail 的 ream 所做的 - 对他们有好处!3
特别是这避免了讨厌的 'JSON'2 像:
var x = {"foo": "</script><script>alert('owned')</script>"};
JSON 嵌入到其他 HTML 构造中,例如。数据属性,也可能有问题。即使使用需要额外编码步骤的 JSON.parse
,也会留下同样的潜在问题。
1 标准安全编码输出方法适用于 HTML PCDATA 上下文,但在将 JSON 发送到脚本元素(CDATA ) 这是不可取的,有意跳过(例如 raw
)。
2 这里是 another answer of mine 我写了为什么这样的转义 总是有效 以及警告使用 JSON 作为 JavaScript 文字。与臭名昭著且设计不当的 'add slashes' 不同,HTML-safe JSON 表示相同的信息。
来自 Microsoft 的 3 JavaScriptSerializer 和 PHP 中的 json_encode 具有相似的默认编码行为。使用这些 libraries/functions 的默认上下文可能对默认 HTML-安全配置起着很大的作用。
这是 rails console
(Rails v4.0.4) 中发生的事情:
irb(main):020:0> "pepe&pepe <juan>".to_json
=> "\"pepe\u0026pepe \u003Cjuan\u003E\""
这是 irb console
(Ruby 2.0.0p247) 中发生的事情:
irb(main):014:0> "pepe&pepe <juan>".to_json
=> "\"pepe&pepe <juan>\""
我知道我可以覆盖此行为,但我担心的是 为什么 Rails 默认情况下这样做 ?这可能是不这样做的后果?因为对我来说,覆盖此行为而不是转义 html 实体似乎是个好主意,但我确定我遗漏了一些东西。
JSON 写入 HTML 上下文 - 脚本和属性 - 很多 in Rails.
此默认转义 避免 在这种情况下的注入:在特定上下文中有意义且未转义的字符会造成注入/XSS 风险。1
当且仅当在不是这种情况的上下文中处理时,才可以安全地禁用它:默认值只是支持 'safety'。因为这个HTML-安全的转换可以在没有破坏任何标准的情况下完成,并且没有链接JSON-等效2 这就是 Rail 的 ream 所做的 - 对他们有好处!3
特别是这避免了讨厌的 'JSON'2 像:
var x = {"foo": "</script><script>alert('owned')</script>"};
JSON 嵌入到其他 HTML 构造中,例如。数据属性,也可能有问题。即使使用需要额外编码步骤的 JSON.parse
,也会留下同样的潜在问题。
1 标准安全编码输出方法适用于 HTML PCDATA 上下文,但在将 JSON 发送到脚本元素(CDATA ) 这是不可取的,有意跳过(例如 raw
)。
2 这里是 another answer of mine 我写了为什么这样的转义 总是有效 以及警告使用 JSON 作为 JavaScript 文字。与臭名昭著且设计不当的 'add slashes' 不同,HTML-safe JSON 表示相同的信息。
来自 Microsoft 的3 JavaScriptSerializer 和 PHP 中的 json_encode 具有相似的默认编码行为。使用这些 libraries/functions 的默认上下文可能对默认 HTML-安全配置起着很大的作用。