简评:编写安全代码很困难,当你学习一个编程语言、模块或框架时,你会学习其使用方法。 在考虑安全性时,你须要考虑如何避免被滥用,Python
也不例外,即便在标准库中,也存在用于编写应用的不良实践。然而,许多 Python 开发人员却根本不知道它们。
接上篇python
6. 解析 XML(Parsing XML)编程
若是你的应用程序要加载、解析 XML 文件,则你可能正在使用 XML 标准库模块。经过 XML 的攻击大可能是 DoS 风格(旨在使系统崩溃而不是泄露数据),这些攻击十分常见,特别是在解析外部(即不可信任的)XML 文件时。安全
其中有个「billion laughs」,由于他的 payload 一般包含不少(十亿)「lols」。基本上,这个原理是能够在 XML 中使用参照实体,因此当解析器将这个 XML 文件加载到内存中时,它会消耗数 G 大小的内存(RAM)。框架
试试看,若是你不相信个人话 :-)编程语言
<?xml version="1.0"?> <!DOCTYPE lolz [ <!ENTITY lol "lol"> <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> ]> <lolz>&lol9;</lolz>
须要考虑的另外一种状况是依赖的第三方软件包须要解码 XML ,例如配置文件、远程 API。你甚至可能不知道某个依赖关系会将这些类型的攻击置之不理。学习
修复:测试
使用 defusedxml 替换标准库模块,它增长了针对这些类型攻击的安全防御。code
7. 受污染的 site-packages 或 import 路径xml
Python 的 import 系统很是灵活,当你想要为测试写猴子补丁或重载核心功能时,这是很是棒的。进程
但这倒是 Python 中最大的安全漏洞之一。
安装第三方软件包,不管是在虚拟环境中仍是全局(一般不鼓励)都会让你看到这些软件包中的安全漏洞。有一些发布到 PyPi 的软件包与流行的软件包具备类似的名称,可是却执行了任意代码。
须要考虑的另外一种状况是依赖的依赖,他们可能包含漏洞,他们也能够经过导入系统覆盖Python 中的默认行为。
修复:
看看 http://PyUp.io 及其安全服务,为全部应用程序使用虚拟环境,并确保全局的 site-packages 尽量干净,检查包签名。
8. 序列化 Pickles
反序列化 pickle 数据和 YAML 同样糟糕。Python 类能够声明一个 reduce 方法,该方法返回一个字符串,或一个可调用的元组以及使用 pickle 序列化时调用的参数。攻击者可使用它来包含对其中一个子进程模块的引用,以在主机上运行任意命令。
修复:
切勿使用 pickle 反序列化不受信任或未经身份验证来源的数据。改用另外一种序列化模式(如JSON)。
9. 使用系统 Python 运行时而且不修复它
大多数 POSIX 系统都自带有一个 Python 2 版本(一般是旧版本)。
有时候 Python(即 CPython 是用 C 语言编写的) 解释器自己存在漏洞, C 中的常见安全问题与内存分配有关,因此大可能是缓冲区溢出错误,CPython 多年来一直存在一些溢出漏洞,每一个漏洞都在后续版本中进行了修复。也就是说,若是及时升级 python 运行时,就很安全。
修复:
为生产应用程序安装最新版本的 Python,并及时安装修复更新!
10. 不修复依赖关系
相似于不修补 python 运行时,还须要按期修补依赖关系。
在 PyPi 的软件包中「钉住」 Python 软件包版本的作法是很糟糕的,目的是「这些是能正常工做的版本」,因此每一个人都不升级它。
上面提到的代码中的全部漏洞在第三方包中存在时一样重要,这些软件包的开发人员每时每刻都在修复安全问题。
修复:
使用像 PyUp.io 这样的服务来检查更新,向应用程序提出 pr,并运行测试以保持软件包是最新的。
原文: 10 common security gotchas in Python and how to avoid them