我正在使用Sequelize与Node.js / Express,我不知道如何在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; DELETE * FROM SOMETHING;'
非常感谢你的帮助!
祝你有个美好的一天,
蛱蝶
答案 0 :(得分:5)
由于@FiftiN在他的回答中正确地说明了在大多数情况下回避句柄的转义。
我需要手动转义的唯一实例是编写原始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中找到了转义方法。
警告:转义方法需要其他参数,例如sql方言。在依赖它之前,请确保您了解它的工作原理!此外,该方法可能会在将来的版本中更改或不再存在,因为它未在官方文档中记录。
答案 1 :(得分:3)
这种情况无需逃避,Sequelize会这样做。