Golang动态拼接MySQL查询时不使用?占位符如何安全转义参数
Go 实现 MySQL 参数安全转义方案
首选方案(优先推荐,兼容动态查询场景)
你提到的「动态可选条件无法使用?占位符」是常见误解,完全可以通过动态拼接占位符+参数列表的方式实现,从根源上避免SQL注入风险,示例代码如下:
import "strings" // 初始化参数列表和条件集合 var args []interface{} var where []string if status != "99" { where = append(where, "vs.stats = ?") args = append(args, "1") } if cari != "" { where = append(where, "(lm.title_member like ? OR lm.nama_member like ?)") // 把%包裹的模糊查询值直接放进参数列表,无需手动转义 args = append(args, "%"+cari+"%", "%"+cari+"%") } // 拼接基础查询语句 baseQuery := "select vs.*, lm.nama_member from volks_shift vs left join list_member lm on vs.id_m=lm.id_m where vs.id_s=?" args = append(args, id_s) // 拼接动态where条件 if len(where) > 0 { baseQuery += " AND " + strings.Join(where, " AND ") } rows, err := s.DB.QueryContext(ctx, baseQuery, args...)
必须硬拼接SQL的场景转义方案
如果确实不能使用占位符,要实现类似mysql_real_escape_string的转义效果,直接使用Go最常用的MySQL驱动github.com/go-sql-driver/mysql自带的转义方法即可:
import "github.com/go-sql-driver/mysql" if cari != "" { // 对用户输入参数做标准MySQL转义 escapedCari := mysql.EscapeString(cari) where = append(where, "(lm.title_member like '%"+escapedCari+"%' OR " + "lm.nama_member like '%"+escapedCari+"%' )") }
自定义转义规则
如果不使用上述驱动,也可以自己按照MySQL官方转义规则实现转义逻辑,需要替换的特殊字符如下:
- 反斜杠
\替换为\\ - 单引号
'替换为\' - 双引号
"替换为\" - 换行符
\n替换为\n - 回车符
\r替换为\r - 退格符
\b替换为\b - 制表符
\t替换为\t - Ctrl+Z控制字符替换为
\Z
注意:手动转义始终存在遗漏特殊字符的风险,非必要场景请优先使用占位符方案
内容的提问来源于stack exchange,提问作者Muhammad Anang Ramadhan
相关产品推荐
相关产品推荐

