在显示用户生成/提交的信息时,转义其他特殊字符但不修改与号是否存在任何安全风险?我想让我的用户自由输入 html 实体、十六进制和十进制特殊字符,而不给我的 sanitizer 程序增加不必要的复杂性。
最佳答案
这完全取决于数据放入的上下文。
在 HTML 中,表示普通 &
的主要原因通过字符引用是 avoid ambiguity作为 &
也是这种字符引用的开始。这种歧义的一个流行示例是普通的 &
作为 HTML 属性中 URL 参数的一部分,如下所示:
<a href="/?lang=en§=foobar">
这里是 &
未使用相应的字符引用进行适当编码,因此解析器将其视为字符引用的开头。因为 sect 是一个 known entity in HTML , 代表节字符 §
, 这个属性值实际上被解释为 /?lang=en§=foobar
.
所以留下一个平原&
因为它不像 HTML 中的其他特殊字符那样容易造成实际威胁,因为它们可以更改数据放入的上下文:
- 标签定界符
<
和>
可以开始或结束标签声明, - 属性值分隔符
"
和'
可以开始或结束属性值声明。
为了安全起见,你应该使用 htmlspecialchars
double_encode 参数设置为 false
避免对已经存在的字符引用进行双重编码:
var_dump(htmlspecialchars('<"&\'>', ENT_QUOTES, 'UTF-8', false) === '<"&'>'); // bool(true)
关于html - 在用户提交的数据中不转义 & 符号是否存在安全风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11027167/