我对一个名为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.
谢谢和亲切的问候,
约翰
答案 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 readline
在raw_input
/ {{输入数据时使Readline的编辑工具可用是个不错的主意。 1}}提示。
我想我应该提到Python 2还提供了一个名为input
的函数,它本质上是input()
。此功能可能dangerous,通常应避免使用。