如何使用jsonschema来防止sql注入?

How to use jsonschema in order to prevent sql injection?

提问人:roeygol 提问时间:9/4/2022 最后编辑:roeygol 更新时间:9/6/2022 访问量:352

问:

在我的 node.js 无服务器应用程序(aws-lambda 函数)中,我使用 jsonschema 进行了输入验证。

我希望能够避免对服务器端代码进行 SQL 注入。

是否有任何选项可以使用jsonschema来验证这种情况?

或者,哪个最小的正则表达式可以帮助我们检查这种情况?

节点.js json 验证 注入 jsonschema

评论

1赞 chovy 9/4/2022
我认为SQL注入保护将发生在数据库层,而不是json层。
0赞 roeygol 9/4/2022
这个想法是防止第一层的此类调用并将错误返回给客户端
0赞 chovy 9/4/2022
jsonschema 只是一个建模规范。我不明白 yu 会如何使用它对任何数据采取行动。
0赞 roeygol 9/4/2022
jsonschema 通过给定的 json 结构对 json 数据进行验证,以通过一组规则验证每个字段

答:

2赞 Bill Karwin 9/5/2022 #1

我将明确指出,使用 jsonschema 验证 JSON 文档与 SQL 注入防御无关。

换句话说,JSON 文档可以通过 jsonschema 验证,但仍存在 SQL 注入风险。

下面是一个有效的 JSON 文档:

{
  "film": "Singin' in the Rain",
  "year": 1952
}

这将传递一个 jsonschema,该模式需要对象中的键“film”和“year”。

但是在 SQL 表达式中使用是不安全的,因为“雨中歌唱”中的撇号字符。

假设您要不安全地使用此 JSON 内容,方法是将其直接插值到 SQL 查询字符串中:

// UNSAFE!
var sqlQuery = `INSERT INTO Films SET attributes = '${jsonDocument}'` 

这将导致引号不平衡,充其量会导致在执行查询时出现 SQL 语法错误。

INSERT INTO Films SET attributes = '{ "film": "Singin' in the Rain, "year": 1952 }'
                                                     ^ error

攻击者可能有机会利用它,但它已经足够糟糕了,它会导致语法错误。

大多数 SQL 注入问题的正确解决方案是使用查询参数。将 javascript 变量与 SQL 查询字符串分开。相反,将变量作为参数传递。

// SAFE!
var sqlQuery = `INSERT INTO Films SET attributes = ?`

db.query(sqlQuery, [jsonDocument]).then(...);