讲师中心 微信公众号
AI工具推荐 视频效率加速

怎样在Python自动化脚本中安全转义外部输入防止SQL注入

雨浩姑娘_3903

雨浩姑娘_3903

发布时间:2026-10-10 09:39:48

|

678人浏览过

|

来源于php中文网

原创

唯一可靠的是数据库驱动参数绑定,而非手动转义或字符串拼接;pymysql用%s,mysql-connector-python推荐%(key)s;ORM默认安全但禁用.text()和f-string;所有SQL操作(含INSERT/UPDATE/DELETE)及日志、DSN等场景均需参数化。

怎样在python自动化脚本中安全转义外部输入防止sql注入

直接拼接字符串构造SQL语句,哪怕只用一次 str.format() 或 %,都等于给SQL注入留了后门。唯一可靠的做法是交由数据库驱动完成参数绑定——不是“转义”,而是彻底隔离数据与语句结构。

为什么不能靠手动转义字符

手动转义(比如用 mysql.escape_string() 或正则替换单引号)本质是补丁式防御:它假设你知道所有数据库方言的特殊字符、注释语法、编码绕过方式。但攻击者早已掌握 Unicode 编码混淆、宽字节截断、多层嵌套注释等技巧,而你的正则永远慢一步。

更现实的问题是:不同数据库对转义规则不一致(MySQL 的 \' vs PostgreSQL 的 ''),同一库在不同 SQL 模式下行为也可能变化。你写的“安全”函数,在切换数据库或升级版本后可能立刻失效。

  • 不要自己写 escape_sql() 函数
  • 不要依赖 repr() 或 json.dumps() 处理输入
  • 不要在 WHERE 子句里用 format() 插入变量名或表名

pymysql 和 mysql-connector-python 的正确参数占位符用法

这两个主流 MySQL 驱动都支持原生参数化查询,但占位符语法不同,混用会直接报错或失效。

立即学习“Python免费学习笔记(深入)”;

使用 pymysql 时必须用 %s(注意是字符串格式化符号,不是类型提示):

cursor.execute("SELECT * FROM users WHERE name = %s AND age > %s", (name_input, age_input))

使用 mysql-connector-python 时支持两种风格,但推荐统一用命名占位符 %(key)s,可读性更强且防顺序错乱:

Galileo python sdk
Galileo python sdk

Galileo AI 平台 Python SDK 完整参考,用于评估、监控和保护 GenAI 应用,适用于构建 Python 应用。

下载
cursor.execute("SELECT * FROM users WHERE name = %(name)s AND age > %(min_age)s", {"name": name_input, "min_age": age_input})
  • 占位符只能用于**值(value)**,不能用于表名、列名、ORDER BY 字段等结构部分
  • 传入参数必须是元组(单值也要写成 (value,))或字典,不能是列表或字符串
  • 如果要动态拼接表名,必须白名单校验 + 显式拒绝非法字符(如 re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*$', table_name))

ORM 如何帮你避开手写 SQL 的陷阱

用 SQLAlchemy Core 或 Django ORM 时,只要你不显式调用 .text() 或拼接原始字符串,底层默认走参数化路径。例如:

# 安全:filter() 自动生成参数化 WHERE
query = session.query(User).filter(User.name == name_input, User.age > age_input)
<h1>危险:.text() 绕过所有防护</h1><p>session.execute(text(f"SELECT * FROM users WHERE name = '{name_input}'"))

Django 的 filter()、get()、exclude() 全部自动参数化;SQLAlchemy 的 where()、select().where() 同理。但一旦你用 f-string 或 format() 构造整个 SQL 字符串,ORM 就不再介入。

  • 避免在 ORM 查询中混用 f"SELECT * FROM {table_name}"
  • 批量插入时优先用 execute_many() 或 ORM 的 bulk_insert_mappings(),而非循环拼接 INSERT
  • 执行原生 SQL 时,仍需坚持用 execute(sql, params) 形式,而非字符串拼接

容易被忽略的“非查询”场景

很多人只关注 SELECT,但 INSERT、UPDATE、DELETE 同样危险。尤其当脚本接收命令行参数、环境变量或配置文件内容作为 SQL 输入时:

比如从 sys.argv[1] 读取用户名并更新状态,若写成:

cursor.execute(f"UPDATE users SET status='active' WHERE name='{username}'")  # ❌

攻击者传入 admin'-- 就能清空整张表的 status 字段。正确写法仍是参数化:

cursor.execute("UPDATE users SET status=%s WHERE name=%s", ("active", username))  # ✅
  • 日志记录中的 SQL 拼接也常被忽视(如 logger.info(f"Updated {username}") 虽不执行,但若日志被注入到管理后台展示页,可能引发 XSS)
  • 数据库连接池初始化时若用环境变量拼接 DSN 字符串(如 mysql://user:{os.getenv('PASS')}@...),同样存在注入风险,应改用标准 URL 解析库

真正难的不是学会用 %s,而是把“任何外部输入都不进 SQL 字符串”变成肌肉记忆——包括配置项、文件名、HTTP 头、甚至你自以为“可控”的内部 API 返回值。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1691

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4244

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1689

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

24737

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3027

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3047

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1163

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

0

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn