【发布时间】:2010-11-30 01:37:27
【问题描述】:
如何编写一个模式来使用 PHP 的 preg_match 函数来检查字符串是否包含脚本标签?
【问题讨论】:
-
“脚本标签”是指
如何编写一个模式来使用 PHP 的 preg_match 函数来检查字符串是否包含脚本标签?
【问题讨论】:
出于安全原因?基本上,你不能。以下是我过去在此过程中学到的一些东西:
<a href="javascript:something">...</a><p onmouseover="something">javascript:,例如 jscript:、mocha: 和 livescript:。大多数都没有记录。<>。希望现代浏览器中没有这样的东西。MySpace 试图这样做,结果是“Samy 是我的英雄”蠕虫病毒导致服务中断了一天左右,此外还引发了许多其他安全灾难。
因此,如果您想接受仅包含文本和格式的有限 HTML 子集,则必须白名单,而不是黑名单。您必须将标签、属性以及是否允许链接、URL 方案列入白名单。有一些现有的库可以做到这一点,但我不知道在 PHP 中推荐哪些库。
【讨论】:
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
}
【讨论】:
你想逃避他们吗?如果是这样,请尝试以下(未测试)
$string=str_replace(array("&", "<", ">"), array("&", "<", ">"), $string);
这样一来,攻击者就会有一个惊喜。
【讨论】:
htmlspecialchars。