从请求中接受预定义的一组无害HTML标记有多安全?

时间:2010-09-18 04:19:01

标签: html tags tinymce security

我作为Web开发人员学到的第一件事就是永远不要接受来自客户端的任何HTML。 (也许只有我对它进行HTML编码。)
我使用输出HTML的WYSIWYG编辑器(TinyMCE)。到目前为止,我只在管理页面上使用它,但现在我也想在论坛上使用它。它有一个BBCode模块,但似乎不完整。 (BBCode本身可能不支持我想要的所有内容。)

所以,这是我的想法:

我允许客户端直接发布一些HTML代码。然后,我检查代码的完整性(格式良好)并删除所有基于预定义的标记和样式集不允许的标记,属性和CSS规则。
显然我会允许我使用的TinyMCE功能子集输出的东西。

我会允许以下标记:
spansubsupapulolli,{{ 1}},imgstrongem

具有以下属性:
br(适用于所有内容),stylehref(适用于title),aalt(适用于src)< / p>

以下CSS规则:
imgcolorfontfont-sizefont-weightfont-style

这些涵盖了格式化所需的一切,并且(据我所知)不会带来任何安全风险。基本上,良好的执行和缺乏任何布局样式可以防止任何人伤害网站的布局。不允许使用脚本标记等来阻止XSS (一个例外:也许我应该在预定义的图像范围内允许text-decoration / width。)

其他优势:这些东西可以让我免于编写/寻找BBCode-Html转换器的需要。

你怎么看? 这是安全的事吗?

(正如我所见,StackOverflow还允许在“关于我”字段中使用一些基本的HTML,所以我认为我不是第一个实现它的人。)

修改

我发现this answer解释了如何轻松地解决这个问题 当然,noone should think about using regex for this

问题本身与任何语言或技术无关,但如果您想知道,我会在ASP.NET中编写此应用程序。

3 个答案:

答案 0 :(得分:5)

目前还不清楚您正在使用或正在使用哪种编程语言,但在Java中有Jsoup,这是一个非常漂亮的HTML解析器API,其中包含基于可自定义的HTML标签白名单的HTML清理器和属性(遗憾的是没有CSS规则,因为这完全超出了HTML解析器的范围)。以下是its site的相关摘录。

  

Sanitize untrusted HTML

     

问题

     

您希望允许不受信任的用户为您网站上的输出提供HTML(例如,作为评论提交)。您需要清除此HTML以避免cross-site scripting(XSS)攻击。

     

解决方案

     

将jsoup HTML CleanerWhitelist指定的配置一起使用。

String unsafe = 
      "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
      // now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

Whitelist类本身包含几个可能有用的预定义白名单,例如Whitelist#basic()Whitelist#relaxed()

对于.NET,顺便提一下名为NSoup

的Jsoup端口

答案 1 :(得分:2)

对于PHP,请查看HTML Purifier,它会过滤掉非常高级的可自定义设置(例如允许/禁止标记,属性,样式等),包括XSS和棘手的样式(例如display: none)保护

此外,TinyMCE确实进行了一些过滤,但由于它是客户端,所以无论如何都不应该信任它。

答案 2 :(得分:1)

在您计划允许的代码中,由于<a>网址的可能性,javascript:肯定需要额外关注。当然,您需要禁止所有标签中的javascript事件处理程序。