不安全的HTML

时间:2009-07-10 03:10:11

标签: html

我正在构建一个简单的基于Web的论坛应用程序。我想允许用户在他们的帖子中包含html,但是想要停止任何跨站点脚本。我目前的策略是不允许任何“脚本”标签,只允许任何标签上的“样式”和“href”属性,并且不允许“href”值以“javascript:”开头。有什么我想念的吗?

更新:我最终用html元素的“白名单”解决了这个问题。找到无效元素后,我会删除标记,但保留内部html。这解决了人们从MS Word文档复制和粘贴的问题。我也调查了antisamy.net,但遇到了一些关于如何处理跨度上的样式属性(即删除它们)的问题。如果我能解决这个问题,我可以切换到那个解决方案。

6 个答案:

答案 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();