一般来说,我对knex和数据库还很陌生,所以这是一个初学者的问题.
我没有在knex docs中对此明确提及.
非原始knex查询是否自动“安全”?
其次,对于原始查询,我有几个类似于以下内容的原始语句:
var condition = _.map(ids, function(id) {
return '`id`=' + id;
}).join(' OR ');
knex('categories')
.whereRaw(condition)
.select('*')
.catch(_error.bind(null, cb))
.then(function(res) { ... });
使用描述为here的函数在条件中转义id是否足以逃脱该查询?
在这种情况下还要注意什么?
解决方法:
所有knex查询都是安全的,如果使用参数绑定语法,knex.raw()查询也是安全的.被替换为转义值(http://knexjs.org/#Raw).
查询您正在做的查询最好不要原始,如下所示
knex('categories').whereIn('id', ids).catch(...).then(...);
如果要使用自动转义列引用(也称为标识符),则可以使用whereRaw(‘?? =?’,[‘id’,value]),将第一部分作为标识符转义,第二部分作为值转义.
因此,使用参数转义您的示例将是这样的:
var condition = _.map(ids, function() {
return '?? = ?';
}).join(' OR ');
var conditionParameters = _.flatten(_.map(ids, function(id) {
return ['id', id];
}));
knex('categories')
.whereRaw(condition, conditionParameters)
.select('*')
.catch(_error.bind(null, cb))
.then(function(res) { ... });
但是我不得不说,在knex中进行查询总是比使用这种原始条件更好的方法.