Node Express全局使用xss-clean时如何跳过特定POST请求保存富文本
解决方案
更推荐选择方案1进行实现,后端可控性更高,安全风险更低
方案1:后端调整xss-clean规则
1.1 跳过指定接口的全局XSS清理
你可以替换原来的全局xss-clean注册逻辑,增加路由判断,指定富文本相关的提交接口不执行XSS清理,其余接口保留防护能力,示例代码如下:
const xss = require('xss-clean'); // 替换原有的 app.use(xss()) app.use((req, res, next) => { // 配置不需要执行XSS清理的接口路径,可根据你的业务调整 const excludePaths = ['/api/article/publish', '/api/comment/save']; // 如果需要匹配带动态参数的路由,可把excludePaths项改为正则,用正则test判断 if (excludePaths.includes(req.path)) { return next(); } // 其余接口正常执行XSS清理 xss()(req, res, next); });
1.2 仅跳过指定字段的XSS清理
如果你只想放过请求中特定的富文本字段,其余字段还是保留XSS清理,可以采用先暂存字段、清理完成后还原的方式实现,示例代码如下:
app.use((req, res, next) => { // 暂存需要跳过的富文本字段,可根据你的业务字段名调整 let savedRichContent = req.body?.content ? req.body.content : null; // 执行全局XSS清理 xss()(req, res, () => { // 清理完成后还原富文本字段 if (savedRichContent) { req.body.content = savedRichContent; } next(); }); });
重要提示:以上两种方式跳过XSS清理的富文本内容,必须单独做安全过滤,可使用
xss库配置允许的标签和属性,仅放行tiptap等编辑器产出的安全标签(如<p>、<strong>、<ul>等),过滤掉<script>、<iframe>、onclick等风险内容,避免恶意脚本注入。
方案2:前端反转义已转义的内容
如果不想修改后端逻辑,可以在前端拿到被转义的富文本后做反转义处理,再交给富文本渲染组件,示例代码如下:
// 反转义工具函数 function decodeHtml(str) { if (!str) return ''; return str.replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, "'"); } // 使用示例:接口请求拿到数据后先反转义 const renderContent = decodeHtml(apiResponse.data.articleContent);
注意:Vue中需要用
v-html指令渲染富文本内容,普通插值语法会直接显示HTML标签。渲染前请确认富文本来源可信,否则会存在XSS攻击风险。
内容的提问来源于stack exchange,提问作者connorcode
相关产品推荐
相关产品推荐

