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)检测注入漏洞,定期审计代码。
相关推荐
郑重其事,鹏程万里1 小时前
键值储存数据库(mapdb)
数据库
Kaede61 小时前
MySQL中如何使用命令行修改root密码
android·mysql·adb
c***69301 小时前
超详细:数据库的基本架构
数据库·架构
Sunhen_Qiletian1 小时前
《Python开发之语言基础》第六集:操作文件
前端·数据库·python
whn19772 小时前
达梦DW数据库安装
数据库
SelectDB2 小时前
宇信科技基于 SelectDB & Apache Doris 构建实时智能的银行经营分析平台
数据库·apache
f***14772 小时前
对Docker部署的MySQL中的数据进行备份恢复
mysql·docker·容器
胖咕噜的稞达鸭2 小时前
算法入门:滑动窗口--->找到字符串中所有的字母异位词,串联所有的子串,最小覆盖子串
数据库·redis·算法
SelectDB2 小时前
上海证券 SelectDB 升级实践:湖仓流批一体落地与 Elasticsearch 全面替换
数据库·apache