在Golang中使用ORDER BY CASE WHEN时如何避免SQL注入?
修复SQL注入风险的方案
问题根源
原代码通过fmt.Sprintf直接将用户可控的userPrefix拼接到排序SQL片段中,即便用%q添加引号,当用户输入包含SQL特殊字符(比如" OR 1=1 --)时,依然可能篡改SQL逻辑,引发注入风险。
修复方法
利用GORM提供的gorm.Expr构造安全的排序表达式,通过参数绑定传递用户输入,避免直接拼接SQL字符串。参数绑定会自动处理特殊字符转义,彻底阻断注入路径。
修改后的代码:
var userPrefix string // userPrefix是请求参数 if userPrefix != "" { // 用gorm.Expr构造带占位符的CASE表达式,将模糊匹配的参数作为绑定值传入 orderExpr := gorm.Expr("CASE WHEN starred_by LIKE ? THEN 1 ELSE 2 END", "%"+userPrefix+"%") db = db.Order(orderExpr) } db = db.Order(otherParam1).Order(otherParam2) db = db.Model(***).Scan(***)
效果验证
修改后生成的原生SQL会将模糊匹配的内容作为绑定参数,而非直接写入SQL语句:
SELECT * FROM `***` ORDER BY CASE WHEN starred_by LIKE ? THEN 1 ELSE 2 END, otherParam1, otherParam2, otherParam3
GORM会自动处理参数的转义逻辑,无论userPrefix包含什么特殊字符,都会被当作普通字符串处理,不会破坏原有SQL结构。
注意事项
任何用户可控的参数都不能直接拼接到SQL片段(包括ORDER BY、WHERE、GROUP BY等子句),必须通过ORM的参数绑定机制传递,或者使用框架提供的安全构造方法生成SQL片段。
内容的提问来源于stack exchange,提问作者user19983526
相关产品推荐
相关产品推荐

