我有一个论坛风格的文本框,我想清理用户输入以阻止潜在的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# '' *&安培; $ J-L:!4
preg_replace_callback: &LT b取代; 5:其中/ B个gjla<喜># '' *&安培; $ J-L:!4
htmlentities(带ENT_QUOTES): &LT b取代; 5:其中/ B个gjla<喜># '' *&安培; $ J-L:!4
htmlentities似乎没有编码其他字符,如: 抱歉,文字墙。这只是我的偏执狂吗?
编辑#2: _ __ _ __ _ __ _ _
答案 0 :(得分:1)
这正是htmlentities已经做到的:
http://codepad.viper-7.com/NDZMa3
它将转换(间隔以防止stackoverflow双重编码):
“&#amp;”
到
“&#amp;#amp;”
答案 1 :(得分:1)
要阻止XSS攻击,您只需使用htmlspecialchars()
。
答案 2 :(得分:0)
空格' '
可以在正则表达式中更改为\s
,也可以在正则表达式/i
的末尾添加case insensitive
,而不是$clean = preg_replace_callback('/[^a-z0-9\s]/i', 'htmlentities', $userInput);
需要手动将您的字符转换为序列,可以使用htmlentities
{{1}}