Python 安全漏洞若干注意要点
本文介绍了 Python 编程需要注意的会产生安全漏洞的写法。
- 注入:不能直接拼接字符串然后提交到别的系统运行,所有的字符串都要 escape 过一次,可以的话,使用现成的库,例如 shlex,ORM
- billion laughs 攻击: 解析来自不信任来源的 XML 文件,可能会因为这种攻击类型导致内存上 G 最后进程崩溃。
- external entity expansion: XML 可以引用别的 xml,这会导致库会默默地发起网络调用。使用 defusedxml 替代 Python 标准库的 xml
- assert 语句会在
__debug__ = False
时失效。要么只用在 unitest,要么(我觉得)可以自己写一个yourproject.utils.asserts.ok(a == b)
这样的包装函数。 - 命令行工具可能会遭遇 timing attacks, 导致密码被破解, 可以使用 secrets.compare_digest 比较密码。
- 不污染 global site-packages, 工具安装在一个 virtualenv 里
- 使用 mkstemp 布尔斯 mktemp, 不然另外一个进程可能也会同时创建出这个文件导致进程执行不确定的内容。
yaml.load
也是不安全的,使用yaml.safe_load
。- 绝对不要unpickle 来自不信赖来源的 pickle 数据包,一定要的话,用 JSON
- 定期升级系统 Python 和一些软件包