You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express框架对JSON请求体自动转义HTML实体问题排查求助

分析与解决方案

先帮你梳理下问题:你发送的"O'Neil"最终在req.body里变成了O'Neil,这是双重HTML转义的结果——先是单引号'被转成',然后这个转义后的&又被转成&,才出现了这种嵌套转义的情况。

根据你提供的信息,express.json()本身不会做HTML转义(它只是纯JSON解析,默认配置里escape: false),Wireshark也确认请求体传输正常,那问题大概率出在express-validator或者其他你可能忽略的中间件上,下面是具体的排查和解决步骤:

1. 先排除express-validator的嫌疑

express-validator的sanitizer(清理器)里有escape()方法,会自动把HTML特殊字符转义(比如'→',&→&)。如果这个清理操作被执行了两次,就会出现你看到的双重转义结果。

排查步骤:

  • 临时注释掉所有express-validator的验证/清理代码,重启服务器后重新测试请求。
  • 如果此时req.body.name恢复为正常的O'Neil,那问题肯定出在express-validator的规则里。

解决方法:

检查你的验证链,找到包含.escape()、.sanitize()或者类似转义逻辑的规则,比如:

// 错误示例:重复转义或者不必要的转义
check('name')
  .trim()
  .escape() // 这里会把'转成'
  .escape(); // 如果又执行一次,就会把&转成&,变成'
  • 移除重复的转义操作,或者如果业务不需要HTML转义,直接删掉.escape()规则即可。

2. 检查其他中间件

如果排除了express-validator,那就要排查是否有其他中间件在修改req.body:

  • 有没有使用express-sanitizer、xss-clean这类安全中间件?它们默认可能会自动转义HTML字符。
  • 是否不小心重复配置了请求体解析?比如同时用了express.json()和body-parser.json()(虽然Express 4.16+后express.json()就是body-parser的封装,但重复配置可能引发异常)。

3. 确认业务代码没有手动转义

最后检查你自己的业务逻辑,是否在接收req.body后,又对name字段做了额外的转义处理?比如使用了第三方转义库(如lodash.escape),或者自己写了转义函数,导致二次转义。

额外验证:明确JSON解析配置

虽然默认就是关闭转义的,但你可以显式配置express.json()的参数,确保没有被意外修改:

app.use(express.json({
  escape: false, // 明确禁用转义,默认就是false
  strict: true
}));

内容的提问来源于stack exchange,提问作者Andre M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 23:14:07