作为 Web 开发人员,我学到的第一件事就是永远不要接受来自客户端的任何 HTML。 (也许只有当我对它进行 HTML 编码时。)
我使用输出 HTML 的所见即所得编辑器 (TinyMCE)。到目前为止,我只在管理页面上使用过它,但现在我也想在论坛上使用它。它有一个 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。
(一个异常(exception):也许我应该在图像的预定义范围内允许 width
/height
。)
其他优势:这些东西可以让我免于编写/寻找 BBCode-Html 转换器的需要。
你怎么看?
这是一件安全的事情吗?
(据我所知,StackOverflow 还允许在“关于我”字段中使用一些基本的 HTML,因此我认为我不是第一个实现此功能的人。)
编辑:
我找到了 this answer这解释了如何相当容易地做到这一点。
当然,noone should think about using regex for this .
问题本身与任何语言或技术无关,但如果您想知道,我是用 ASP.NET 编写的这个应用程序。
最佳答案
不清楚您正在使用或喜欢哪种编程语言,但在 Java 中有 Jsoup ,这是一个非常巧妙的 HTML 解析器 API,其中包含一个基于可自定义的 HTML 标签和属性白名单的 HTML 清理器(不幸的是,没有 CSS 规则,因为这完全超出了 HTML 解析器的范围)。这是来自 its site 的相关摘录.
Sanitize untrusted HTML
Problem
You want to allow untrusted users to supply HTML for output on your website (e.g. as comment submission). You need to clean this HTML to avoid cross-site scripting (XSS) attacks.
Solution
Use the jsoup HTML
Cleaner
with a configuration specified by aWhitelist
.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 端口
关于html - 从请求中接受一组预定义的无害 HTML 标记有多安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740366/