这是https://stackoverflow.com/a/50337990/1370984的后续问题。
它提到knex('table').where('description', 'like', '%${term}%')
很容易受到sql注入攻击。甚至有评论提到第一种情况很容易发生注入攻击。但是提供的参考文献从未提及.where
容易受到注入攻击。
这是一个错误吗?为什么knex允许.where
易于遭受注入攻击,却不允许.whereRaw('description like \'%??%\'', [term])
。两种情况下参数都不会被参数化吗?
答案 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。
因此答案和添加到该答案的大多数注释都是错误的。