3

我们希望允许“正常”href 链接到其他网页,但我们不想让任何人潜入客户端脚本。

在 HREF 和 onclick/onmouseover/etc 中搜索“javascript:”。活动够好吗?或者还有其他需要检查的东西吗?

4

6 回答 6

4

听起来您允许用户提交带有标记的内容。因此,我建议看一些关于防止跨站点脚本的文章,这些文章所涵盖的内容不仅仅是防止 javascript 被插入到 HREF 标记中。以下是我发现可能有用的一个:

http://weblogs.java.net/blog/gmurray71/archive/2006/09/preventing_cros.html

于 2008-12-01T21:30:52.600 回答
3

您必须使用允许协议的白名单才能完全安全。如果你使用黑名单,迟早你会错过诸如“telnet://”或“shell:”之类的东西,或者一些你从未听说过的可利用的特定于浏览器的东西......

于 2008-12-01T21:26:55.727 回答
2

不,您需要检查的还有很多。

首先可以对 URL 进行编码(使用 HTML 实体或 URL 编码或两者的混合)。

其次,您需要检查格式错误的 HTML,浏览器可能会猜测并最终允许某些脚本进入。

第三,您需要检查基于 CSS 的脚本,例如 background: url(javascript:...) 或 width:expression(...)

我可能错过了更多 - 你需要小心!

于 2008-12-01T21:27:33.887 回答
0

接受用户输入时必须非常小心。如前所述,您需要创建一个白名单,但不仅仅是使用 href。例子:

<img src="nosuchimage.blahblah" onerror="alert('Haxored!!!');" />

或者

<a href="about:blank;" onclick="alert('Haxored again!!!');">click meh</a>
于 2008-12-01T21:40:54.967 回答
0

一种选择是完全禁止 html 并使用某些论坛使用的相同格式。只需更换

[url="xxx"]yyy[/url]

<a href="xxx">yyy</a>

这将使您解决鼠标悬停等问题。然后只需确保链接以白名单协议开始,并且其中没有引号(&quot;或某些可能被 php 或浏览器解密的内容) )。

于 2008-12-01T22:03:56.510 回答
0

听起来您正在寻找 PHP 的伴随函数strip_tags,即strip_attributes. 不幸的是,它还没有写出来。(提示提示。)

但是,strip_tags文档中有一个看起来很有趣的建议,在这里:

http://www.php.net/manual/en/function.strip-tags.php#85718

从理论上讲,这将从提交的链接中删除任何不是 href、class 或 ID 的内容;似乎您可能想进一步锁定它并只使用href。

于 2008-12-02T00:21:23.240 回答