我最近收到第三方的建议,“出于安全原因”对所有服务器响应中的 HTML 特殊字符进行编码。所以:
' --> '
& --> &
e.g.
{ "id": 1, "name": "Miles O'Brien" }
问题:这样做是否能带来安全收益,或者只是一种偏执?
& --> &
您确定这就是他们想要的编码吗?
对 JSON 响应中返回的 HTML 特殊字符进行编码是有原因的,这是为了避免由不需要的类型嗅探引起的 XSS。例如,如果您有:
{ "name": "<body>Mister <script>...</script>" }
并且攻击者在 HTML 上下文(例如 iframe src)中包含了指向 JSON 返回资源的链接,然后愚蠢的浏览器可能会因为赠品字符串而做出决定<body>
,您的文档不是 JSON 对象,而是 HTML 文档。然后它可以在您的安全上下文中执行脚本,从而导致 XSS 漏洞。
解决这个问题的方法是使用 JSON 字符串文字转义,例如:
{ "name": "\u003Cbody\u003EMister \u003Cscript\u003E...\u003C/script\u003E" }
在这种情况下使用 HTML 转义虽然可以避免该问题,但会产生更改字符串含义的副作用。"Miles O'Brien"
由 JSON 解析器读取仍然是Miles O'Brien
其中包含 &x-27,因此如果您使用以下类似方式将该值写入页面.value
, .textContent
或 jQuery.text()
它看起来会很奇怪。
现在,如果您将该字符串分配给.innerHTML
或 jQuery.html()
相反,那么是的,无论 JSON XSS 问题如何,您肯定需要在某个时候对其进行 HTML 转义。不过,我建议在这种情况下,出于关注点分离的原因,该点应该位于您实际将内容注入 HTML 标记的客户端,而不是生成 JSON 的服务器端。一般来说,当有更安全的 DOM 样式方法可用时,最好避免将字符串注入到标记中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)