2017-05-30 77 views
1

我正在使用Sequelize和Node.js/Express,我不确定如何在Sequelize的哪个部分逃脱。如何在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;删除*来自某些事物;'

非常感谢您的帮助!

有一个好的一天,

凡妮莎

回答

1

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

我需要手动转义的唯一实例是在编写原始sql查询时。用特殊的SQL函数时

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

虽然我发现它更适合手动有时逃避:Sequelize原始的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

没有必要逃避这种情况下,Sequelize做到这一点。