Express-Validator 项目中的 Sanitization Chain API 详解
什么是 Sanitization Chain
Sanitization Chain(净化链)是 express-validator 中的一个中间件概念,它允许开发者对请求数据进行一系列的净化处理。净化是指对输入数据进行规范化、清理和转换的过程,确保数据符合预期格式并去除潜在有害内容。
基本用法
净化链应该被传递给 Express 路由处理器。你可以根据需要向链中添加任意数量的净化器,中间件运行时,它会按照指定的顺序依次应用每个净化器:
const { body } = require('express-validator');
app.get('/', body('trimMe').trim(), (req, res, next) => {
// 如果 req.body.trimMe 原本是 " something "
// 净化后的值将是 "something"
console.log(req.body.trimMe);
});
标准净化器
express-validator 提供了 validator.js 中列出的所有净化器,这些被称为"标准净化器"。包括但不限于:
normalizeEmail
:规范化电子邮件地址trim
:去除字符串两端的空白字符toInt
:将字符串转换为整数escape
:转义 HTML 特殊字符unescape
:反转义 HTML 特殊字符
这些净化器可以直接在链中使用,例如:
app.post('/user',
body('email').normalizeEmail(),
body('age').toInt(),
(req, res) => {
// 处理净化后的数据
}
);
自定义净化方法
除了标准净化器外,express-validator 还提供了一些额外的净化方法:
自定义净化器(customSanitizer)
当内置净化器不能满足需求时,可以使用自定义净化器:
app.get('/object/:id',
param('id').customSanitizer((value, { req }) => {
return req.query.type === 'user' ? ObjectId(value) : Number(value);
}),
objectHandler
);
默认值(default)
当值为空、null、undefined 或 NaN 时,使用默认值替换:
body('username').default('foo')
替换特定值(replace)
将特定值替换为新值:
body('username').replace(['bar', 'BAR'], 'foo')
强制运行净化链(run)
以命令式方式运行净化链:
await check('content').escape().trim().run(req);
转换为数组(toArray)
将值转换为数组,undefined 会转换为空数组:
body('checkboxes').toArray()
大小写转换
toLowerCase()
:转换为小写toUpperCase()
:转换为大写
这些方法对非字符串值无效,会直接返回原值。
实际应用场景
-
用户注册表单处理:
app.post('/register', body('email').normalizeEmail(), body('username').trim().toLowerCase(), body('age').toInt(), registerHandler );
-
搜索功能参数处理:
app.get('/search', query('q').trim().escape(), query('page').default(1).toInt(), searchHandler );
-
API 参数规范化:
app.get('/products/:category', param('category').trim().toLowerCase(), query('sort').default('price').toLowerCase(), productHandler );
最佳实践
-
净化顺序很重要:净化器会按照添加顺序执行,例如先
trim()
再escape()
与先escape()
再trim()
结果可能不同。 -
合理使用默认值:
default()
方法可以帮助处理缺失或无效的参数,使代码更健壮。 -
注意性能:净化操作会增加处理时间,对于高频接口要评估性能影响。
-
结合验证使用:通常净化后还需要验证数据,可以结合验证链一起使用。
-
处理非字符串值:标准净化器只接受字符串输入,对于数组或对象需要特别处理。
通过合理使用 express-validator 的净化链 API,可以显著提高应用的安全性和健壮性,减少因输入数据不规范导致的错误和安全问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考