xss-clean中间件仅部分路由生效,求排查问题原因
解决xss-clean中间件仅对/ratings路由生效、/upload路由无效的问题
嘿,我一眼就揪出问题的核心了——大概率是你的upload路由模块里重复挂载了body解析中间件,把xss-clean的清理效果给覆盖了!给你一步步拆解分析:
先看你的全局代码顺序(这块其实没问题)
你当前的全局中间件挂载逻辑是正确的:
// 第一步:解析请求体 app.use(express.json({limit: '10kb'})); app.use(express.urlencoded({extended:false})); // 第二步:用xss-clean清理已解析的请求数据 app.use(xss()); // 第三步:挂载限流和路由 app.use('/upload/', upload_rate_limit); app.use('/upload', upload); app.use('/rating', rating);
问题根源:路由模块内重复的body解析
xss-clean的工作逻辑是对已经被解析好的req.body/req.query/req.params做转义清理,但如果你的./upload路由模块里,自己又加了express.json()或者express.urlencoded(),比如:
// upload.js 里的错误写法示例 const router = express.Router(); // 这里重复挂载body解析,会重新读取原始请求体,覆盖xss-clean的处理结果 router.use(express.json()); router.post('/', (req, res) => { // 此时的req.body是未经过xss-clean的原始内容 }); module.exports = router;
这种情况下,全局的xss-clean已经处理过请求体,但路由里的body解析会重新读取原始请求数据,等于把之前的清理效果彻底抹掉了。而你的/rating路由模块里没有重复挂载这些中间件,所以xss-clean能正常生效。
解决方案
删除路由模块内的重复body解析
直接把upload.js里的router.use(express.json())或者express.urlencoded()删掉就行——你已经在全局挂载过这些中间件了,所有路由都会共享,完全不需要在每个路由里重复添加。验证清理效果
可以在upload路由的处理函数里打印req.body测试:router.post('/', (req, res) => { // 比如传入<script>alert('xss')</script>,正常应该被转义成<script>alert('xss')</script> console.log(req.body); // ... 你的业务逻辑 });如果打印出来的内容被正确转义,说明问题已经解决。
可选:针对性挂载xss-clean(如果不想全局启用)
要是你只想给特定路由用xss-clean,也可以把全局的app.use(xss())改成:app.use('/upload', xss()); app.use('/rating', xss());不过这种方式不如全局挂载简洁,除非你有特殊的路由隔离需求。
内容的提问来源于stack exchange,提问作者Samir Shrestha
相关产品推荐
相关产品推荐

