前沿与实践 · Frontier & Practice
lv.4 前沿
kp-048
安全与伦理
1. 一句话定义
Python 代码的安全底线由四类风险构成——反序列化执行、命令与 SQL 注入、供应链污染、秘密泄漏;伦理底线由自动化行为(爬虫/机器人)对他人系统与数据主体的影响决定。
2. 为什么重要
Python 的易用性会让危险操作也变得"顺手"(eval、pickle.load、字符串拼 SQL)。安全事故的 90% 不是高深漏洞,而是这四类基础纪律的失守。
3. 前置知识
kp-016(IO)、kp-043(自动化/subprocess)、kp-037(配置与秘密)。
4. 核心概念(四类风险)
python
# ① 反序列化执行:pickle 能执行任意代码
import pickle
# ✗ 绝不 unpickle 不可信来源的数据(网络、用户上传、来路不明的 .pkl)
# ✓ 跨信任边界用 JSON;进程内缓存才用 pickle
# ② 注入:字符串拼接命令/SQL
import subprocess, sqlite3
# ✗ subprocess.run(f"ls {user_input}", shell=True)
subprocess.run(["ls", user_input]) # ✓ 列表参数,无 shell 解析
# ✗ f"SELECT * FROM t WHERE n = '{name}'"
cur.execute("SELECT * FROM t WHERE n = ?", (name,)) # ✓ 参数化查询
# ③ eval/exec:等价于"把输入当代码运行"
# ✗ eval(user_input)
# ✓ 解析数据用 json.loads / ast.literal_eval(只允许字面量)
# ④ 秘密:代码、日志、异常信息都可能是泄漏面5. 原理与机制
text
供应链链条(pip install 的信任模型):
你 ──信任──► PyPI 包 ──信任──► 其传递依赖 ──► 构建脚本可执行任意代码
防护:
① 锁定文件(uv.lock)+ 哈希校验 → 依赖不被静默调包
② 最小依赖面:每加一个依赖都问"标准库/更主流的替代?"
③ 注意 typosquatting(模仿知名包名的恶意包)
④ 定期 uv audit / pip-audit 扫已知漏洞
秘密管理三层:环境变量(kp-037)→ 密管服务(Vault/云 KMS)→ 权限最小化6. 关键事实(模型/图示)
text
伦理决策框架(写自动化前过一遍):
授权:我有没有对目标系统/数据的合法访问权?
边界:robots.txt、服务条款、速率限制是否遵守?
数据:采集的数据是否含个人信息?用途与留存是否最小化?
影响:我的脚本会不会挤占他人资源、干扰他人使用?
AI 附加:LLM 输出是否可能误导他人?是否标注了 AI 生成?7. 直观类比
pickle 反序列化像收下陌生人寄来的"家电"并直接通电——箱子里可能根本不是家电(是程序);JSON 像只收印刷品——能读不能执行。供应链像连锁餐饮的中央厨房:一家分店(一个依赖)被污染,全部下游(你的应用)都中招。
8. 实例与案例
python
# 一次安全的文件下载校验(哈希 + 大小限制)
import hashlib, httpx
MAX = 10 * 1024 * 1024
r = httpx.get(url, timeout=10, follow_redirects=True)
if len(r.content) > MAX:
raise ValueError("超出大小限制")
digest = hashlib.sha256(r.content).hexdigest()
if digest != expected: # 与发布方公布的哈希比对
raise ValueError("哈希不符,可能被篡改")9. 常见误区
- "内网数据不算不可信" —— 内网横向移动正是真实攻击路径;反序列化与注入纪律不分内外。
- 秘密进环境变量就万事大吉 —— 日志、异常、子进程环境都可能再泄漏;输出过滤也是必修。
- 依赖"看起来主流"就安全 —— 主流包也会被投毒(维护者账号被盗是真实事件);锁 + 审计才是机制保障。
- 爬虫"只是读取而已" —— 高频访问即资源占用,个人信息采集受法规约束(个人信息保护法/GDPR);"技术上可行"不等于"应该做"。
10. 自测题
- 为什么 pickle 绝不能处理不可信数据?替代方案?
shell=True的风险点?安全等价写法?- 供应链防护的四件套?
参考答案
- pickle 恢复对象时会执行其中记录的构造/降级逻辑,攻击者可注入任意代码;JSON(结构化数据)或进程内可信缓存。
- shell=True 让字符串经 shell 解析,用户输入可注入命令(如
; rm -rf);列表参数 + check=True。 - 锁定文件与哈希校验、最小依赖面、警惕仿冒包名、定期漏洞扫描(pip-audit/uv audit)。
11. 与其他知识点的关系
12. 延伸阅读
- Python 官方文档"安全考量"章节
- OWASP Top 10(SQL 注入/反序列化条目)
- pip-audit / uv audit 文档