flawopen.com/JavaScript 中的 SQL 注入/Sequelize
Sequelize query() 能防止 SQL 注入吗?
参考指南
简短回答
查询参数就像封装好的值卡:SQL 单独接收该值,而不是将其作为查询指令。在 Sequelize v6 中,bind 单独发送值;replacements 会在发送前转义并插入值。用不可信输入拼接查询字符串会绕过两者。它们都不能代替表名或列名。
不安全 — 将输入拼接进 SQL
sequelize.query(
`SELECT * FROM users WHERE id = ${userId}`
)
加固 — 单独绑定值
sequelize.query(
"SELECT id FROM users WHERE id = $id",
{ bind: { id: userId },
type: QueryTypes.SELECT }
)
不要让数据值混入 SQL 语法
在 Sequelize v6 中,Sequelize 会在发送查询前转义并插入 replacements;bind 则将值与 SQL 文本分开发送。两者都可避免拼接用户值,但语法取决于方法和数据库方言。参数不能代表表名、列名、排序方向或任意 SQL 片段。将用户可选结构映射到应用内固定白名单。模型方法能处理常见结构化值,但仍需审查 raw SQL 和字面表达式。
如何审查 Sequelize 查询构造
rg -n 'sequelize\.query\(|Sequelize\.literal\(' --glob '*.{js,ts,mjs,cjs}' .常见问题
Sequelize 模型方法总能防止 SQL 注入吗?
常见结构化值会通过 Sequelize 的查询构造处理。仍应检查 raw SQL、字面表达式和应用拼接的字符串。参数化不代表用户有权访问记录,也不能验证业务规则。