php - 使用preg_replace_callback和ord()清理用户输入?

时间:2011-10-22 21:27:44

标签: php sanitize preg-replace-callback input-sanitization

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

3 个答案:

答案 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}}