如何在Sequelize中逃脱?

van*_*ssa 3 sql escaping code-injection sequelize.js

我正在将Sequelize与Node.js / Express结合使用,但不确定在where部分如何使用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 => ...);
Run Code Online (Sandbox Code Playgroud)

这不起作用,我得到下面的查询:

SELECT `productId`, `productName` FROM `product` AS `product` WHERE (`product`.`productId` = '`5`' OR `product`.`productName` LIKE '\'%test%\'' ORDER BY `product`.`productId` ASC
Run Code Online (Sandbox Code Playgroud)

结果什么也没有给我。那么如何通过Sequelize逃脱呢?我也尝试了Sequelize.escape函数,但收到错误“ TypeError:Sequelize.escape不是函数”。

而且,如果无需借助Sequelize来逃避这些值,我不知道它如何在SQL注入攻击中保持安全。示例:productId ='5; 从某些内容中删除*;'

非常感谢你的帮助 !

祝你有美好的一天,

凡妮莎

Dav*_*adi 6

正如@FiftiN在他的答案中正确指出的那样,在大多数情况下,sequelize可以进行转义。

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

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

虽然当使用特殊的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 }
)
Run Code Online (Sandbox Code Playgroud)

奇怪的正则表达式只是一个示例,说明了标准转义机制可能会显得笨拙。该示例还使用ES6模板字符串。

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

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