作为一名 Web 开发人员,我学到的第一件事就是永远不要接受来自客户端的任何 HTML。 (也许只有我对它进行 HTML 编码。)
我使用输出 HTML 的所见即所得编辑器 (TinyMCE)。到目前为止,我只在管理页面上使用它,但现在我也想在论坛上使用它。它有一个 BBCode 模块,但这似乎不完整。 (BBCode 本身可能不支持我想要的一切。)
所以,这是我的想法:
我允许客户端直接 POST 一些 HTML 代码。然后,我检查代码是否健全(格式良好)并根据预定义的允许标签和样式集删除所有不允许的标签、属性和 CSS 规则。
显然,我会允许我使用的 TinyMCE 功能子集可以输出的内容。
我允许使用以下标签:
span
, sub
, sup
, a
, p
, ul
, ol
, li
, img
, strong
, em
, br
具有以下属性:
style
(对于一切),href
and title
(for a
), alt
and src
(for img
)
以及以下 CSS 规则:
color
, font
, font-size
, font-weight
, font-style
, text-decoration
这些涵盖了我格式化所需的一切,并且(据我所知)不会带来任何安全风险。基本上,强制执行格式良好和缺乏任何布局样式可以防止任何人损害网站的布局。禁止脚本标签等可以防止 XSS。
(一个例外:也许我应该允许width
/height
在图像的预定义范围内。)
其他优点:这些东西将使我无需编写/寻找 BBCode-Html 转换器。
你怎么认为?
这是一件安全的事情吗?
(正如我所见,StackOverflow 还允许在“关于我”字段中使用一些基本的 HTML,因此我认为我不是第一个实现此功能的人。)
EDIT:
I found 这个答案 https://stackoverflow.com/questions/3452322/method-to-strip-html-tags-not-in-a-safe-list这解释了如何相当容易地做到这一点。
而且当然,没有人应该考虑为此使用正则表达式 https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454.
这个问题本身与任何语言或技术无关,但如果您想知道,我用 ASP.NET 编写了这个应用程序。