2015-10-04 5 views
1

Я немного смутился тем, как работает обычная функция python, называемая raw_input.Переполнение буфера Защитные механизмы в Python

У меня нет никаких ограничений на использование input however many chars I want here. Кроме того, функция 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..... 

Спасибо и наилучшие пожелания,

Джона

+0

Пожалуйста, обновите, кстати, эквивалент в современном Python называется 'input()' then. Не утруждайте себя изучением устаревшего языка. –

+0

@UlrichEckhardt да забыть python 2.7, потому что, как и C, это устаревший язык, и нет смысла изучать его, но он его использует; и как для C все эти сумасшедшие предсказания сбылись .... C# для всех !!! user1514631

+0

Вопрос OP относится к Python 3 'input()'; давайте не будем вдаваться в аргумент Python 2 vs Python 3. –

ответ

2

атака переполнения буфера другая тема, и здесь не действует до тех пор, как осуществление raw_input является правильным (то есть он не пишет за пределами буфера, который он выделил для хранения ввода). Предположим, что реализация input_raw безопасна.

Как и многие структуры в python, raw_input будет хранить свой вход в динамически распределенном и динамически увеличивающемся буфере. Первоначально выделенный буфер для хранения ввода обычно невелик (возможно, несколько десятков элементов), и по мере того как вы продолжаете заполнять буфер, он продолжает расширяться (перераспределяется с большим размером для размещения еще большего количества элементов).

Наверняка жесткий предел из-за ОС, аппаратных ограничений и из-за самой реализации. Для 32-битной платформы, на которой запущен 32-битный питон, предел, скорее всего, будет 2 ** 32-1 (4 Gibibytes или минимум 2).

В худшем случае python может исчерпать системную память, если нет ограничений по процессам, установленным ОС. Но даже в Linux, например, обработчик oom убьет процесс с наивысшим использованием памяти, что может быть именно процессом python, который является неправильным (но это может быть и еще один законный процесс).

2

жесткий предел Python длины строки можно найти в sys.maxsize:

Наибольшее положительное целое число, при поддержке платформы типа 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) вызывает функцию readline() от GNU Readline library, если доступно, поэтому вам нужно будет углубиться в это, чтобы полностью ответить на ваш вопрос.

FWIW, если ваш скрипт на Python, который принимает входные консоли работает на Unix-подобные системы это хорошая идея, чтобы сделать import readline редактирование объектов Readline, имеющимися в наличии при вводе данных в raw_input/input строке.


Я полагаю, я должен упомянуть, что Python 2 также предоставляет функцию с именем input(), которая является по существу eval(raw_input()). Эта функция потенциально может быть dangerous, и ее обычно следует избегать.