Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从请求中接受一组预定义的无害HTML标记有多安全?_Html_Tags_Tinymce_Security - Fatal编程技术网

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

从请求中接受一组预定义的无害HTML标记有多安全?,html,tags,tinymce,security,Html,Tags,Tinymce,Security,作为一名web开发人员,我学到的第一件事就是永远不要从客户端接受任何HTML。(可能只有在我对其进行HTML编码的情况下。) 我使用所见即所得编辑器(TinyMCE)输出HTML。到目前为止,我只在管理页面上使用它,但现在我想在论坛上也使用它。它有一个BBCode模块,但似乎不完整。(有可能BBCode本身并不支持我想要的一切。) 所以,我的想法是: 我允许客户端直接发布一些HTML代码。然后,我检查代码是否健全(格式良好),并根据预定义的允许标记和样式集删除所有不允许的标记、属性和CSS规则。

作为一名web开发人员,我学到的第一件事就是永远不要从客户端接受任何HTML。(可能只有在我对其进行HTML编码的情况下。)
我使用所见即所得编辑器(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>