如何在Express.js中过滤请求JSON内未指定的多余属性
Express 过滤请求体多余字段的实现方案
下面分两种常用场景给出可直接落地的实现方式:
方案1:无额外依赖的通用中间件
自己封装可复用的字段过滤中间件,不需要引入其他库,灵活性最高:
首先封装中间件生成函数:
/** * 生成过滤req.body的中间件 * @param {Array<string>} allowedFields 允许保留的字段白名单 */ const filterReqBody = (allowedFields) => { return (req, res, next) => { const filtered = {} allowedFields.forEach(field => { if (req.body[field] !== undefined) { filtered[field] = req.body[field] } }) // 直接替换原req.body,后续路由处理逻辑无需额外修改 req.body = filtered next() } }
路由中使用示例:
// 仅允许创建文章接口传入title、user、body三个字段 app.post('/posts', filterReqBody(['title', 'user', 'body']), async (req, res) => { // 此处req.body已自动过滤所有不在白名单内的字段,包括_id等敏感字段 const post = await PostModel.create(req.body) res.json(post) })
方案2:基于express-validator的实现
如果你已经在使用express-validator做参数校验,可以直接用它内置的matchedData方法,自动过滤未定义校验规则的字段:
const { body, validationResult, matchedData } = require('express-validator') app.post('/posts', // 定义允许的字段和对应校验规则 body('title').isString().notEmpty(), body('user').isString().notEmpty(), body('body').isString(), async (req, res) => { // 先处理参数校验错误 const errors = validationResult(req) if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }) } // 直接获取校验通过且在规则内的字段,多余字段自动剔除 const cleanBody = matchedData(req) const post = await PostModel.create(cleanBody) res.json(post) } )
补充建议
建议在数据库层面也做兜底防护,比如使用MongoDB + Mongoose的场景,可以将_id等内部字段设置为immutable: true,就算传入了对应字段也不会被写入数据库,避免接口层漏加过滤规则导致安全问题。
内容的提问来源于stack exchange,提问作者Telegonicaxx
相关产品推荐
相关产品推荐

