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

Posted

技术标签:

【中文标题】knex.where容易受到sql注入攻击吗?【英文标题】:Is knex.where prone to sql injection attacks? 【发布时间】:2020-01-08 21:36:52 【问题描述】:

这是https://***.com/a/50337990/1370984 的后续问题。

它提到knex('table').where('description', 'like', '%$term%') 容易受到 sql 注入攻击。甚至有评论提到第一种情况容易受到注入攻击。然而,提供的参考资料从未提及.where 容易受到注入攻击。

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

【问题讨论】:

@tadman 这是一个真正的问题吗?我查看了 knex 的 where 文档,并没有提到它容易发生 sql 注入。 knexjs.org/#Builder-where 实际上,唯一提到 sql 注入攻击的是 Raw - knexjs.org/#Raw 。这是令人担忧的。 knex还有哪些功能容易受到sql注入攻击? Knex 维护在这里。你好!我只想在这里提一下,这个问题的前提都是false,请忽略@tadman 的cmets。在这种情况下,甚至不应该使用?? 绑定。 tl;dr 假新闻 @MikaelLepistö 感谢您的澄清。 【参考方案1】:

这是https://***.com/a/50337990/1370984 的后续问题。

它提到 knex('table').where('description', 'like', '%$term%') 容易受到 sql 注入攻击。甚至有评论提到第一种情况容易受到注入攻击。然而,提供的参考资料从未提及 .where 容易受到注入攻击。

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

knex('table').where('description', 'like', `%$term%`)

不易受到 SQL 注入攻击。

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

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

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

.whereRaw("?? like '%' || ? || '%'", ['description', term])

所有标识符都正确引用,term 作为参数绑定发送到 DB。

所以答案和添加到该答案的大多数 cmets 都是完全错误的。

【讨论】:

以上是关于knex.where容易受到sql注入攻击吗?的主要内容,如果未能解决你的问题,请参考以下文章

这个 Rails 3 搜索是不是容易受到 SQL 注入的攻击?

如何防止sql注入oracle apex

这个 Python 代码是不是容易受到 SQL 注入的影响? (SQLite3)

sql注入和防御

SQL注入攻击

易受 SQL 注入攻击