2017-05-30 109 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做到這一點。