跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

Python安全编码规范_常见安全问题总结

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响应头意外暴露,是高频低级错误。

所有密钥类配置统一从环境变量读取(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 3.14.3微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

下载立即学习“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校验)

相关文章