如何通过GORM框架安全查询模式有效预防Golang项目SQL注入?
- 内容介绍
- 文章标签
- 相关推荐
本文共计866个文字,预计阅读时间需要4分钟。
直接使用 `db.Where` 连接字符串、手写 SQL 模板,或将用户输入填充进 `fmt.Sprintf`,这三类操作在 GORM 项目中是 SQL 注入的高风险区域。务必坚持参数化传参,类型绑定,99% 的注入风险可在编译期或运行时被截断。
别用字符串拼接构造 WHERE 条件
这是最常见也最危险的习惯。比如写成 db.Where("name = '" + username + "'"),攻击者传入 admin' OR '1'='1 就能绕过验证。
- ✅ 正确做法:所有变量一律走占位符,
db.Where("name = ?", username)或db.Where("name IN ?", userNames) - ⚠️ 注意点:
IN子句不能直接传 slice 给单个?,得用db.Where("name IN ?", []string{"a","b"}),GORM 会自动展开为IN ('a','b') - ❌ 禁止对字段名、表名做动态拼接,它们不属于“值”,无法用占位符保护。
本文共计866个文字,预计阅读时间需要4分钟。
直接使用 `db.Where` 连接字符串、手写 SQL 模板,或将用户输入填充进 `fmt.Sprintf`,这三类操作在 GORM 项目中是 SQL 注入的高风险区域。务必坚持参数化传参,类型绑定,99% 的注入风险可在编译期或运行时被截断。
别用字符串拼接构造 WHERE 条件
这是最常见也最危险的习惯。比如写成 db.Where("name = '" + username + "'"),攻击者传入 admin' OR '1'='1 就能绕过验证。
- ✅ 正确做法:所有变量一律走占位符,
db.Where("name = ?", username)或db.Where("name IN ?", userNames) - ⚠️ 注意点:
IN子句不能直接传 slice 给单个?,得用db.Where("name IN ?", []string{"a","b"}),GORM 会自动展开为IN ('a','b') - ❌ 禁止对字段名、表名做动态拼接,它们不属于“值”,无法用占位符保护。

