是php';s json_encode()在嵌入脚本元素时易受攻击


Is php's json_encode() vulnerable when embedded in a script element?

我很久以前就读过OWASP的XSS预防作弊表,并制作了一个默认包含JSON_HEX_TAG|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_HEX_AMP的包装函数,这样我就安全了。或者我是这么想的,直到Freenode/##php的一位用户告诉我这是不安全的。OWASP显然是想把JSON放入一个元素中,让javascript抓取它的内容,并对其进行解析

这是我能想到的最糟糕的一个,json_encode()仍然保证了它的安全。有人能想到一根绳子可以突破吗?

Source:
<script>//<![CDATA[
    window.data=<?php echo json_encode(
        "]]>'"'</script><script>alert(document.cookie)</script>"
        ,JSON_HEX_TAG|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_HEX_AMP
    );?>;
//]]></script>
Output:
<script>//<![CDATA[
    window.data="]]'u003E'u0022'u0027'u003C'/script'u003E'u003Cscript'u003Ealert(document.cookie)'u003C'/script'u003E";
/*]]></script>

最好的解决方案可能是确保您的服务器PHP是最新的。我喜欢使用5.5.21作为最新的完整版本,上面的任何版本都可以使用,但没有正确地"发布"。如果你担心任何可能的漏洞,可以阅读php.net的最新消息,并搜索他们提到的一些特定的CVE。这些都是对已修补漏洞的引用。