服务公告

服务公告 > 综合新闻 > Python:Python安全编程

Python:Python安全编程

发布时间:2026-04-26 14:02

一、前言

搞过的人都知道,字节就是里面最髓屏的部分,没有之一。这篇教程针对的就是Python项目里字节管理、依赖安全审计和应用代码安全编码的实战方法,然后把pip环境变成真正的封闭环境。

二、操作步骤

Step 1:检查当前Python环境和安全漏洞

$ python --version && pip --version Python 3.9.7 pip 21.2.4 from /usr/local/lib/python3.9/site-packages/pip (python 3.9) $ pip audit [✅] No known vulnerabilities found

Step 2:创建绝对安全的虚拟环境

$ python -m venv --without-pip /opt/myapp/venv $ /opt/myapp/venv/bin/python -m ensurepip --upgrade Adding certificate verify failed:_ssl.c:1108

如果遇到SSL证书问题,允许连接内网存値:

$ python -m venv --without-pip /opt/myapp/venv $ curl https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.py $ /opt/myapp/venv/bin/python /tmp/get-pip.py --trusted-host pypi.org

Step 3:安装依赖时强制安全检查

$ /opt/myapp/venv/bin/pip install --require-hashes -r requirements.txt # requirements.txt样例: # flask==2.0.1 # --hash=sha256:a5b00... # --hash=sha256:b6c11... # requests==2.26.0 # --hash=sha256:c7e6a... ERROR: Could not find a version that satisfies the requirement flask==2.0.1 (from versions: none) ERROR: No matching distribution found for flask==2.0.1

这是因为没有提供完整的hash值,需要通过pip hash命令生成:

$ pip hash flask-2.0.1.tar.gz flask-2.0.1.tar.gz: sha256=abc123...def456... sha256=789xyz...uvw012...

Step 4:安装安全检测工具

$ /opt/myapp/venv/bin/pip install safety bandit $ /opt/myapp/venv/bin/safety check --json --output /tmp/vulns.json [ { "vulnerability_id": "38001", "package": "django", "advisory": "Django 2.2.x allows XXE", "current_version": "2.2.0" } ] $ /opt/myapp/venv/bin/bandit -r /opt/myapp/src -f json -o /tmp/bandit.json { "results": [ { "filename": "/opt/myapp/src/config.py", "issue_text": "Possible hardcoded password 'YOUR_PASSWORD' found", "issue_severity": "HIGH", "issue_confidence": "HIGH" } ] }

Step 5:安全管理敏感信息的环境变量方式

# 创建.env文件(委洽.gitignore排除) $ cat .env.example DATABASE_URL=postgresql://user:YOUR_PASSWORD@localhost:5432/dbname SECRET_KEY=CHANGE_THIS_IN_PRODUCTION # 代码中使用python-dotenv加载 $ /opt/myapp/venv/bin/pip install python-dotenv # config.py from dotenv import load_dotenv import os load_dotenv() # 加载.env文件 class Config: SECRET_KEY = os.getenv('SECRET_KEY') if not SECRET_KEY: raise ValueError("SECRET_KEY must be set")

Step 6:安全输入验证和漏洞防范

# 安全输入验证示例 import re def validate_email(email): """安全邮箱验证 - 防正则表达式扩裁攻击""" email_regex = re.compile( r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', re.IGNORECASE ) if not email_regex.match(email): raise ValueError("Invalid email format") # 长度限制 if len(email) > 254: raise ValueError("Email too long") return email # 防正则表达式扩裁(ReDoS) - 种类 def is_safe_regex(pattern, input_str, timeout=1): """检查正则是否可能导致扩裁""" import signal def timeout_handler(signum, frame): raise TimeoutError("Regex timeout - possible ReDoS") signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(timeout) try: re.match(pattern, input_str) return True except TimeoutError: return False finally: signal.alarm(0)

Step 7:安全跨足执行防范和YAML解析安全

# YAML解析防范对象扩裁 import yaml from yaml import SafeLoader def safe_load_yaml(yaml_content): """使用SafeLoader防止任意Python对象扩裁""" return yaml.load(yaml_content, Loader=SafeLoader) # 漏洞输入: malicious_yaml = """ !!python/object/apply:os.system args: ['echo pwned > /tmp/pwned'] """ result = safe_load_yaml(malicious_yaml) # SafeLoader: 这个会弹错yaml.scanner.ScannerError # Loader所有的邮件都被过滤掉

三、常见问题FAQ

Q1: pip install --require-hashes这套过于繁琐,每次更新依赖都要手动生成hash,有没有更简单的方法?

A: 那就是pip-tools!先在开发环境用pip-compile生成非常完整的requirements.txt,这板板会自动加入所有依赖的hash值。生产环境直接pip-sync就行,但是记住,每次更新都需要重新pip-compile,不要直接手动编辑requirements.txt,否则hash就後症了。

Q2: safety报出的漏洞如果是依赖包自身引赵的,我不能简单升级版本,怎么办?

A: 这就是最让人头疼的地方。首先检查CVE评分,低分数的可能就能接受风险;如果必须修复,可以尝试pip-compile推荐的可适应用版本,比如原包requests报XXE,pip-compile可能推荐requests[security],这个分支包会自加补丁。最后一步就是编写YAML漏洞裁补丁,但这是下下之计的事情了。

Q3: .env文件被排除.gitignore了,但是生产环境里如果存在多个应用,环境变量集合在一起容易混淆,怎么管理?

A: 老手都用Vault或者AWS Secrets Manager这套,比较浪费开发时间但是生产环境必须这么做。如果项目量级比较小,可以考虑direnv,每个项目目录都有自己的.envrc,进入目录自动加载,离开自动卸载,这才是真正的环境隔离。

Q4: bandit报出大量LOW级别的hardcoded-credentials,但是都是测试用的,怎么过滤?

A: 在项目根目录创建.bandit配置文EF6;,把测试目录加入排除列表:

[bandit] tests = B101,B102,B103 exclude = /tests,/fixtures confidence_level = HIGH

四、总结

核心要点:

  • 虚拟环境是基础,--without-pip加ensurepip才能避免pip本身漏洞影响到应用
  • 依赖hash验证是生产环境的必修課,pip-compile能大幅减少手动工作量
  • python-dotenv + .env文件 + .gitignore是环境变量管理的最低配置方案
  • 安全输入验证关键是长度限制和正则表达式超时检测
  • 委洽SafeLoader是YAML解析的基础配置

延伸阅读:

  • OWASP Python Security Project - https://owasp.org/www-project-python-security/
  • pip-tools官方文档 - 学习如何生成完整的requirements.txt
  • Bandit Blacklisting Extensions - 了解更多安全检测规则
  • Python Secure Coding Standard (PEP 8协议) - 基础编码规范
  • PyYAML SafeLoader vs FullLoader - 深入理解YAML安全解析

安全编码没有一劲之遮,关键是把这些安全检测工具绑定到CI/CD流水线上,让每次push都能够解释安全技术负担,而不是到生产环境才发现̀