如何在Sequelize中逃脱?

时间:2017-05-30 21:58:49

标签: sql escaping sequelize.js code-injection

我正在使用Sequelize与Node.js / Express,我不知道如何在Sequelize的哪个地方逃脱。

var sequelize = ...;
var productId = 5; var productName = "test";
var product = sequelize.define('product',findAll({
       where: {
           $or: [
                {productId: this.mysql.escapeId(productId)},
                {productName: {$like: this.mysql.escapeId('%' + productName + '%')}},
            ]
       }
    })
   .then(result => ...);

这不起作用,我得到了以下查询:

SELECT `productId`, `productName` FROM `product` AS `product` WHERE (`product`.`productId` = '`5`' OR `product`.`productName` LIKE '\'%test%\'' ORDER BY `product`.`productId` ASC

这对我没什么影响。 那么如何逃避Sequelize?我也试过了Sequelize.escape这个函数,但是我得到了错误“TypeError:Sequelize.escape不是函数”。

如果没有必要通过Sequelize来逃避这些值,我不明白它将如何从SQL注入攻击中保持安全。 示例:productId ='5; DELETE * FROM SOMETHING;'

非常感谢你的帮助!

祝你有个美好的一天,

蛱蝶

2 个答案:

答案 0 :(得分:5)

由于@FiftiN在他的回答中正确地说明了在大多数情况下回避句柄的转义。

我需要手动转义的唯一实例是编写原始sql查询时。 Sequelize原始sql查询使用也被转义的占位符($或?):

sequelize.query('SELECT * FROM projects WHERE status = ?',
  { replacements: ['active'], type: sequelize.QueryTypes.SELECT }
)

虽然在使用特殊的sql函数时,我发现有时候手动转义更合适:

var SqlString = require('sequelize/lib/sql-string')
var input = SqlString.escape("'string'( \"value")
sequelize.query(
    `SELECT * FROM projects WHERE regexp_matches("status", '^\'${input} *\\w*\'')`,
    {type: sequelize.QueryTypes.SELECT }
)

奇怪的正则表达式只是作为一个例子,为什么标准的逃逸机制可能会感到笨重。该示例还使用ES6模板字符串。

我在https://github.com/sequelize/sequelize/issues/1132中找到了转义方法。

警告:转义方法需要其他参数,例如sql方言。在依赖它之前,请确保您了解它的工作原理!此外,该方法可能会在将来的版本中更改或不再存在,因为它未在官方文档中记录。

答案 1 :(得分:3)

这种情况无需逃避,Sequelize会这样做。