服务公告
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 foundStep 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.orgStep 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都能够解释安全技术负担,而不是到生产环境才发现̀
相关推荐
上一篇: 云服务器安全:云服务器性能优化
下一篇: Monitoring:监控自动化告警