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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:39:01