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

时间:2020-01-08 21:36:52

标签: javascript sql knex.js

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

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

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

1 个答案:

答案 0 :(得分:6)

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

它提到knex('table')。where('description','like','%$ {term}%')很容易受到sql注入攻击。甚至有评论提到第一种情况很容易发生注入攻击。但是提供的参考文献中从未提及。容易受到注入攻击的地方。

我是knex的维护者,我在那发表了评论

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

不容易受到SQL注入攻击。

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

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

在这种情况下,正确使用.whereRaw例如:

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

所有标识符正确加引号并且term作为参数绑定发送到DB。

因此答案和添加到该答案的大多数注释都是错误的。