除了<script>标签之外,我应该删除什么以确保用户输入的HTML是安全的?</script>

时间:2009-01-23 22:00:14

标签: html security typography

我有一个应用程序重新处理HTML,以便做出漂亮的排版。现在,我想把它放在网上让用户输入他们的文字。所以这就是问题:我非常确定我要删除SCRIPT标记,以及关闭标记,例如&lt; / form&gt;。但是我应该删除什么以使其完全安全?

7 个答案:

答案 0 :(得分:17)

好的主啊,你被搞砸了。 拿一个look at this

基本上,你要删除的东西太多了。此外,有些东西是有效的,但可能会以恶意方式使用。如果用户想要在脚注上设置较小的字体大小,该怎么办?你是否关心是否适用于整个页面?设置颜色怎么样?现在,您页面上的所有单词都是白色背景上的白色。

我会再次研究需求阶段。

  • 是否有类似降价的替代方案?
  • 您是否可以限制对最终内容的访问,从而降低曝光风险? (意思是,你可以设置它,这样用户只能拧自己,不能伤害别人吗?)

答案 1 :(得分:5)

您应该使用白名单而不是黑名单方法:确定需要哪些功能,而不是尝试阻止任何不需要的功能。

列出符合您应用的所需印刷功能。请注意,可能没有一个通用的列表:它取决于网站的性质(编程问题?青少年的博客?)和文本框的性质(你是留下评论或撰写文章?)。您可以在开源CMS中查看一些优秀且有用的文本框。

现在您必须在自己的标记语言和HTML之间进行选择。我会选择一种标记语言。优点是更好的安全性,缺点是无法添加意想不到的互联网内容,如YouTube视频。防止用户愤怒的好主意是添加“HTML to my-site”功能,将相应的HTML标记转换为标记语言,并删除所有其他标记。

HTML的优点是与标准的一致性,对新内容类型的可扩展性和简单性。最大的问题是代码注入安全问题。如果您选择HTML标记,请尝试采用一些工作系统来过滤HTML(我认为Drupal在这种情况下做得非常好。)

答案 2 :(得分:3)

而不是将某些标记列入黑名单,白名单总是更安全。查看stackoverflow的作用:What HTML tags are allowed on Stack Overflow?

在标记中嵌入脚本的方法太多了。 javascript:网址(当然是编码的)? CSS行为?我认为你不想去那里。

答案 3 :(得分:1)

有很多方法可以让代码潜入其中 - 特别注意像&lt; img src =“http://nasty/exploit/here.php”&gt;这样的情况。可以提供&lt; script&gt;标记给您的客户,我见过&lt; script&gt;之前在网站上被阻止,但标签正确通过,导致30-40个密码被盗。

答案 4 :(得分:1)

  • <iframe>
  • <style>
  • <form>
  • <object>
  • <embed>
  • <bgsound>

我能想到的是什么。但可以肯定的是,使用白名单 - 例如<a><img>†(大多数)无害的。

†只要确保过滤掉任何javascript:... / on*=... ......正如您所看到的,它会变得相当复杂。

答案 5 :(得分:0)

我不同意person-b。您忘记了javascript属性,如下所示:

<img src="xyz.jpg" onload="javascript:alert('evil');"/>

在此问题上,攻击者总是比你更有创意。绝对采用白名单方式。

答案 6 :(得分:0)

MediaWiki比这个网站更宽松;是的,它接受设置颜色(白色甚至是白色),边距,缩进和绝对定位(包括那些将文本完全置于屏幕之外),null,剪辑和“display; none”,字体大小(即使它们是可笑的小或过大)和字体名称(即使这是一个不能成功呈现文本的传统非Unicode符号字体名称),而不是这个几乎可以删除所有内容的网站。

但MediaWiki成功地从CSS中删除了危险的活动脚本(即行为,onEvent处理程序,活动过滤器或javascript链接目标),而没有完全过滤样式属性,并禁止其他一些活动元素,如object,embed, BGSOUND。

两者都禁止使用marquees(不是标准的HTML,并且不必要地分散注意力)。

但MediaWiki网站由许多用户巡逻,并且有政策规则禁止那些反复滥用的用户。

它支持动画iamges,并提供对活动扩展的支持,例如呈现TeX数学表达式,或已批准的其他活动扩展(如时间轴),或创建或自定义一些表单。