这是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实体似乎是一个好主意,但我确定我错过了一些东西。
答案 0 :(得分:3)
JSON被写入HTML上下文 - 脚本和属性 - 在Rails中很多。
在这种情况下,此默认转义会避免注入:在特定上下文中有意义但未转义的字符会造成注入/ XSS风险。 1 < / SUP>
当且仅当处理不是这种情况的情境时,可以安全地禁用它:默认只是支持'安全'。因为这个HTML安全转换可以完成没有打破任何标准和没有链接JSON等效性 2 这是铁路公司的做法 - 对他们有利! 3
特别是这可以避免令人讨厌的'JSON' 2 ,如:
var x = {"foo": "</script><script>alert('owned')</script>"};
JSON嵌入到其他HTML结构中,例如。数据属性也可能有问题。即使使用需要额外编码步骤的JSON.parse
,也会留下相同的潜在问题。
1 标准的安全编码输出方法适用于HTML PCDATA上下文,但是在向脚本元素(CDATA)发出JSON的情况下,这是不可取的并且有目的地跳过(例如,使用{ {1}})。
2 这里是another answer of mine我写的有关为什么这样的转义始终有效以及使用JSON作为JavaScript Literal的警告。与臭名昭着和设计不合理的“添加斜杠”不同,HTML安全JSON代表相同的信息。
3 Microsoft的JavaScriptSerializer和PHP中的json_encode具有类似的默认编码行为。使用这些库/函数的默认上下文可能会对默认的HTML安全配置起很大作用。