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

Express.js中req.body可信程度如何?使用前需做哪些校验?

问题解答

关于直接调用req.body.foo.toString()的代码执行风险

首先明确结论:在默认配置的新版body-parser环境、且无额外的原型污染操作(比如你提到的merge类操作)的前提下,直接调用该方法不存在远程代码执行风险。
原因很简单:JSON格式本身不支持传输函数类型,用户通过正常请求提交的所有内容都会被解析为字符串、数字、布尔值、普通对象、数组、null这几类基础类型,根本无法将toString属性设置为可执行的自定义函数。就算用户刻意提交{"foo": {"toString": "恶意内容"}}结构的请求,最多只会在调用时因为toString不是函数抛出TypeError,不会触发任意代码执行。
只有两种极端场景下才可能出现代码执行风险:

  • 你使用了存在原型污染漏洞的旧版body-parser,且服务端逻辑存在全局对象合并、属性复制等可被原型污染利用的操作,导致Object原型上的toString被篡改
  • 你自行修改了body-parser的默认配置,启用了支持解析函数类型的非标准解析逻辑

关于校验的必要性

哪怕不存在代码执行风险,调用req.body下的属性方法前也必须做校验,否则很容易触发异常导致服务可用性问题,比如以下常见场景都会直接抛错:

  • req.body.foo不存在,值为undefined
  • req.body.foo值为null
  • req.body.foo的toString属性被用户设置为非函数类型(比如字符串、数字)

更稳妥的处理方式有两种:

  1. 如果你只是需要把任意类型的req.body.foo转为字符串,可以直接用String(req.body.foo),该方法对undefined、null都可以正常返回对应字符串,不会抛异常
  2. 如果你要求req.body.foo本身必须是字符串类型,可以用Object.prototype.toString.call(req.body.foo) === '[object String]'做类型校验,校验通过后再调用相关方法即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:24:04