2017-05-30 47 views
1

私はNode.js/ExpressでSequelizeを使用しています。どこでSequelizeを使用してエスケープするかわかりません。私は結果として何も与えないSequelizeでエスケープするには?

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

:これが動作しない

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 => ...); 

、私は次のクエリを取得します。 Sequelizeでエスケープするには?私も関数Sequelize.escapeを試しましたが、 "TypeError:Sequelize.escapeは関数ではありません"というエラーが出ました。

Sequelizeのおかげで値をエスケープする必要がなければ、SQLインジェクション攻撃からどのように安全になるのか分かりません。 例:productId = '5; *何かから削除する; '

ありがとうございました!

は良い一日を、

ヴァネッサ

答えて

1

@FiftiNが彼の答えで正しく述べているように、たいていの場合、ハンドルは後でエスケープします。

手動のエスケープが必要なのは、生のSQLクエリを作成するときだけでした。私は時々手動で脱出することがより適切で見つかった特殊なSQL関数を扱うときものの

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

を::生のSQLクエリもエスケープされるプレースホルダ(?$または)を使用Sequelize

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がそれを行う、この場合ではありません。

関連する問題