Express-Validator 项目中的 Sanitization Chain API 详解

Express-Validator 项目中的 Sanitization Chain API 详解

express-validator express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator

什么是 Sanitization Chain

Sanitization Chain(净化链)是 express-validator 中的一个中间件概念,它允许开发者对请求数据进行一系列的净化处理。与验证链类似,净化链可以包含多个净化器(sanitizer),这些净化器会按照添加顺序依次执行,对请求字段进行修改。

基本用法

净化链应该被传递给 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 中所有的净化方法作为标准净化器,包括但不限于:

  • trim():去除字符串两端的空白字符
  • toInt():将值转换为整数
  • normalizeEmail():标准化电子邮件地址
  • escape():转义 HTML 特殊字符

这些方法可以直接在净化链中使用,无需额外配置。

自定义净化器

除了标准净化器外,express-validator 还提供了强大的自定义净化功能:

customSanitizer 方法

.customSanitizer() 允许你定义自己的净化逻辑:

const { param } = require('express-validator');
app.get('/object/:id', param('id').customSanitizer((value, { req }) => {
  return req.query.type === 'user' ? ObjectId(value) : Number(value);
}), objectHandler)

这个方法接收一个净化函数,该函数会接收字段值和一些上下文信息(请求对象、位置和路径),并返回净化后的值。

实用净化方法

默认值设置

.default() 方法可以在字段值为空、null、undefined 或 NaN 时设置默认值:

app.post('/', [body('username').default('foo')], (req, res, next) => {
  // 各种情况的处理结果:
  // 'bar'     => 'bar' (保留原值)
  // ''        => 'foo' (使用默认值)
  // undefined => 'foo' (使用默认值)
  // null      => 'foo' (使用默认值)
  // NaN       => 'foo' (使用默认值)
});

值替换

.replace() 方法可以替换特定的值:

app.post('/', [body('username').replace(['bar', 'BAR'], 'foo')], (req, res, next) => {
  // 'bar_' => 'bar_' (不匹配)
  // 'bar'  => 'foo'  (匹配替换)
  // 'BAR'  => 'foo'  (匹配替换)
});

强制运行净化链

.run() 方法允许你以命令式的方式运行净化链:

app.post('/create-post', async (req, res, next) => {
  await check('content').escape().trim().run(req);
  // 净化前: ' hey your forum is amazing! <script>runEvilFunction();</script>    '
  // 净化后: 'hey your forum is amazing! &lt;script&gt;runEvilFunction();&lt;/script&gt;'
});

类型转换方法

转换为数组

.toArray() 方法可以将任何值转换为数组:

app.post('/', [body('checkboxes').toArray()], (req, res, next) => {
  // ['foo', 'bar]  => ['foo', 'bar'] (保持不变)
  // 'foo'          => ['foo']        (字符串转为单元素数组)
  // undefined      => []             (空数组)
});

大小写转换

.toLowerCase().toUpperCase() 方法可以转换字符串大小写:

app.post('/', [body('username').toLowerCase()], (req, res, next) => {
  // 'Foo'      => 'foo'
  // undefined  => undefined (非字符串值保持不变)
});

app.post('/', [body('username').toUpperCase()], (req, res, next) => {
  // 'Foo'      => 'FOO'
  // undefined  => undefined (非字符串值保持不变)
});

最佳实践建议

  1. 顺序很重要:净化器会按照添加顺序执行,例如先 .trim().toLowerCase() 与反过来顺序效果可能不同。

  2. 合理使用默认值.default() 可以简化后续处理逻辑,但要确保默认值确实符合业务需求。

  3. 注意性能:自定义净化器中避免复杂计算,特别是处理大量请求时。

  4. 结合验证使用:通常建议先净化数据再进行验证,确保验证逻辑处理的是标准化后的数据。

通过合理使用这些净化方法,你可以确保应用程序处理的数据更加规范和安全,减少因数据格式问题导致的错误和安全风险。

express-validator express-validator 项目地址: https://gitcode.com/gh_mirrors/exp/express-validator

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

富嫱蔷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值