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

Buffer Overflow Protective mechanisms in Python

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

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

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.

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

>> r=raw_input("enter something:")
enter something: dfjdfldfkdflkjdflkdjflkjfdlfdjklfdkjfdlkjfdlkfjdlkdfjlfdj..... 
>> print r
dfjdfldfkdflkjdflkdjflkjfdlfdjklfdkjfdlkjfdlkfjdlkdfjlfdj.....

感谢和亲切的问候,

约翰

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

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

由于 OS、硬件限制和实施本身,肯定存在硬限制。对于 32 位平台 运行 32 位 python 限制很可能是 2**32-1(4 Gibibytes 或至少 2)。

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

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

中找到

The largest positive integer supported by the platform’s Py_ssize_t type, and thus the maximum size lists, strings, dicts, and many other containers can have.

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

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

如果您可以阅读 C,您可能有兴趣查看 raw_input 和/或 Python 3 input 的源代码,它们都在 [=24] 中链接=],如果可用,因此您需要深入研究才能完全回答您的问题。

FWIW,如果您的 Python 接受控制台输入的脚本在类 Unix 系统上是 运行,那么 import readline 在输入数据时使 Readline 的编辑功能可用是个好主意在 raw_input / input 提示符处。


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