如何让我的用户插入HTML代码,没有风险? (不仅是技术风险)

时间:2009-03-31 15:26:32

标签: php javascript html security xss

我开发了一个Web应用程序,允许我的用户在LAMP环境中动态管理网站的某些方面(是的,某种cms)(debian,apache,php,mysql)

嗯,例如,他们在我的服务器上的私人区域创建新闻,然后通过cURL请求(或通过ajax)在他们的网站上发布。

这个消息是用WYSIWYG编辑器创建的(fck at moment,可能是未来的tinyMCE)。

所以,我不能禁止html标签,但我怎么能安全? 我必须删除什么样的标签(javascripts?)? 这意味着服务器安全..但如何“合法”安全? 如果用户使用我的应用程序制作xss,我可以遇到一些法律问题吗?

10 个答案:

答案 0 :(得分:15)

如果您使用的是php,那么使用HTMLPurifier就是一个很好的解决方案。它有很多选项可以过滤掉不好的东西,并且作为副作用,可以保证形成良好的html输出。我用它来查看可能是恶劣环境的垃圾邮件。

答案 1 :(得分:11)

你要删除的内容并不重要,有人会总能找到解决问题的方法。作为参考,请看一下这个XSS Cheat Sheet

例如,您将如何删除此有效的XSS攻击:

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

您最好的选择是只允许可接受标签的子集并删除其他任何内容。这种做法被称为White Listing,是防止XSS的最佳方法(除了禁止HTML。)

在测试中也使用备忘单;尽可能多地在您的网站上开火并尝试找到一些方法来执行XSS。

答案 2 :(得分:6)

这里的一般最佳策略是将您认为安全的特定标签和属性列入白名单,并转义/删除其他所有内容。例如,明智的白名单可能是<p>, <ul>, <ol>, <li>, <strong>, <em>, <pre>, <code>, <blockquote>, <cite>。或者,考虑人性化的标记,例如 Textile Markdown ,可以轻松转换为安全的HTML。

答案 3 :(得分:2)

您应该拥有一些可以转换为HTML的其他标记,而不是允许使用HTML。试图从用户输入中删除流氓HTML几乎是不可能的,例如

<scr<script>ipt etc="...">

从此处删除

<script etc="...">

答案 4 :(得分:2)

对于stackoverflow使用的白名单方法的C#示例,您可以查看this page

答案 5 :(得分:1)

Kohana's security helper非常好。根据我的记忆,它来自一个不同的项目。

但是我测试了

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

LFSR Consulting's answer开始,它正确转义。

答案 6 :(得分:0)

如果删除标签太困难,您可以拒绝整个html数据,直到用户输入有效的数据。 如果它包含以下标记,我会拒绝html:

框架,框架,iframe中,脚本,对象,嵌入,小应用程序。

您要禁用的标签还有:head(和子标签),body,html,因为您想自己提供这些标签,并且您不希望用户操作您的元数据。

但一般来说,允许用户提供自己的HTML代码总会带来一些安全问题。

答案 7 :(得分:0)

你可能想要考虑,而不是允许HTML,实现像BBCode或Markdown这样的HTML。

答案 8 :(得分:0)

我使用这个php strip_tags函数,因为我希望用户可以安全发布,我允许只有几个标签可以在帖子中使用这种方式没有人可以通过脚本注入破解你的网站所以我认为strip_tags是最好的选择

Clich here for code for this php function

答案 9 :(得分:-1)

code that I should have just copy/pasted instead of screenshotting

在php中你可以使用它是非常好的功能

$string = strip_tags($_POST['comment'], "<b>");