Express-Validator 6.1.0 消毒链(Sanitization Chain) API详解
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
什么是消毒链(Sanitization Chain)
在Web开发中,消毒(Sanitization)是指对用户输入数据进行清理和规范化的过程,目的是确保数据符合预期格式并消除潜在的安全风险。Express-Validator提供的消毒链API是一个强大的中间件工具,它允许开发者以链式调用的方式对请求数据进行多步处理。
基本用法
消毒链应该作为Express路由处理器的中间件使用。你可以根据需要向链中添加多个消毒器,中间件运行时将按照指定的顺序依次应用这些消毒器:
app.get('/', sanitizeBody('trimMe').trim(), (req, res, next) => {
// 如果req.body.trimMe原本是" something "
// 消毒后的值将变为"something"
console.log(req.body.trimMe);
});
标准消毒器
Express-Validator集成了validator.js提供的所有消毒方法,这些方法在消毒链中被称为"标准消毒器"。常用标准消毒器包括:
trim()
: 去除字符串两端的空白字符toInt()
: 将字符串转换为整数toFloat()
: 将字符串转换为浮点数escape()
: 转义HTML特殊字符normalizeEmail()
: 规范化电子邮件地址格式
这些方法可以直接在消毒链中调用,例如:
sanitizeBody('email').normalizeEmail()
sanitizeParam('id').toInt()
高级消毒方法
除了标准消毒器外,消毒链还提供了一些特殊方法:
自定义消毒器(.customSanitizer)
当标准消毒器不能满足需求时,可以使用.customSanitizer()
方法添加自定义消毒逻辑:
sanitizeParam('id').customSanitizer((value, { req }) => {
return req.query.type === 'user' ? ObjectId(value) : Number(value);
})
自定义消毒器接收两个参数:
- 要消毒的值
- 包含请求对象(req)、字段位置(location)和路径(path)的上下文对象
手动执行消毒链(.run)
默认情况下,消毒链作为中间件会自动执行。如果需要手动控制执行时机,可以使用.run()
方法:
app.post('/create-post', async (req, res, next) => {
await sanitize('content').escape().trim().run(req);
// 消毒后的内容
console.log(req.body.content);
});
转换为数组(.toArray)
.toArray()
方法非常实用,它能将各种格式的输入统一转换为数组:
sanitizeBody('checkboxes').toArray()
转换规则:
- 已经是数组:保持不变
- 字符串:转换为单元素数组
- undefined:转换为空数组
实际应用场景
- 用户注册表单处理:
sanitizeBody('email').normalizeEmail(),
sanitizeBody('username').trim().escape(),
sanitizeBody('age').toInt()
- 搜索功能参数处理:
sanitizeQuery('keywords').trim(),
sanitizeQuery('page').default(1).toInt(),
sanitizeQuery('perPage').default(10).toInt()
- API ID参数处理:
sanitizeParam('id').toInt()
最佳实践
- 始终对用户输入进行消毒处理,即使是来自可信来源的数据
- 消毒顺序很重要,通常先执行格式转换(如trim),再执行安全处理(如escape)
- 对于关键操作,考虑结合验证链和消毒链一起使用
- 在错误处理中记录消毒前后的值,便于调试
通过合理使用Express-Validator的消毒链功能,可以大大提升应用的安全性和健壮性,同时减少因数据格式问题导致的意外错误。
express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考