<input type="hidden" value="<?PHP echo $data; ?>" />
我通常使用htmlentities()或htmlspecialchars()来执行此操作:
<input type="hidden" value="<?PHP echo htmlentities($data); ?>" />
但是,我最近遇到了一个问题,当我需要传递的数据是一个需要传递给JavaScript以更改页面位置的URL时,这会破坏我的应用程序:
<input id="foo" type="hidden" value="foo?bar=1&baz=2" /> <script> // ... window.location = document.getElementById('foo').value; // ... </script>
在这种情况下,foo是一个C程序,它不理解URL和段错误中的编码字符.
我可以简单地在JavaScript中获取值,并执行类似value.replace(‘& amp;’,’&’)的操作,但这看起来很糟糕,只适用于&符号.
所以,我的问题是:是否有更好的方法来对注入HTML属性的数据进行编码或解码?
我已经阅读了OWASP’s XSS Prevention Cheatsheet的所有内容,只要我小心引用我的属性就听起来像那么我需要编码的唯一字符是引用本身(“) – 在这种情况下,我可以使用像str_replace(‘“’,’& quot;’,…) – 但是,我不确定我是否正确理解它.
您提供的示例是正确的HTML:
<input id="foo" type="hidden" value="foo?bar=1&baz=2" />
value属性中的&符确实需要进行HTML编码,否则您的HTML无效.大多数浏览器都会用&正确解析它.在那里,但这并没有改变它无效的事实,你编码它是正确的.
你的问题不在于值的编码,这很好,但事实上你正在使用不能正确解码它的Javascript代码.
事实上,我对此感到惊讶,因为你的JS代码正在访问DOM,而DOM应该返回解码的值.
我写了一个JSfiddle来证明这一点:http://jsfiddle.net/qRd4Z/
运行它,它给我一个警报框,其中包含我所期望的解码值.将它更改为console.log也会给出我期望的结果.所以我不确定你为什么得到不同的结果?也许你正在使用不同的浏览器?可能值得指定您正在测试哪一个.或者你可能错误地对实体进行了双重编码?你能否证实情况并非如此?