对于一个名为raw_input的通用python函数的操作方式,我感到有点困惑。
我似乎对输入我想要的多少字符没有任何限制。函数help也似乎不要求将最大数量的字符作为参数,如下所示(它只允许用户输入提示消息)。
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.....谢谢和亲切的问候
约翰
发布于 2015-10-04 12:30:04
缓冲区溢出攻击是一个不同的主题,只要raw_input的实现是正确的(这意味着它不会在为存储输入而分配的缓冲区之外写入),因此在这里不适用。让我们假设input_raw的实现是安全的。
与python中的许多结构一样,raw_input将将其输入存储在动态分配和动态增加的缓冲区中。最初分配的用于存储输入的缓冲区通常很小(可能有几十个元素),当您不断地填充缓冲区时,它会不断地扩展(用更大的大小重新分配以容纳更多的元素)。
当然,由于操作系统、硬件限制和实现本身的原因,存在一个硬限制。对于运行32位python的32位平台,限制最有可能是2**32-1 (4 Gibi字节或至少2)。
在最坏的情况下,如果没有操作系统强制的每个进程限制,python可能耗尽系统内存。但是即使在Linux上--例如,oom处理程序--会杀死内存使用率最高的进程,这完全可能是错误行为的python进程(但也可能是另一个合法的进程)。
发布于 2015-10-04 13:06:15
在sys.maxsize中可以找到Python长度的硬限制
平台的Py_ssize_t类型所支持的最大正整数,因此最大大小列表、字符串、数据集和许多其他容器可以具有。
在32位系统中,sys.maxsize为2147483647,即2立方米-1.当然,在达到此大小之前,可能会应用内存限制。
如果Python由于内存不足无法创建对象,则会引发MemoryError异常。如果您有足够的内存,但试图超过sys.maxsize,则会引发OverflowError。
如果您可以阅读C,您可能会对raw_input &/或Python3 input的源代码感兴趣,这两者都是用在cpython源代码中实现的输入?链接的。但是,如果可用,raw_input (和Python3 input)将从库调用readline()函数,因此您需要深入研究这个函数,以全面回答您的问题。
FWIW,如果您的接受控制台输入的Python脚本在类似Unix的系统上运行,那么import readline最好在raw_input / input提示符下输入数据时提供Readline的编辑工具。
我想我应该提到Python2还提供了一个名为input()的函数,本质上是eval(raw_input())。这个函数可能是危险,通常应该避免。
https://stackoverflow.com/questions/32933188
复制相似问题