我读到即使你剥离<script>
,你仍然容易受到XSS的攻击。
我发现一些有趣的答案是<scrip<script></script>t>alert(1337)</script>
你如何评估这种preg匹配?
echo preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $var);
此外,对于XSS攻击我还应该注意其他任何标签吗?
答案 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。