【问题标题】:Escaping knex mysql query statements转义 knex mysql 查询语句
【发布时间】:2016-02-07 19:06:25
【问题描述】:

总的来说,我对 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 是否足以转义该查询? 在这种情况下还需要注意什么?

【问题讨论】:

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


    【解决方案1】:

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

    你正在做的查询最好不用 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 中进行查询几乎总是比使用这种方式生成的原始条件更好的方法。

    【讨论】:

    • 谢谢,这正是我要找的!
    • raw 必须在 knex 没有查询构建器方法的任何情况下使用。例如用例——raw("(SELECT (CASE WHEN ... WHERE something = ?) as 'cool_column'), ['myvalue']")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多