>>>PyPathPython 学习站
前沿与实践 · Frontier & Practice lv.4 前沿 kp-048

安全与伦理

前置知识:kp-016、kp-037

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. 常见误区

  1. "内网数据不算不可信" —— 内网横向移动正是真实攻击路径;反序列化与注入纪律不分内外。
  2. 秘密进环境变量就万事大吉 —— 日志、异常、子进程环境都可能再泄漏;输出过滤也是必修。
  3. 依赖"看起来主流"就安全 —— 主流包也会被投毒(维护者账号被盗是真实事件);锁 + 审计才是机制保障。
  4. 爬虫"只是读取而已" —— 高频访问即资源占用,个人信息采集受法规约束(个人信息保护法/GDPR);"技术上可行"不等于"应该做"。

10. 自测题

  1. 为什么 pickle 绝不能处理不可信数据?替代方案?
  2. shell=True 的风险点?安全等价写法?
  3. 供应链防护的四件套?
参考答案
  1. pickle 恢复对象时会执行其中记录的构造/降级逻辑,攻击者可注入任意代码;JSON(结构化数据)或进程内可信缓存。
  2. shell=True 让字符串经 shell 解析,用户输入可注入命令(如 ; rm -rf);列表参数 + check=True。
  3. 锁定文件与哈希校验、最小依赖面、警惕仿冒包名、定期漏洞扫描(pip-audit/uv audit)。

11. 与其他知识点的关系

  • kp-043 自动化:注入与爬虫伦理的实操面。
  • kp-044 AI:API key 与模型输出的责任边界。
  • kp-037 配置:秘密管理的机制层。

12. 延伸阅读

  • Python 官方文档"安全考量"章节
  • OWASP Top 10(SQL 注入/反序列化条目)
  • pip-audit / uv audit 文档