从请求中接受一组预定义的无害HTML标记有多安全?
作为一名web开发人员,我学到的第一件事就是永远不要从客户端接受任何HTML。(可能只有在我对其进行HTML编码的情况下。)从请求中接受一组预定义的无害HTML标记有多安全?,html,tags,tinymce,security,Html,Tags,Tinymce,Security,作为一名web开发人员,我学到的第一件事就是永远不要从客户端接受任何HTML。(可能只有在我对其进行HTML编码的情况下。) 我使用所见即所得编辑器(TinyMCE)输出HTML。到目前为止,我只在管理页面上使用它,但现在我想在论坛上也使用它。它有一个BBCode模块,但似乎不完整。(有可能BBCode本身并不支持我想要的一切。) 所以,我的想法是: 我允许客户端直接发布一些HTML代码。然后,我检查代码是否健全(格式良好),并根据预定义的允许标记和样式集删除所有不允许的标记、属性和CSS规则。
我使用所见即所得编辑器(TinyMCE)输出HTML。到目前为止,我只在管理页面上使用它,但现在我想在论坛上也使用它。它有一个BBCode模块,但似乎不完整。(有可能BBCode本身并不支持我想要的一切。) 所以,我的想法是: 我允许客户端直接发布一些HTML代码。然后,我检查代码是否健全(格式良好),并根据预定义的允许标记和样式集删除所有不允许的标记、属性和CSS规则。
显然,我会允许我使用的TinyMCE功能的子集输出这些东西 我允许使用以下标签:
span
,sub
,sup
,a
,p
,ul
,ol
,li
,img
,strong
,em
,br
具有以下属性:style
(适用于所有内容)、href
和title
(适用于a
)、alt
和src
(适用于img
)
以及以下CSS规则:颜色
,字体
,字体大小
,字体重量
,字体样式
,文字装饰
这些内容涵盖了格式化所需的一切,而且(据我所知)不存在任何安全风险。基本上,良好形式的实施和任何布局风格的缺乏防止任何人损害网站的布局。不允许使用脚本标记等会阻止XSS。(一个例外:也许我应该允许图像的
宽度
/高度
在预定义的范围内。)
其他优点:这些东西可以让我不用编写/寻找BBCode Html转换器
你觉得怎么样?这样做安全吗 (如我所见,StackOverflow还允许在“关于我”字段中使用一些基本HTML,因此我认为我不是第一个实现这一点的人。) 编辑: 我发现这很容易解释如何做到这一点。
当然
这个问题本身与任何语言或技术都没有关系,但如果您想知道,我是用ASP.NET编写这个应用程序的。不清楚您正在使用或更喜欢哪种编程语言,但在Java中,这是一个非常灵活的HTML解析器API,其中包括一个基于HTML标记和属性的自定义白名单的HTML清理器(不幸的是,没有CSS规则,因为这完全超出了HTML解析器的范围)。这是一篇文章的相关摘录 问题 您希望允许不受信任的用户在您的网站上提供HTML输出(例如,作为评论提交)。您需要清除此HTML以避免(XSS)攻击 解决方案 将jsoup HTML与指定的配置一起使用
字符串不安全=
“”;
String safe=Jsoup.clean(不安全,Whitelist.basic());
//现在:
类本身包含几个预定义的白名单,这些白名单可能有用,如和
对于.NET,还有一个名为的Jsoup端口。对于PHP,请检查,它使用非常高级的可自定义设置(如允许/不允许的标记、属性、样式等)进行过滤,包括XSS和复杂样式(例如,显示:无
)保护
此外,TinyMCE确实做了一些过滤,但由于它是客户端的,所以无论如何你都不应该信任它。在你计划允许的标记中,
肯定需要额外注意,因为可能会出现javascript:
URL。当然,您需要禁止所有标记使用javascript事件处理程序。听起来是个好主意。我实际上在考虑为自己做这样的事情。我会看这个问题,看看人们怎么说。@puddingfox-谢谢!:)这组东西让它变得非常简单!谢谢你的链接!:)有趣的事实:这个端口是由以下因素触发的:)(检查注释)非常好:)我唯一错过的是清理CSS规则。(或者它在那里?我找不到。)小组基本上为我解决了这个问题,所以我接受了你的答案。你当然是对的。你的回答让我明白了NSoup中的AddProtocols
方法的用途。谢谢!:)如果javascript事件处理程序指的是onload
、onclick
等,则这些事件处理程序将被删除,因为它们不在允许的属性中。还有什么需要针对javascript处理的吗?还要注意Opera,因为它允许img标记中的javascript:
“src
属性……好吧,web开发的第一条规则是,永远不要只依赖客户端验证。:)感谢PHP链接,虽然我不使用PHP,但我有几个朋友使用。我可以向他们推荐。:)
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>