使用preg_match查找string是否包含script-tags

时间:2009-09-21 12:18:25

标签: php regex scripting

如何编写用于PHP preg_match函数的模式来检查包含脚本标记的字符串是什么?

3 个答案:

答案 0 :(得分:3)

出于安全考虑?基本上,你不能。以下是我在过去学到的一些事情:

  • <a href="javascript:something">...</a>
  • <p onmouseover="something">
  • 在不同的浏览器中有许多相当于javascript:的网址方案,例如jscript:mocha:livescript:。大多数都没有记录。
  • 旧版本的Netscape将某些字节(0x94和0x95,我认为?)视为等同于<>。希望在现代浏览器中没有这样的东西。
  • 的VBScript。

MySpace尝试这样做,结果就是“Samy是我的英雄”蠕虫,它将这项服务推迟了一天左右,其中包括许多其他安全灾难。

因此,如果您想接受仅包含文本和格式的HTML的有限子集,则必须白名单,而不是黑名单。您必须将标签,属性列入白名单,并且如果您想允许链接,URL方案。有一些现有的库可以做到这一点,但我不知道在PHP中推荐哪些库。

答案 1 :(得分:1)

Don't use regular expressions for processing xml/html.您应该使用DOM classes of PHP,它应该比您找到的任何正则表达式更可靠:

$document = new DOMDocument();
$document->loadHtml($html);
$xpath = new DOMXPath($document);
if ($xpath->query('//script')->length > 0) {
    // document contains script tags
}

答案 2 :(得分:0)

你想逃脱他们吗?如果是这样尝试以下(未经测试)

$string=str_replace(array("&", "<", ">"), array("&amp;", "&lt;", "&gt;"), $string);

通过这种方式,一个惊喜将是等待你的攻击者。