转义knex mysql查询语句

时间:2016-02-07 19:06:25

标签: mysql database escaping knex.js database-security

我对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是否足以逃避该查询? 在这种情况下还需要注意什么呢?

1 个答案:

答案 0 :(得分:4)

所有knex查询都是安全的,如果您使用参数绑定语法knex.raw()替换为转义值(http://knexjs.org/#Raw),则?查询也是安全的。

查询您正在做的最好不要使用raw进行如下操作

knex('categories').whereIn('id', ids).catch(...).then(...);

如果要使用列引用a.k.a标识符的自动转义,可以使用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中进行查询的方法几乎总是比使用这种方式的原始条件更好。