Javascript 如果对象的字段中包含SQL语句,则验证该对象
我有以下对象queryParams的结构: 我需要验证它的字段,即使是嵌套字段或对象数组字段,如果它包含SQL注入语句 我用这种方式进行验证,我认为它既没有效率也没有动态性。。有更好的方法吗Javascript 如果对象的字段中包含SQL语句,则验证该对象,javascript,node.js,typescript,validation,Javascript,Node.js,Typescript,Validation,我有以下对象queryParams的结构: 我需要验证它的字段,即使是嵌套字段或对象数组字段,如果它包含SQL注入语句 我用这种方式进行验证,我认为它既没有效率也没有动态性。。有更好的方法吗 const res = queryParams.select.find(i => (i.aggregator ? ((i.aggregator.includes('select') && i.aggregator.includes('from')) || i.a
const res = queryParams.select.find(i =>
(i.aggregator ? ((i.aggregator.includes('select') && i.aggregator.includes('from')) || i.aggregator.includes('update') || i.aggregator.includes('drop') || i.aggregator.includes('delete')) : false) || // aggregator CRUD
((i.field.includes('select') && i.field.includes('from')) || i.field.includes('update') || i.field.includes('drop') || i.field.includes('delete')) || // field CRUD
(i.type ? ((i.type.includes('select') && i.type.includes('from')) || i.type.includes('update') || i.type.includes('drop') || i.type.includes('delete')) : false) // type CRUD
);
// the same thing for the rest of the fields.
我相信:
Object.entries(queryParam).forEach(([key, value]) => {
...
...
...
});
是其中一种方法,但不确定如何使用它,因为我对Javascript/Typescript还不熟悉。任何时候需要验证/清理数据,我强烈建议使用第三方库。在这种情况下,您可能想看看Joi,它有一套非常健壮的规则,并且在将来需要更改逻辑时非常灵活 按照通常使用Joi的方式,您将从定义模式开始,该模式是用于验证规则的Joi语言,从叶对象一直到根对象。您的代码可能如下所示:
const prohibitedTerms = ['select', 'from', 'yellow cat']
const orderBySchema = Joi.string().required().invalid(prohibitedTerms)
const conditionsParamSchema = Joi.string().required().invalid(prohibitedTerms)
const selectParamSchema = Joi.string().required().invalid(prohibitedTerms)
const whereParamSchema = Joi.object({
conditions: Joi.array().items(conditionsParamSchema).required(),
operator: Joi.string().optional
})
const querySchema = Joi.object({
select: Joi.array().items(selectParamSchema).required(),
where: Joi.array().items(whereParamSchema).optional(),
orderBy: Joi.array().items(orderBySchema).optional()
})
...
const myData = <something that needs to be validated>
const { error, value } = querySchema.validate(myData)
if (error) {
// Raise alarm about invalid input, possible injection etc.
}
您可能已经注意到重复的Joi.string.required.invalidprohibitedTerms-这只是为了说明,通常这种类型的重复模式定义会声明为公共常量并重用
一开始,这种方法似乎比直接手工验证要详细得多,而且需要做的工作比它应该做的更多。事实上,将验证规则与实际代码分离,可以使解决方案更灵活、更易于维护,也更具可读性。通常,模式将在它们自己的共享模块中定义,并在需要检查数据时导入
希望有帮助
const prohibitedTerms = ['select', 'from', 'yellow cat']
const orderBySchema = Joi.string().required().invalid(prohibitedTerms)
const conditionsParamSchema = Joi.string().required().invalid(prohibitedTerms)
const selectParamSchema = Joi.string().required().invalid(prohibitedTerms)
const whereParamSchema = Joi.object({
conditions: Joi.array().items(conditionsParamSchema).required(),
operator: Joi.string().optional
})
const querySchema = Joi.object({
select: Joi.array().items(selectParamSchema).required(),
where: Joi.array().items(whereParamSchema).optional(),
orderBy: Joi.array().items(orderBySchema).optional()
})
...
const myData = <something that needs to be validated>
const { error, value } = querySchema.validate(myData)
if (error) {
// Raise alarm about invalid input, possible injection etc.
}