如何在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 方言。在依赖它之前,请确保您了解它的工作原理!此外,该方法可能会更改或在未来的版本中不再存在,因为它未记录在官方文档中。
我正在将 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 方言。在依赖它之前,请确保您了解它的工作原理!此外,该方法可能会更改或在未来的版本中不再存在,因为它未记录在官方文档中。