这个preg_match会成功阻止XSS吗?

时间:2011-08-26 23:29:10

标签: php xss preg-match

我读到即使你剥离<script>,你仍然容易受到XSS的攻击。

我发现一些有趣的答案是<scrip<script></script>t>alert(1337)</script>

你如何评估这种preg匹配?

echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $var);

此外,对于XSS攻击我还应该注意其他任何标签吗?

3 个答案:

答案 0 :(得分:2)

strip_tags足以摆脱XSS问题。但是,使用单个正则表达式不是,因为您需要清理 所有 HTML属性和标记并将其列入白名单。浏览器非常宽容,甚至允许格式错误的HTML不符合标准(也是IE错误)。这就是为什么使用正则表达式几乎是不可行的。 (尽管愚蠢的SO meme 可能可以将HTML与当代正则表达式语言相匹配,但需要付出太多努力。)

您将找到的所有正则表达式解决方案都是黑名单,这些都不是可靠的解决方案。他们将错过一半可能的漏洞http://ha.ckers.org/xss.html

答案 1 :(得分:1)

正则表达式不足以过滤危险的HTML。您必须正确解析HTML,并删除格式错误的标记以及非白名单标记。使用现有的库,例如HTML purifier; 太容易弄错了。

答案 2 :(得分:-2)

您可以尝试在while循环中删除脚本标记,直到找不到更多脚本标记:

while (preg_match("'[<]script.*?/script[>]'is",$data))
{
    $data = preg_replace("'[<]script.*?/script[>]'is","",$data);
}

您还应该检查一个元素属性,例如:onclick,onfocus等。它们还可以包含不需要的XSS。