我们希望允许“正常”href 链接到其他网页,但我们不想让任何人潜入客户端脚本。
在 HREF 和 onclick/onmouseover/etc 中搜索“javascript:”。活动够好吗?或者还有其他需要检查的东西吗?
我们希望允许“正常”href 链接到其他网页,但我们不想让任何人潜入客户端脚本。
在 HREF 和 onclick/onmouseover/etc 中搜索“javascript:”。活动够好吗?或者还有其他需要检查的东西吗?
听起来您允许用户提交带有标记的内容。因此,我建议看一些关于防止跨站点脚本的文章,这些文章所涵盖的内容不仅仅是防止 javascript 被插入到 HREF 标记中。以下是我发现可能有用的一个:
http://weblogs.java.net/blog/gmurray71/archive/2006/09/preventing_cros.html
您必须使用允许协议的白名单才能完全安全。如果你使用黑名单,迟早你会错过诸如“telnet://”或“shell:”之类的东西,或者一些你从未听说过的可利用的特定于浏览器的东西......
不,您需要检查的还有很多。
首先可以对 URL 进行编码(使用 HTML 实体或 URL 编码或两者的混合)。
其次,您需要检查格式错误的 HTML,浏览器可能会猜测并最终允许某些脚本进入。
第三,您需要检查基于 CSS 的脚本,例如 background: url(javascript:...) 或 width:expression(...)
我可能错过了更多 - 你需要小心!
接受用户输入时必须非常小心。如前所述,您需要创建一个白名单,但不仅仅是使用 href。例子:
<img src="nosuchimage.blahblah" onerror="alert('Haxored!!!');" />
或者
<a href="about:blank;" onclick="alert('Haxored again!!!');">click meh</a>
一种选择是完全禁止 html 并使用某些论坛使用的相同格式。只需更换
[url="xxx"]yyy[/url]
和
<a href="xxx">yyy</a>
这将使您解决鼠标悬停等问题。然后只需确保链接以白名单协议开始,并且其中没有引号("
或某些可能被 php 或浏览器解密的内容) )。
听起来您正在寻找 PHP 的伴随函数strip_tags
,即strip_attributes
. 不幸的是,它还没有写出来。(提示提示。)
但是,strip_tags
文档中有一个看起来很有趣的建议,在这里:
http://www.php.net/manual/en/function.strip-tags.php#85718
从理论上讲,这将从提交的链接中删除任何不是 href、class 或 ID 的内容;似乎您可能想进一步锁定它并只使用href。