Sta*_*ann 7 javascript php json
我经常这样做:
echo json_encode($result);
Run Code Online (Sandbox Code Playgroud)
但是我看到人们有时这样做:
echo htmlspecialchars( json_encode($result), ENT_NOQUOTES );
Run Code Online (Sandbox Code Playgroud)
为什么要在JSON上使用htmlspecialchars?
oll*_*iej 10
我不知道php,所以我假设htmlspecialchars转义任何html特殊字符.
鉴于该假设,那么用例是直接在html内容中种植json数据,a la
echo "<script>"
echo json_encode($result)
echo "</script>"
Run Code Online (Sandbox Code Playgroud)
鉴于json编码仅对内容进行编码以避免从JS解析器中转义,此方案将允许某人插入html解析器解释为结束脚本标记的JSON数据.
就像是
{"foo": "</script><script>doSomethingEvil()</script>"}
Run Code Online (Sandbox Code Playgroud)
然后会到达浏览器
<script>{"foo": "</script><script>doSomethingEvil()</script>"}<script>
Run Code Online (Sandbox Code Playgroud)
这显然导致doSomethingEvil()被执行.通过转义任何html令牌,你最终会发送类似的东西
<script>{"foo": "</script><script>doSomethingEvil()</script>"}<script>
Run Code Online (Sandbox Code Playgroud)
相反,它避免了XSS漏洞.
解决这个问题的一个更好的解决方案就是不直接在HTML源代码中发送JSON数据(JSON编码只是使内容安全地嵌入JS,而不是HTML)
在JSON中具有特殊含义的字符在HTML中都没有特殊含义(除了ENT_NOQUOTES
明确排除的引号字符外).
它使数据安全地转储到HTML文档中(只要它没有放在属性值中)innerHTML
.当然,它使数据不安全,不会涉及使用字符串构建标记.
我不会建议这样做(一般情况下),逃避应在最后一刻插入到所需的数据格式之前完成(以最大化可重用性,并明确,开发人员应该会看到转义代码).
归档时间: |
|
查看次数: |
5546 次 |
最近记录: |