我很久以前就读过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。这些都是对已修补漏洞的引用。