为 HTML 属性上下文编码不受信任的数据的正确方法是什么?例如:
<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('&', '&')
,但这看起来很笨拙,并且仅适用于 & 符号。
所以,我的问题是:有没有更好的方法来编码或解码注入 HTML 属性的数据?
我已经阅读了所有OWASP 的 XSS 预防备忘单,在我看来,只要我小心地引用我的属性,那么我需要编码的唯一字符就是引用本身 ( "
) - 在这种情况下,我可以使用类似的东西str_replace('"', '"', ...)
- 但是,我不确定我是否正确理解它。