首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的缓冲区溢出保护机制

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

Stack Overflow用户
提问于 2015-10-04 11:56:52
回答 2查看 2.9K关注 0票数 2

对于一个名为raw_input的通用python函数的操作方式,我感到有点困惑。

我似乎对输入我想要的多少字符没有任何限制。函数help也似乎不要求将最大数量的字符作为参数,如下所示(它只允许用户输入提示消息)。

代码语言:javascript
复制
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如何阻止缓冲区溢出攻击或任何消耗过多内存的尝试?在这样的场景中,数据作为字符串从用户中读取--这基本上是一个字符数组--如下所示?

代码语言:javascript
复制
>> r=raw_input("enter something:")
enter something: dfjdfldfkdflkjdflkdjflkjfdlfdjklfdkjfdlkjfdlkfjdlkdfjlfdj..... 
>> print r
dfjdfldfkdflkjdflkdjflkjfdlfdjklfdkjfdlkjfdlkfjdlkdfjlfdj.....

谢谢和亲切的问候

约翰

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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进程(但也可能是另一个合法的进程)。

票数 2
EN

Stack Overflow用户

发布于 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())。这个函数可能是危险,通常应该避免。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32933188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档