gpt4 book ai didi

javascript - 如果在其字段中包含 SQL 语句,则验证对象

转载 作者:行者123 更新时间:2023-11-30 19:13:38 26 4
gpt4 key购买 nike

我有以下结构的对象queryParams:

export default interface Query {
select: SelectParam[];
where?: WhereParam[];
orderBy?: OrderByParam[];
}
export interface SelectParam {
field: string;
}
export interface WhereParam {
conditions: ConditionsParam[];
operator?: string;
}
export interface ConditionsParam {
prop: string;
}
export interface OrderByParam {
prop: string;
}

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

我正在以这种方式进行验证,我认为它既不高效也不动态。有更好的方法吗?

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 ( https://github.com/hapijs/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().invalid(prohibitedTerms) - 这只是为了说明,通常这种类型的重复模式定义将被声明为常见的常量和重用。

乍一看,这种方法似乎比手动“直接”验证要冗长得多,而且需要做的工作也比应有的多。实际上,将验证规则与实际代码分开使其更加灵活和可维护的解决方案 - 也更具可读性。通常,模式将在它们自己的共享模块中定义,并在需要检查数据时导入。

希望对您有所帮助!

关于javascript - 如果在其字段中包含 SQL 语句,则验证对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58223126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com