Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果对象的字段中包含SQL语句,则验证该对象_Javascript_Node.js_Typescript_Validation - Fatal编程技术网

Javascript 如果对象的字段中包含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

我有以下对象queryParams的结构:

我需要验证它的字段,即使是嵌套字段或对象数组字段,如果它包含SQL注入语句

我用这种方式进行验证,我认为它既没有效率也没有动态性。。有更好的方法吗

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. 
}