用ORM框架就真的不会SQL注入了吗? 西门仙仙 提问于 2026-03-13 11:38:19 阅读 2 安全 最近在用Sequelize写Node.js后端,听说ORM能自动防SQL注入,但我还是有点不放心。比如我这样写:Model.findAll({ where: { name: userInput } }),如果userInput是用户直接传过来的字符串,会不会有风险? 之前试过故意传了个' OR '1'='1进去,结果数据库没崩,但不确定是不是Sequelize内部做了处理。有没有可能在某些写法下还是会绕过防护?比如用raw query或者拼接条件的时候? 我来解答 赞 3 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 IT人英歌 Lv1 先说结论:正常用Sequelize的ORM写法是安全的,但你提到的raw query和某些拼接方式确实有坑。 你试的那个 ' OR '1'='1 没崩,是因为Sequelize内部用的是参数化查询,大概相当于这样: SELECT * FROM users WHERE name = ? -- ' OR '1'='1 会被当作整个字符串传进去,不会被解析成SQL逻辑 所以标准写法 Model.findAll({ where: { name: userInput } }) 没问题。 但这几个地方容易翻车: 1. raw query // 危险写法 Model.sequelize.query(SELECT * FROM users WHERE name = '${userInput}') // 安全写法 Model.sequelize.query('SELECT * FROM users WHERE name = ?', { replacements: [userInput] }) 这种直接拼字符串的raw query跟手写SQL没区别,该注入还是注入。 2. Sequelize.literal() 或 Sequelize.where() // 危险写法 Model.findAll({ where: { name: Sequelize.literal('${userInput}') // 直接拼进去 } }) // 或者用Op.like时 Model.findAll({ where: { name: { [Op.like]: '%' + userInput + '%' // 尽量避免这样拼接 } } }) 3. 字符串拼接的where条件 // 危险写法 const whereClause = "name = '" + userInput + "'" Model.findAll({ where: Sequelize.literal(whereClause) }) 总结一下:ORM的查询构建器是安全的,但一旦你用了raw query、literal()、或者自己拼字符串,那就跟裸写SQL没区别了。懒省事直接拼字符串的话,该注入还是注入。 日常开发尽量用对象形式写where条件,别碰literal(),除非万不得已必须用raw query时记得用参数绑定。 回复 点赞 2026-03-13 12:03 加载更多 相关推荐 1 回答 14 浏览 用ORM就真的不会SQL注入了吗? 我最近在用 Sequelize 写接口,听说 ORM 能防 SQL 注入,但心里还是不踏实。比如下面这种写法: const user = await User.findOne({ where: { i... 迷人的志红 安全 2026-02-25 09:44:19 2 回答 87 浏览 TypeORM里用Raw写SQL会有注入风险吗? 我最近在用TypeORM的Raw函数拼接查询条件,但担心这样会不会有SQL注入漏洞?比如下面这段代码: const users = await getRepository(User) .find({ ... 一家淼 安全 2026-03-06 00:28:21 1 回答 21 浏览 前端传数字ID到后端,做类型检查能防SQL注入吗? 我在写一个用户信息查询功能,前端传了个用户ID给后端接口。听说只要确保这个ID是数字就能防止SQL注入,是真的吗? 我试过在前端用typeof id === 'number'判断,但发现用户还是可以通... a'ゞ翌菡 安全 2026-03-03 20:25:18 1 回答 3 浏览 存储过程真能防住SQL注入吗?我这样写安全吗? 我在用Node.js调用MySQL的存储过程,听说用存储过程能防SQL注入,但我还是有点不放心。比如我这样拼接参数传进去: CALL getUserInfo(${userId}) 会不会有风险?是不是... UX-米阳 安全 2026-03-12 19:37:18 1 回答 12 浏览 前端如何防止SQL注入时意外暴露敏感信息? 我在做用户登录功能时,后端用了参数化查询防SQL注入,但前端错误提示写得太详细,比如直接显示“用户名或密码错误”,担心被用来暴力探测账户。想隐藏具体错误,但又不能让用户完全不知道哪里出错,这该怎么平衡... Newb.培聪 安全 2026-03-10 20:42:24 1 回答 24 浏览 前端用 Prepared Statement 能防 SQL 注入吗? 我最近在学安全防护,看到说用 Prepared Statement 可以防止 SQL 注入。但我是在写前端代码(比如用 fetch 发请求),那我在前端拼 SQL 字符串然后发给后端,是不是照样会被注... 东方晓萌 安全 2026-02-27 04:52:17 2 回答 28 浏览 W3af扫描显示SQL注入漏洞,但手动测试没问题,哪里出错了? 用W3af扫描公司登录接口时,它提示存在SQL注入漏洞,但我在Postman里试了' OR '1'='1之类的payload完全没反应。后端用了参数化查询,是不是W3af误报了? 我按教程配置了gre... 宇文东霞 安全 2026-02-15 20:24:37 2 回答 67 浏览 React表单输入转义后SQL注入还是能攻击成功怎么办? 在React里处理用户输入时,我用了字符串替换方法转义了单引号,但测试时发现还是能执行SQL注入,这是为什么? 比如这个登录表单处理函数: handleSubmit = (event) => {... Des.东景 安全 2026-02-14 14:32:30 2 回答 29 浏览 React里用预编译语句防SQL注入时参数化失败怎么办? 我在React组件里用Axios调用后端查询接口,参数直接拼接到SQL字符串里了,担心SQL注入风险。按照教程改成预编译语句后,参数化一直失败,控制台报错说"参数位置无效"。 这是我的代码片段: //... UX子武 安全 2026-02-12 22:12:30 2 回答 46 浏览 Vue过滤特殊字符后为什么SQL注入还能被绕过? 在Vue项目里处理搜索框输入时,我给后端API加了引号过滤,但测试SQL注入时发现还是能绕过... 具体场景是用户输入搜索词会拼接SQL语句,我在前端用了正则过滤单双引号,但输入" OR 1=1--%... 慕容喜静 安全 2026-02-12 14:05:32
你试的那个
' OR '1'='1没崩,是因为Sequelize内部用的是参数化查询,大概相当于这样:SELECT * FROM users WHERE name = ? -- ' OR '1'='1 会被当作整个字符串传进去,不会被解析成SQL逻辑
所以标准写法
Model.findAll({ where: { name: userInput } })没问题。但这几个地方容易翻车:
1. raw query
这种直接拼字符串的raw query跟手写SQL没区别,该注入还是注入。
2. Sequelize.literal() 或 Sequelize.where()
3. 字符串拼接的where条件
总结一下:ORM的查询构建器是安全的,但一旦你用了raw query、literal()、或者自己拼字符串,那就跟裸写SQL没区别了。懒省事直接拼字符串的话,该注入还是注入。
日常开发尽量用对象形式写where条件,别碰literal(),除非万不得已必须用raw query时记得用参数绑定。