我正在构建一个简单的基于Web的论坛应用程序。我想允许用户在他们的帖子中包含html,但是想要停止任何跨站点脚本。我目前的策略是不允许任何“脚本”标签,只允许任何标签上的“样式”和“href”属性,并且不允许“href”值以“javascript:”开头。有什么我想念的吗?
更新:我最终用html元素的“白名单”解决了这个问题。找到无效元素后,我会删除标记,但保留内部html。这解决了人们从MS Word文档复制和粘贴的问题。我也调查了antisamy.net,但遇到了一些关于如何处理跨度上的样式属性(即删除它们)的问题。如果我能解决这个问题,我可以切换到那个解决方案。
答案 0 :(得分:11)
您应该关注the approach of StackOverflow和其他网站,并使用whitelist标记和属性。听起来你正在使用白名单来表示属性,这很好。你也应该为元素这样做,这样人们就不会像形式,iframe,meta,frameset等那样偷偷摸摸。(你们没有提到过)。
答案 1 :(得分:7)
确保你取出iframe,object,embed。实际上有很多。
或许更好的是允许Markdown代替?
答案 2 :(得分:2)
我会考虑删除所有onclick
或真正的on[anything]
标记。建立一个允许的列表而不是黑名单可能更容易。
答案 3 :(得分:1)
白名单是最安全的解决方案。
您在评论中提到过从Word粘贴。不要指望知道所有Word的HTML元素,它经常会返回像<o:p>
这样的段落(通常只能在Internet Explorer中按预期工作)。您可能能够找到大部分内容,但可能很容易出现一些危险的标签,可能是<o:script>
标签或其他内容。
顺便说一下,确实没有那么多HTML标签。 W3.org index of elements会对您有所帮助。
答案 4 :(得分:0)
你怎么说:
style='background-image:url("my-site-which-inserts-something-that-will make-you-look-bad")'
并没有完全连接:确保如果您允许人们将文件上传到网站(images / txt / whatever),他们将从不同的域名提供服务。
答案 5 :(得分:-1)
如果您使用的是PHP,那么您可以使用strip_tags
删除除了要允许的元素之外的所有内容strip_tags(string,allow)
这将输出:
<?php
echo strip_tags("Hello <b><i>world!</i></b>","<b>");
?>
您好世界!
你应该使用这种方法:
mysql_real_escape_string();
htmlentities();