【问题标题】:Use preg_match to find if string contains script-tags使用 preg_match 查找字符串是否包含脚本标签
【发布时间】:2010-11-30 01:37:27
【问题描述】:

如何编写一个模式来使用 PHP 的 preg_match 函数来检查字符串是否包含脚本标签?

【问题讨论】:

  • “脚本标签”是指

标签: php regex scripting


【解决方案1】:

出于安全原因?基本上,你不能。以下是我过去在此过程中学到的一些东西:

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

MySpace 试图这样做,结果是“Samy 是我的英雄”蠕虫病毒导致服务中断了一天左右,此外还引发了许多其他安全灾难。

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

【讨论】:

    【解决方案2】:

    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
    }
    

    【讨论】:

    • 问题只是说“字符串”,并不一定意味着有文档结构...
    【解决方案3】:

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

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

    这样一来,攻击者就会有一个惊喜。

    【讨论】:

    • 我正在尝试检查是否包含脚本标签(真/假)。
    • 那么这可能有效:preg_match("//i", $string);
    • 或者干脆htmlspecialchars
    • 当 htmlspecialchars 可用时使用 str_replace 很可惜 :)
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多