我有时会看到人们在htmlspecialchars()中包装json_encode().为什么?

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": "&lt;/script&gt;&lt;script&gt;doSomethingEvil()&lt;/script&gt;"}<script>
Run Code Online (Sandbox Code Playgroud)

相反,它避免了XSS漏洞.

解决这个问题的一个更好的解决方案就是不直接在HTML源代码中发送JSON数据(JSON编码只是使内容安全地嵌入JS,而不是HTML)


Que*_*tin 8

在JSON中具有特殊含义的字符在HTML中都没有特殊含义(除了ENT_NOQUOTES明确排除的引号字符外).

它使数据安全地转储到HTML文档中(只要它没有放在属性值中)innerHTML.当然,它使数据不安全,不会涉及使用字符串构建标记.

我不会建议这样做(一般情况下),逃避应在最后一刻插入到所需的数据格式之前完成(以最大化可重用性,并明确,开发人员应该会看到转义代码).