转义 knex mysql 查询语句

ben*_*lum 3 mysql database escaping database-security knex.js

总的来说,我对 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) { ... });
Run Code Online (Sandbox Code Playgroud)

id使用此处描述的函数转义条件中的是否足以转义该查询?在这种情况下还有什么需要注意的?

Mik*_*stö 5

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

你正在做的查询最好不要原始,如下所示

knex('categories').whereIn('id', ids).catch(...).then(...);
Run Code Online (Sandbox Code Playgroud)

如果您想使用自动转义列引用又名标识符,您可以使用whereRaw('?? = ?', ['id', value])which 将第一部分转义为标识符,将第二部分转义为值。

因此,使用参数转义,您的示例将是这样的:

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) { ... });
Run Code Online (Sandbox Code Playgroud)

但是我不得不说,knex与使用以这种方式制作的原始条件相比,总是有更好的方法来进行查询。