用ORM就真的不会SQL注入了吗? 迷人的志红 提问于 2026-02-25 09:44:19 阅读 8 安全 我最近在用 Sequelize 写接口,听说 ORM 能防 SQL 注入,但心里还是不踏实。比如下面这种写法: const user = await User.findOne({ where: { id: req.query.id } }); 如果用户传了个 '1 OR 1=1 --' 进来,会不会被拼成恶意 SQL?我看文档说参数会自动转义,但不确定是不是所有情况都安全,特别是用 sequelize.literal() 或者 raw query 的时候。 ORM注入SQL注入防护 我来解答 赞 2 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 シ雯婷 Lv1 别被 ORM 的宣传忽悠了,它只是帮你挡掉大部分常见注入,不是万能盾牌。 你贴的这个写法是安全的:User.findOne({ where: { id: req.query.id } }),Sequelize 会把 req.query.id 当成参数绑定,不会直接拼进 SQL,哪怕你传 '1 OR 1=1 --',最后生成的 SQL 类似 WHERE id = '1 OR 1=1 --',数据库会把它当普通字符串匹配,不会执行逻辑,所以没问题。 但重点来了:sequelize.literal() 和 Sequelize.literal() 是危险区。比如: sequelize.query(SELECT * FROM users WHERE id = ${req.query.id}, { type: QueryTypes.SELECT }) 或者 where: { id: sequelize.literal('${req.query.id}') } 这种就是你自己拼字符串,ORM 不管你传了啥,直接塞进 SQL,注入风险自己扛。 再比如: User.findOne({ where: { name: sequelize.literal(LIKE '%${req.query.keyword}%') } }) 如果 req.query.keyword 是 %' OR 1=1 --,那就凉了。 总结下: 普通 where、order、include 这些字段值,ORM 都会转义,放心用; 一旦你用 literal、raw、手写 SQL 字符串拼接,就等于脱了裤子自己上,必须自己做严格校验或转义。 建议: - 能不用 literal 就别用 - 真要用,至少先 escape 一下,比如:sequelize.escape(req.query.id) - 关键参数类型校验别偷懒,比如 id 明确是数字就 Number(req.query.id),非数字直接 reject 复制过去试试: // 安全 User.findOne({ where: { id: "'1 OR 1=1 --'" } }) // 不安全 User.findOne({ where: { id: sequelize.literal("'1 OR 1=1 --'") } }) 前者生成 WHERE id = '''1 OR 1=1 --''',后者直接变成 WHERE id = '1 OR 1=1 --',区别自己悟。 回复 点赞 2 2026-02-25 10:01 加载更多 相关推荐 1 回答 12 浏览 前端用 Prepared Statement 能防 SQL 注入吗? 我最近在学安全防护,看到说用 Prepared Statement 可以防止 SQL 注入。但我是在写前端代码(比如用 fetch 发请求),那我在前端拼 SQL 字符串然后发给后端,是不是照样会被注... 东方晓萌 安全 2026-02-27 04:52:17 2 回答 23 浏览 W3af扫描显示SQL注入漏洞,但手动测试没问题,哪里出错了? 用W3af扫描公司登录接口时,它提示存在SQL注入漏洞,但我在Postman里试了' OR '1'='1之类的payload完全没反应。后端用了参数化查询,是不是W3af误报了? 我按教程配置了gre... 宇文东霞 安全 2026-02-15 20:24:37 2 回答 59 浏览 React表单输入转义后SQL注入还是能攻击成功怎么办? 在React里处理用户输入时,我用了字符串替换方法转义了单引号,但测试时发现还是能执行SQL注入,这是为什么? 比如这个登录表单处理函数: handleSubmit = (event) => {... Des.东景 安全 2026-02-14 14:32:30 2 回答 21 浏览 React里用预编译语句防SQL注入时参数化失败怎么办? 我在React组件里用Axios调用后端查询接口,参数直接拼接到SQL字符串里了,担心SQL注入风险。按照教程改成预编译语句后,参数化一直失败,控制台报错说"参数位置无效"。 这是我的代码片段: //... UX子武 安全 2026-02-12 22:12:30 2 回答 35 浏览 Vue过滤特殊字符后为什么SQL注入还能被绕过? 在Vue项目里处理搜索框输入时,我给后端API加了引号过滤,但测试SQL注入时发现还是能绕过... 具体场景是用户输入搜索词会拼接SQL语句,我在前端用了正则过滤单双引号,但输入" OR 1=1--%... 慕容喜静 安全 2026-02-12 14:05:32 2 回答 33 浏览 在Sequelize中使用findOrCreate时如何防止SQL注入? 最近在用Sequelize做用户注册功能时,发现直接拼接查询条件可能会有SQL注入风险。比如这样写: User.findOrCreate({ where: { username: req.body.u... 夏侯梦森 安全 2026-02-11 10:40:35 2 回答 61 浏览 错误处理时如何避免泄露SQL注入漏洞细节? 我在做登录接口时发现,当用户输入特殊符号触发SQL注入防护,后端返回的错误信息里包含了表名和列名。比如输入username=' OR 1=1时,错误提示显示Unknown column 'userna... Des.心霞 安全 2026-02-07 03:28:26 1 回答 242 浏览 参数化查询没防住SQL注入?我的代码哪里写错了? 最近在学参数化查询防注入,但测试时发现还是能被绕过。比如在Node.js用mysql模块写这个登录验证: const query = 'SELECT * FROM users WHERE u... 俊杰酱~ 安全 2026-02-06 13:00:32 2 回答 52 浏览 Vue表单过滤单引号后为何仍出现SQL注入漏洞? 我在做一个用户反馈表单时,发现后端报SQL注入错误。虽然给输入框加了单引号过滤,但用户输入像“O'Reilly”这样的名字时,后端依然报错。代码是这样的: 提交 export default { da... 书生シ艺嘉 安全 2026-02-01 11:07:46 2 回答 40 浏览 在前端用模板字符串拼接SQL时,怎么防OWASP Top 10的注入漏洞? 我在做用户搜索功能时,后端让前端传原始搜索词,用模板字符串拼接SQL查询。但测试时发现这属于A03注入漏洞。虽然改用了参数化查询,但后端报错说参数顺序不对... 具体场景是用户输入框内容拼接到"SEL... 佳沫的笔记 安全 2026-01-26 15:59:27
你贴的这个写法是安全的:
User.findOne({ where: { id: req.query.id } }),Sequelize 会把req.query.id当成参数绑定,不会直接拼进 SQL,哪怕你传'1 OR 1=1 --',最后生成的 SQL 类似WHERE id = '1 OR 1=1 --',数据库会把它当普通字符串匹配,不会执行逻辑,所以没问题。但重点来了:
sequelize.literal()和Sequelize.literal()是危险区。比如:或者
这种就是你自己拼字符串,ORM 不管你传了啥,直接塞进 SQL,注入风险自己扛。
再比如:
如果
req.query.keyword是%' OR 1=1 --,那就凉了。总结下:
普通
where、order、include这些字段值,ORM 都会转义,放心用;一旦你用
literal、raw、手写 SQL 字符串拼接,就等于脱了裤子自己上,必须自己做严格校验或转义。建议:
- 能不用
literal就别用- 真要用,至少先
escape一下,比如:sequelize.escape(req.query.id)- 关键参数类型校验别偷懒,比如
id明确是数字就Number(req.query.id),非数字直接 reject复制过去试试:
前者生成
WHERE id = '''1 OR 1=1 --''',后者直接变成WHERE id = '1 OR 1=1 --',区别自己悟。