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 注入的攻击?