1

我有一个论坛风格的文本框,我想清理用户输入以阻止潜在的 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:_ __ _ __ _ __ _ _

4

3 回答 3

1

这正是 htmlentities 所做的:

http://codepad.viper-7.com/NDZMa3

它将转换(间隔以防止stackoverflow双重编码):
“&#amp;”

“&#amp;#amp;”

于 2011-10-22T21:35:36.000 回答
1

阻止 XSS 攻击所需要做的就是使用htmlspecialchars().

于 2011-10-22T21:36:23.413 回答
0

' '可以在您的正则表达式中更改空格,也可以通过在您创建的正则表达式的末尾\s添加,并且您不需要手动将您的字符转换为序列,它可以通过回调htmlentities来完成/icase insensitive

$clean = preg_replace_callback('/[^a-z0-9\s]/i', 'htmlentities', $userInput);
于 2011-10-22T21:34:43.833 回答