我一直在更新会员页面系统,其中一项要求是允许在某些字段上使用粗体、下划线、斜体、字体颜色和链接,但不允许字体大小或样式 - 所有这些都使用 WYSIWYG 编辑器。这最初是使用 textarea 和一些最小的 HTML 过滤完成的,即<script>
使用preg_replace()
. 我知道这很疯狂而且绝对不安全。
我的第一个修改是使用 TinyMCE 并禁止在 TinyMCE 中使用某些标签,唯一的问题是显然我不能依赖 TinyMCE 作为任何类型的验证器,并且我发现保护 HTML 输入免受 XSS 是一个绝对雷区。我花了最后一个小时左右阅读某些实践,似乎几乎不可能允许某些 HTML 标记/属性而不会弄乱当前配置文件并进一步允许其他自定义,例如字体大小和内联样式的东西。例如,我需要允许带有 span 标签的字体颜色,但允许 style 属性也将允许任何 CSS 片段。
我现在已经想到了将 BBCode 与所见即所得编辑器一起使用的想法,因为这将使我们能够安全地应用于htmlspecialchars()
输出,然后完全控制使用 BBCode 解析器为 [b]、[u] 生成的任何 HTML, [i] 和 [color] 带有nl2br()
换行符的标签。
唯一的问题是我必须编写一些代码来将当前的 HTML 设置转换为 BBCode。
我的主要疑问是上述步骤与 BBCode 是否足以防止 XSS 攻击?或者我可以使用更优雅/更明显的 HTML 安全方法吗?