10.3. Python

与任何语言一样,要警惕任何允许将数据作为程序的一部分执行的函数,以确保不受信任的用户无法影响其输入。 这包括 exec()、eval() 和 execfile()(坦率地说,您应该仔细检查任何对 compile() 的调用)。 input() 语句也出人意料地危险。[Watters 1996, 150]。

具有可以被非特权用户调用的特权的 Python 程序(例如,setuid/setgid 程序)绝不能导入 ``user'' 模块。 user 模块会导致读取和执行 pythonrc.py 文件。 由于此文件将受不受信任的用户控制,因此导入 user 模块允许攻击者强制受信任的程序运行任意代码。

Python 几乎不做编译时检查——它基本上没有编译时类型信息,甚至不检查为给定函数或方法传递的参数数量是否合法。 这是不幸的,导致了很多潜在的错误(John Viega 和我都经历过这个问题)。 希望有一天 Python 将实现可选的静态类型和类型检查,这个想法已经被讨论了一段时间。 目前的一个部分解决方案是 PyChecker,一个类似 lint 的程序,用于检查 Python 源代码中的常见错误。 您可以从 http://pychecker.sourceforge.net 获取 PyChecker

Python 通过其 RExec 类包含对“受限执行”的支持。 这主要用于执行小程序和移动代码,但即使代码不是从外部提供的,它也可以用于限制程序中的特权。 默认情况下,受限执行环境允许读取(但不允许写入)文件,并且不包括用于网络访问或 GUI 交互的操作。 这些默认值可以更改,但要注意在受限环境中创建漏洞。 特别是,允许用户不受限制地向类添加属性允许各种破坏环境的方法,因为 Python 的实现调用了许多“隐藏”方法。 请注意,默认情况下,大多数 Python 对象都是通过引用传递的; 如果您将对可变值的引用插入到受限程序的执行环境中,则受限程序可以以在受限环境之外可见的方式更改对象! 因此,如果您想授予对可变值的访问权限,在许多情况下,您应该复制可变值或使用 Bastion 模块(它支持对另一个对象的受限访问)。 有关更多信息,请参阅 Kuchling [2000]。 我不确定受限执行功能已经过多少审计,因此程序员要当心。