我对knex和数据库一般都很陌生,所以这是一个初学者问题。我在 knex 文档中没有明确提及这一点。非原始 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) { ... });
使用此处描述的函数在条件中转义id
是否足以转义该查询?在这种情况下,还有什么需要注意的?
所有 knex 查询都是安全的,如果使用参数绑定语法,其中?
替换为转义值 (http://knexjs.org/#Raw),则knex.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
查询。