MySQL SQL 注入

1. 核心定义

SQL 注入:攻击者将恶意 SQL 命令插入用户输入(表单、查询字符串等),因输入未验证 / 转义,欺骗服务器执行恶意 SQL 查询,非法操作数据库。

MySQL 注入:针对 MySQL 数据库的 SQL 注入,核心是利用输入漏洞构造恶意 SQL,执行非预期查询或破坏数据。

2. 典型攻击示例

(1)登录验证注入

原查询语句:SELECT * FROM users WHERE username = 'input_username' AND password = 'input_password';

攻击者输入用户名:' OR '1'='1'; --

篡改后语句:SELECT * FROM users WHERE username = '' OR '1'='1'; --' AND password = 'input_password';

结果:1=1 恒成立,注释符--屏蔽后续语句,返回所有用户数据。

(2)未过滤的删除注入

复制代码
name = "Qadir'; DELETE FROM users;"
cursor.execute(f"SELECT * FROM users WHERE name='{name}'")  # 动态拼接SQL存在注入风险

风险:未过滤name变量,可能导致 users 表数据被删除(SQLite/PostgreSQL 中该风险更高)。

3. 防范措施

措施类型 具体内容
基础防护 1. 参数化查询 / 预编译语句(分离输入与查询语句,从根源规避注入)2. 输入验证 + 转义(正则校验格式 / 限制长度,使用驱动自带转义函数处理特殊字符)3. 数据库最小权限(为应用分配独立账号,仅赋予必要操作权限)
辅助防护 1. 使用 ORM 框架(如 SQLAlchemy、Django ORM,抽象 SQL 查询降低风险)2. 生产环境禁用详细错误提示(避免泄露数据库结构等敏感信息)

4. 特殊场景:like 语句注入

  • 问题:用户输入_(匹配单个字符)、%(匹配任意字符)会导致查询结果异常;

  • 解决(Python):先通过数据库驱动转义特殊字符,再手动处理%_,示例(基于 pymysql):

    复制代码
    import pymysql
    conn = pymysql.connect(host='localhost', user='root', password='', db='test')
    cursor = conn.cursor()
    # 转义基础特殊字符 + 处理like专用通配符
    user_input = "%something_"
    escaped_input = conn.escape_string(user_input)  # 基础转义
    like_safe_input = escaped_input.replace('%', '\\%').replace('_', '\\_')  # 处理%/_
    cursor.execute(f"SELECT * FROM table WHERE col LIKE '{like_safe_input}'")

5. Python 核心防注入函数 / 方法

方法 / 函数名 所属库 / 场景 作用
conn.escape_string() pymysql(MySQL 驱动) 转义用户输入中的 MySQL 特殊字符(单引号、双引号、反斜杠等)
re.match()/re.fullmatch() re(正则库) 正则验证输入格式(如限制用户名仅含字母 / 数字 / 下划线,长度 8-20 位)
cursor.execute (参数化 SQL, 参数元组) 所有 Python 数据库驱动 参数化查询核心用法,彻底分离 SQL 结构与输入,示例:cursor.execute("SELECT * FROM users WHERE username=%s AND password=%s", (input_user, input_pwd))
sqlalchemy.text() SQLAlchemy(ORM) 构造安全的带参数 SQL 语句,避免拼接风险,示例:from sqlalchemy import text``stmt = text("SELECT * FROM users WHERE username=:name")``result = conn.execute(stmt, {"name": input_user})

6. 防注入 6 个核心要点

  1. 永远不信任用户输入,必须校验(正则、长度限制、转义特殊字符);
  2. 不使用字符串拼接生成 SQL,优先用参数化查询(cursor.execute 带参数元组);
  3. 避免使用管理员权限的数据库连接,为每个应用分配独立低权限账号;
  4. 敏感信息(如密码)通过 hash 加密存储(Python 推荐使用 bcrypt、passlib 库);
  5. 用自定义错误信息包装原始异常,减少信息泄露;
  6. 用专业工具(sqlmap、Acunetix)检测注入漏洞,定期审计代码。
相关推荐
南屿欣风4 小时前
MySQL Binlog 数据恢复实战
数据库·mysql
DomDanrtsey4 小时前
oracle查询某数据库用户下哪些表的索引没有被使用到?
数据库·oracle
独处东汉5 小时前
freertos开发空气检测仪之输入子系统按键驱动测试
android·java·数据库
allway25 小时前
统信UOS桌面专业版开启 ROOT权限并设置 SSH 登录
java·数据库·ssh
@@123456胡斌5 小时前
SQL的整理及复现
数据库·sql·安全
l1t5 小时前
在Windows的WSL中试用GizmoSQL UI连接GizmoSQL数据库服务器
数据库·windows·ui
2301_811232985 小时前
使用Python进行PDF文件的处理与操作
jvm·数据库·python
Wzx1980125 小时前
go聊天室接入mysql的项目docker部署流程
mysql·docker·golang
梦想的旅途25 小时前
企微全自动化运营的可视化与度量
数据库·mysql
jiunian_cn5 小时前
【Redis】string数据类型相关指令
数据库·redis·缓存