我正在阅读OWASP XSS 预防备忘单,并注意到它认为以下代码是反模式。
<script>
var initData = <%= data.to_json %>; // Do NOT do this without encoding the data with one of the techniques listed below.
</script>
它建议的替代方案是:
<script id="init_data" type="application/json">
<%= html_escape(data.to_json) %>
</script>
...然后在您的 javascript 文件中:
var dataElement = document.getElementById('init_data');
var jsonText = dataElement.textContent || dataElement.innerText // unescapes the content of the span
var initData = JSON.parse(jsonText);
但是,备忘单并没有说明原始代码有什么问题。它仅仅是一种反模式,还是那里有 XSS 的实际机会?似乎 PHPjson_encode()
应该正确地进行所有必要的转义,以便将其转换为有效的 JSON 对象,而 JSON 是 Javascript 的一个足够接近的子集,只要您转义 U+2028 和 U +2029。