直接回答:SQL 注入是攻击者把恶意 SQL 片段拼进应用的查询语句,改变其语义,从而越权读取、篡改甚至拖库。根因是把用户输入当代码拼接。修复的核心是使用参数化查询(预编译语句),让输入永远只作为数据传递。

展开解析:漏洞示例与修复:

# 有漏洞:字符串拼接
query = "SELECT * FROM users WHERE name = '" + name + "'"
# 输入 ' OR '1'='1 即绕过条件

# 修复:参数化查询
cursor.execute("SELECT * FROM users WHERE name = %s", (name,))

补充要点:

  • ORM 也要用绑定参数,raw SQL 接口同样是注入入口。
  • 参数化覆盖不了的场景(表名、ORDER BY 列名、动态 IN 列表)用白名单校验,不要拼接任意输入。
  • 纵深防御:数据库账号最小权限、错误信息不外泄、WAF 兜底;存储过程若内部仍拼字符串一样有漏洞。
  • 常见误区:仅靠转义引号不可靠(宽字节、编码问题可绕过),参数化才是根治。

追问方向:预编译为何能防注入(词法解析阶段已确定结构)、二阶注入。