有没有办法防止客户端在 express api 中发送未知 properties/keys?

Is there a way to prevent client from sending unknown properties/keys in express api?

我正在用 express 构建一个 API,我有几条路线。我还使用 express-validator 来验证客户端发送的内容。如果客户端发送正确的键并且这些键的值未通过 express-validator 架构定义的验证,则会出现错误。

但是,我现在遇到的问题是,我无法真正检查客户端是否正在发送随机密钥。

这是一个例子。 API 可以接受以下内容:

{
    "firstName": "John",
    "lastName": "Doe",
    "email": "johndoe@example.com"
}

验证器将检查 firstNamelastNameemail 是否有效并接受数据。

现在假设我发送以下内容:

{
    "firstName": "John",
    "lastName": "Doe"    
}

这也有效,因为验证器只需要 firstNamelastNameemail 是可选的,所以它仍然通过。

现在,让我们试试别的:

{
    "firstName": "234839248923",
    "lastName": "Doe",
    "email": "johndoe@gmail.com"
}

在上面,验证失败,我们得到一个错误,因为 firstName 不能只是数字。

到目前为止,还不错。

现在,这是另一个案例:

{
    "firstName": "John",
    "lastName": "Doe",
    "email": "johndoe@gmail.com",
    "randomKeyIDontNeed": "I don't need this"
}

即使存在从客户端发送的 randomKeyIDontNeed,以上内容也能完美运行并通过。

我找不到使用 express-validator 检查随机密钥是否发送并给出错误的方法。

有没有办法检查只允许这 3 个密钥,无论是必需的还是可选的,并在客户端发送错误的密钥时给客户端一个错误?

这是我正在考虑的一种方法,但我不确定这是否有意义:

  1. Have an array of keys which are allowed. e.g arr = ["firstName,"lastName", "email"]
  2. Get all the keys from req.body.
  3. Check if keys from req.body are in array arr. If not, return an error.

有没有更简单、更干净的方法来做到这一点?

现在,无论何时发送随机密钥,它都不会在后端使用,也不会真正影响任何东西。那么,是否还有必要验证随机密钥?

不对随机密钥进行验证会产生什么影响?

您可能想研究使用 express-joi-validation。它对给定键的类型进行验证,并防止用户传递其他值。

这是我的一些 Stripe 路由验证器的文件

const Joi = require('joi');

exports.postPaymentMethod = Joi.object({
    paymentMethodId: Joi.string().required()
});

exports.deletePaymentMethod = Joi.object({
    paymentMethodId: Joi.string().required()
});

下面是我如何使用它们。

const validator = require('express-joi-validation').createValidator({});
router.delete('/payment-methods', validator.body(deletePaymentMethod), ash(async (req, res) => {
    // validated body is passed here, safe to use w/o lots of error checking
    var paymentMethodId = req.body.paymentMethodId;
}));