CKEDITOR disallowedContent不生效,如何禁用script标签防XSS?
解决CKEditor允许HTML源码但禁用Script标签的问题
我明白你现在的困扰——想让用户用CKEditor的源码功能插入HTML,但又怕XSS攻击,结果配置了disallowedContent却没生效对吧?我之前也遇到过类似的情况,结合CKEditor 4.11.1的特性,给你几个可行的解决方案:
为什么原来的配置无效?
你之前的allowedContent设置是允许所有CKEditor DTD定义的元素,这个规则的优先级是高于disallowedContent的,相当于你先开了全权限,再去禁用script,自然会被覆盖掉。
正确的配置方式
方案1:精准过滤允许的元素
直接从DTD中排除script标签,再允许其他所有元素、属性、样式和类:
// config.js 中的配置 config.allowedContent = { elements: CKEDITOR.tools.object.keys(CKEDITOR.dtd).filter(element => element !== 'script'), attributes: true, styles: true, classes: true };
方案2:用字符串格式简化配置
CKEditor支持更简洁的字符串语法,直接允许所有内容并排除script:
// config.js 中的配置 config.allowedContent = '*(*);*{*};!script';
解释一下这段语法:
*(*):允许所有元素添加任意CSS类*{*}:允许所有元素使用任意属性和内联样式!script:明确排除script标签
额外注意事项
- 验证配置是否加载:Rails的asset pipeline有时候会缓存旧的config.js,修改后记得重启服务器,或者执行
rails assets:clean清理缓存。 - 后端必须二次过滤:前端过滤只是第一道防线,一定要在Rails后端对用户提交的HTML做XSS防护(比如用
sanitizegem),防止攻击者绕过前端限制直接提交恶意代码。 - 检查插件冲突:如果你的CKEditor装了额外插件,有些插件可能会修改
allowedContent配置,排查一下是否有插件覆盖了你的设置。
内容的提问来源于stack exchange,提问作者Gaeguri
相关产品推荐
相关产品推荐

