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