knex.where 是否容易受到 sql 注入攻击?

SIL*_*ENT 4 javascript sql knex.js

这是/sf/answers/3523659331/的后续问题。

它提到knex('table').where('description', 'like', '%${term}%')容易受到 sql 注入攻击。甚至评论也提到第一种情况容易发生注入攻击。然而,提供的参考文献从未提到.where容易受到注入攻击。

这是一个错误吗?为什么 knex 允许.where容易受到注入攻击而不是.whereRaw('description like \'%??%\'', [term]). 不是在这两种情况下参数都被参数化了吗?

Mik*_*stö 8

这是/sf/answers/3523659331/的后续问题。

它提到 knex('table').where('description', 'like', '%${term}%') 容易受到 sql 注入攻击。甚至评论也提到第一种情况容易发生注入攻击。然而,提供的参考文献从未提到 .where 容易受到注入攻击。

我是 knex 维护者,我在那里评论说

knex('table').where('description', 'like', `%${term}%`)
Run Code Online (Sandbox Code Playgroud)

不易受到 SQL 注入攻击。

这是一个错误吗?为什么 knex 允许 .where 容易受到注入攻击,但不允许 .whereRaw('description like \'%??%\'', [term]) 。不是在这两种情况下参数都被参数化了吗?

.whereRaw当您将值直接插入到 sql 字符串时,这很容易受到攻击(例如 ?? 标识符替换)。

.whereRaw在这种情况下,正确的用法是例如:

.whereRaw("?? like '%' || ? || '%'", ['description', term])
Run Code Online (Sandbox Code Playgroud)

所有标识符都被正确引用并term作为参数绑定发送到数据库。

因此,答案和添加到该答案中的大多数评论都是完全错误的。