如何在Sequelize中逃脱?

How to escape in Sequelize?

我正在将 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 => ...);

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

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 is not a function"。

如果由于 Sequelize 而无需转义这些值,我不明白它如何在 SQL 注入攻击中保持安全。 示例:productId = '5;从某事中删除 *;'

非常感谢您的帮助!

祝你有美好的一天,

凡妮莎

这种情况就不用转义了,Sequelize来做吧

正如@FiftiN 在他的回答中正确指出的那样,sequelize 在大多数情况下处理转义。

我唯一需要手动转义的实例是在编写原始 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中找到了转义方法。

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