You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:50:23