我有一个论坛风格的文本框,我想清理用户输入以阻止潜在的 xss 和代码插入。我见过使用 htmlentities,但后来其他人说 &,#,%,: 字符也需要编码,而且我看起来越多,出现的潜在危险字符就越多。白名单是有问题的,因为除了 ^a-zA-z0-9 之外还有许多有效的文本选项。我想出了这个代码。它能阻止攻击并确保安全吗?有什么理由不使用它,还是有更好的方法?
function replaceHTML ($match) {
return "&#" . ord ($match[0]) . ";";
}
$clean = preg_replace_callback ( "/[^ a-zA-Z0-9]/", "replaceHTML", $userInput );
编辑:_ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ____ 我当然可能是错的,但我的理解是 htmlentities 仅替换 & < > " (如果 ENT_QUOTES 已打开,则为 ' )。这可能足以阻止大多数攻击(坦率地说,对于我的低流量站点来说可能绰绰有余)。然而,在我对细节的痴迷关注中,我进一步挖掘。我警告过一本书还要编码 # 和 % 以“关闭十六进制攻击”。我发现有两个网站警告不要允许:和 --。这一切都相当混乱对我来说,并引导我探索转换所有非字母数字字符。如果 htmlentities 已经这样做了,那就太好了,但似乎没有。这是我在 Firefox 中单击查看源代码后复制的代码的结果。
原始(要测试的随机字符): 5: gjla#''*&$!jl:4
preg_replace_callback: <b>5:</b>gjla<hi>#''*&$!jl:4
htmlentities(带 ENT_QUOTES):<b>5:</b>gjla<hi>#''*&$!jl:4
htmlentities 似乎没有对其他字符进行编码,例如:对不起文字墙。这只是我偏执吗?
编辑#2:_ __ _ __ _ __ _ _