python安全编码核心在于理解漏洞成因与防御逻辑,需重点防范注入(参数化查询、禁用eval/shell=true)、敏感信息泄露(环境变量管理、日志过滤)、反序列化风险(禁用pickle/yaml.load、用safe_load/json)、权限失控(服务端鉴权、路径规范化、最小权限api设计)。

Python安全编码不是加几个装饰器或装个扫描工具就能解决的事,核心在于理解常见漏洞的成因和对应防御逻辑。以下是最常被忽视、也最容易引发真实风险的几类问题及落地建议。
输入验证与注入防护
Python本身不直接执行SQL或系统命令,但开发者常因信任外部输入而埋下隐患。比如用f-string拼接SQL、用os.system()执行用户传入的命令、或在模板中未转义渲染用户数据。
- 数据库操作一律使用参数化查询(如sqlite3的?占位符、psycopg2的%s、SQLAlchemy的bindparam),禁用字符串格式化拼接SQL
- 避免eval()、exec()、compile()处理任意输入;若必须动态执行,改用受限沙箱(如restrictedpython)或白名单函数映射
- 调用系统命令优先选subprocess.run()并显式传入args列表,禁用shell=True;必要时用shlex.quote()对参数做转义
敏感信息硬编码与泄露
密钥、Token、数据库密码写死在代码里,或通过日志、异常堆栈、HTTP响应头意外暴露,是高频低级错误。
十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第
- 所有密钥类配置统一从环境变量读取(os.getenv("DB_PASSWORD")),配合python-decouple或dynaconf管理不同环境配置
- 禁用print()、logging.debug()输出敏感字段;自定义日志过滤器(继承logging.Filter)自动屏蔽含"token"、"key"等关键词的字段
- Django/Flask项目关闭调试模式(DEBUG=False),防止500错误页泄露完整路径、变量值和中间件栈
反序列化与不安全对象重建
pickle、yaml.load()、json.loads()(配合object_hook)都可能触发任意代码执行,尤其当输入来自不可信来源时。
立即学习“Python免费学习笔记(深入)”;
- 绝对禁止用pickle.load()解析不受控的字节流;替代方案:用json(仅支持基础类型)或msgpack(需校验schema)
- PyYAML默认加载器存在RCE风险,必须显式指定yaml.safe_load();若需自定义标签,重写yaml.Loader并禁用yaml.UnsafeLoader
- 第三方库如celery、redis-py默认使用pickle序列化,务必配置task_serializer='json'或serializer='json'
权限控制与信任边界混淆
后端常误将前端传来的is_admin=true、user_id=123直接用于鉴权,或未校验文件路径导致目录遍历。
- 会话状态、角色权限必须由服务端生成并签名(如JWT需HS256密钥校验,Django Session需SECRET_KEY加密),禁止前端传递可篡改标识
- 文件操作前强制规范化路径:os.path.abspath(filepath) + os.path.commonpath([safe_root, resolved_path]) == safe_root,防止../绕过
- API接口按最小权限原则设计:GET只读、POST限数据字段、关键操作(删/改/支付)强制二次确认(如短信验证码、OAuth scope校验)









