Node.js 如何防止在Express.js的req.body中发送额外的内容

Node.js 如何防止在Express.js的req.body中发送额外的内容,node.js,express,Node.js,Express,我只是想知道是否可以限制req.body 我可以创建一个中间件,在req.body进入控制器之前检查它是否有多余的垃圾吗 这是一个问题吗? 如果我只选择所需的数据,那么无论req.body有多臃肿都没有关系 谢谢。您可以进行一些对象分解,以限制传入和使用的数据,但这可能会使路由处理程序代码变得混乱。我将在您的控制器方法中使用分解结构,而不是通过中间件修改数据,这可能会导致混乱 例如: const User=require(“./User”); const express=要求(“express”

我只是想知道是否可以限制
req.body
我可以创建一个中间件,在
req.body
进入控制器之前检查它是否有多余的垃圾吗 这是一个问题吗? 如果我只选择所需的数据,那么无论req.body有多臃肿都没有关系


谢谢。

您可以进行一些对象分解,以限制传入和使用的数据,但这可能会使路由处理程序代码变得混乱。我将在您的控制器方法中使用分解结构,而不是通过中间件修改数据,这可能会导致混乱

例如:

const User=require(“./User”);
const express=要求(“express”);
const router=new express.router();
router.post(“/login”),异步(req,res,next)=>{
//让我们假设req.body有用户名、密码和其他垃圾邮件。
//选择1
const userThing1=等待用户身份验证1(请求正文);
//选择2
const userThing2=等待用户身份验证2(请求主体);
//选择3
const{username,password,otherJunk}=req.body;
const userThing3=wait user.authenticate3({username,password});
//…在这里使用userThing响应进行操作
}
下面定义了具有
authenticate1
authenticate2
authenticate3
方法的
User

类用户{
//请先查看路由处理程序
静态异步身份验证1(数据){
//在这里解构,只抓取你需要的东西
const{username,password}=数据;
//在这里输入用户名和密码。
//请注意,这里仍然可以访问data.otherJunk。
}
静态异步身份验证2({username,password}){
//在参数中进行分解,在此处使用用户名和密码进行操作
//此处无法访问其他垃圾。
}
静态异步身份验证3({用户名、密码、其他垃圾邮件}){
//在参数中进行分解,在此处使用用户名和密码。
//请注意,由于我们将变量传递到路由处理程序的方式,otherJunk将不可访问。
}
}
module.exports=用户;

当然有很多方法可以做到这一点,但我会选择选项1或选项2,抓取
用户名
密码
,并在解构过程中忽略
其他垃圾
。它仍然允许传递必要的数据,但使它只抓取需要的明确性和可用性可读性。

您可以进行一些对象分解,以限制传入和使用的数据,但这可能会使路由处理程序代码变得混乱。我会在控制器方法中进行分解,而不是通过中间件修改数据,这可能会导致混乱

例如:

const User=require(“./User”);
const express=要求(“express”);
const router=new express.router();
router.post(“/login”),异步(req,res,next)=>{
//让我们假设req.body有用户名、密码和其他垃圾邮件。
//选择1
const userThing1=等待用户身份验证1(请求正文);
//选择2
const userThing2=等待用户身份验证2(请求主体);
//选择3
const{username,password,otherJunk}=req.body;
const userThing3=wait user.authenticate3({username,password});
//…在这里使用userThing响应进行操作
}
下面定义了具有
authenticate1
authenticate2
authenticate3
方法的
User

类用户{
//请先查看路由处理程序
静态异步身份验证1(数据){
//在这里解构,只抓取你需要的东西
const{username,password}=数据;
//在这里输入用户名和密码。
//请注意,这里仍然可以访问data.otherJunk。
}
静态异步身份验证2({username,password}){
//在参数中进行分解,在此处使用用户名和密码进行操作
//此处无法访问其他垃圾。
}
静态异步身份验证3({用户名、密码、其他垃圾邮件}){
//在参数中进行分解,在此处使用用户名和密码。
//请注意,由于我们将变量传递到路由处理程序的方式,otherJunk将不可访问。
}
}
module.exports=用户;

当然有很多方法可以做到这一点,但我会选择选项1或选项2,抓取
用户名
密码
,并在解构过程中忽略
其他垃圾
。它仍然允许传递必要的数据,但使它只抓取需要的明确性和可用性可读性。

我想您应该拒绝包含名称不在允许列表中的正文参数的请求。这样做应该相对容易

const createError = require('http-errors')
const bodyAllowedList = new Set (['username', 'password'])

function checkbody(req,res,next) {
  for (const prop in req.body) {
    if(req.body.hasOwnProperty(prop) && !bodyAllowedList.has(prop)) {
      next(createError(400, 'unexpected parameter in POST body'))
    }
  }
}

route.post('whatever', checkbody, function (req, res, next){
  /* your route handler here. */
})  


您可以看到常规模式:查看
req.body
对象的属性:它们是body参数。如果您看到一个,则不希望调用
next(错误)
和express将向请求者返回一个错误。

我猜您希望拒绝包含名称不在允许列表中的正文参数的请求。这样做应该相对容易

const createError = require('http-errors')
const bodyAllowedList = new Set (['username', 'password'])

function checkbody(req,res,next) {
  for (const prop in req.body) {
    if(req.body.hasOwnProperty(prop) && !bodyAllowedList.has(prop)) {
      next(createError(400, 'unexpected parameter in POST body'))
    }
  }
}

route.post('whatever', checkbody, function (req, res, next){
  /* your route handler here. */
})  


您可以看到一般模式:查看
req.body
对象的属性:它们是body参数。如果您看到一个您不想看到的参数,则调用
next(error)
和express将向请求者返回一个错误。

如果没有上下文,问题就没有意义。如果没有上下文,问题就没有意义。