缓冲区溢出Python中的保护机制

时间:2015-10-04 11:56:52

标签: python buffer-overflow python-internals

我对一个名为raw_input的常见python函数的运行方式感到有些困惑。

我似乎对input however many chars I want here没有任何限制。函数help似乎也没有要求最大字符数作为参数,如下所示(它只允许用户输入提示信息)。

C with D

如果数据从用户读入作为字符串 - 这基本上是一个字符数组 - 如下所示,Python如何停止缓冲区溢出攻击或任何消耗过多内存的尝试?

raw_input(...)
    raw_input([prompt]) -> string

    Read a string from standard input.  The trailing newline is stripped. If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.On Unix, GNU readline is used if enabled.  The prompt string, if given, is printed without a trailing newline before reading.

谢谢和亲切的问候,

约翰

2 个答案:

答案 0 :(得分:2)

缓冲区溢出攻击是一个不同的主题,只要raw_input的实现正确(意味着它没有写入已分配用于存储输入的缓冲区),它就不适用于此处。 让我们假设input_raw的实现是安全的。

与python中的许多结构一样,raw_input将其输入存储在动态分配且动态增加的缓冲区中。用于存储输入的最初分配的缓冲区通常很小(可能是几十个元素),并且随着您不断填充缓冲区,它会不断扩展(重新分配更大的大小以容纳更多元素)。

由于操作系统,硬件限制以及实施本身,确实存在硬限制。对于运行32位python的32位平台,限制很可能是2 ** 32-1(4 Gibibytes或至少2)。

在最坏的情况下,如果操作系统没有强制执行每个进程限制,python可能会耗尽系统内存。但即便如此,在Linux上,例如oom处理程序将终止使用最高内存的进程,这可能正是python进程行为不端(但它也可能是另一个合法进程)。

答案 1 :(得分:2)

可以在sys.maxsize中找到Python字符串长度的硬限制:

  

平台Py_ssize_t支持的最大正整数   类型,因此最大尺寸列表,字符串,dicts和许多其他   容器可以有。

在32位系统上,sys.maxsize为2147483647,即2³¹-1。当然,在达到该大小之前,可能会存在内存限制。

如果Python由于内存不足而无法创建对象,则会引发MemoryError异常。如果您有足够的内存但是尝试超过sys.maxsize则会引发OverflowError。

如果您可以阅读C,您可能有兴趣查看raw_input& /或Python 3 input的源代码,这两个代码都链接在Where is raw_input implemented in the cpython source code?中。但是,raw_input(以及Python 3 input)会调用GNU Readline library中的readline()函数(如果可用),因此您需要深入研究它以完全回答您的问题

FWIW,如果您的Python脚本采用控制台输入在类Unix系统上运行,import readlineraw_input / {{输入数据时使Readline的编辑工具可用是个不错的主意。 1}}提示。


我想我应该提到Python 2还提供了一个名为input的函数,它本质上是input()。此功能可能dangerous,通常应避免使用。