有没有办法防止客户端在 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"
}
验证器将检查 firstName
、lastName
和 email
是否有效并接受数据。
现在假设我发送以下内容:
{
"firstName": "John",
"lastName": "Doe"
}
这也有效,因为验证器只需要 firstName
和 lastName
。 email
是可选的,所以它仍然通过。
现在,让我们试试别的:
{
"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 个密钥,无论是必需的还是可选的,并在客户端发送错误的密钥时给客户端一个错误?
这是我正在考虑的一种方法,但我不确定这是否有意义:
- Have an array of keys which are allowed. e.g
arr = ["firstName,"lastName", "email"]
- Get all the keys from
req.body
.
- 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;
}));
我正在用 express 构建一个 API,我有几条路线。我还使用 express-validator
来验证客户端发送的内容。如果客户端发送正确的键并且这些键的值未通过 express-validator
架构定义的验证,则会出现错误。
但是,我现在遇到的问题是,我无法真正检查客户端是否正在发送随机密钥。
这是一个例子。 API 可以接受以下内容:
{
"firstName": "John",
"lastName": "Doe",
"email": "johndoe@example.com"
}
验证器将检查 firstName
、lastName
和 email
是否有效并接受数据。
现在假设我发送以下内容:
{
"firstName": "John",
"lastName": "Doe"
}
这也有效,因为验证器只需要 firstName
和 lastName
。 email
是可选的,所以它仍然通过。
现在,让我们试试别的:
{
"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 个密钥,无论是必需的还是可选的,并在客户端发送错误的密钥时给客户端一个错误?
这是我正在考虑的一种方法,但我不确定这是否有意义:
- Have an array of keys which are allowed. e.g
arr = ["firstName,"lastName", "email"]
- Get all the keys from
req.body
.- Check if keys from
req.body
are in arrayarr
. 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;
}));