Рубрики

Уязвимость в функции input () — Python 2.x

Цель этой статьи — объяснить и исследовать уязвимость в функции input () в Python 2.x. В Python 3 функция raw_input () была стерта, а ее функциональные возможности были перенесены в новую встроенную функцию, известную как input ().

Способы ввода данных в Python 2.x

Есть два распространенных метода получения ввода в Python 2.x:

  1. Использование функции input (): эта функция принимает значение и тип введенного вами ввода как есть, без изменения какого-либо типа.
  2. Использование функции raw_input () : эта функция явно преобразует вводимые вами данные в строку типа:

Давайте использовать следующую программу, чтобы определить разницу между ними:

# Программа Python 2.x, чтобы показать различия между
# input () и функция rawinput ()

  
# 3 ввода с использованием функции raw_input (),
# после которого тип данных значения
# введено отображается

s1 = raw_input("Enter input to test raw_input() function: ")

print type(s1)

  

s2 = raw_input("Enter input to test raw_input() function: ")

print type(s2)

  

s3 = raw_input("Enter input to test raw_input() function: ")

print type(s3)

  
# 3 входа с использованием функции input (),
# после которого тип данных значения
# введено отображается

s4 = input("Enter input to test input() function: ")

print type(s4)

  

s5 = input("Enter input to test input() function: ")

print type(s5)

  

s6 = input("Enter input to test input() function: ")

print type(s6)

Входные данные:

Hello
456
[1,2,3]
45
"goodbye"
[1,2,3]

Выход:

Enter input to test raw_input() function: <type 'str'>
Enter input to test raw_input() function: <type 'str'>
Enter input to test raw_input() function: <type 'str'>

Enter input to test input() function: <type 'int'>
Enter input totest input() function: <type 'str'>
Enter input to test input() function: <type 'list'>


Примечание.
При вводе строки в функцию input () мы должны заключать значение в двойные кавычки. Это не требуется в raw_input ()

Уязвимость в методе input ()

Уязвимость в методе input () заключается в том, что к переменной, обращающейся к значению input, может получить доступ кто угодно, просто используя имя переменной или метода. Давайте рассмотрим это по одному:

  1. Имя переменной в качестве входного параметра: переменная, имеющая значение входной переменной, может напрямую обращаться к значению входной переменной.

    # Python 2.x программа для показа уязвимостей
    # в функции input () с использованием переменной

      

    import random

    secret_number = random.randint(1,500)

    print "Pick a number between 1 to 500"

    while True:

        res = input("Guess the number: ")

        if res==secret_number:

            print "You win"

            break

        else:

            print "You lose"

            continue

    Входные данные:

    15
    

    Выход:

    Pick a number between 1 to 500
    Guess the number: You lose
    Guess the number: 
    

    Входные данные:

    secret_number
    

    Выход:

    Pick a number between 1 to 500
    Guess the number: You win
    

    Как видно, во втором случае переменная «secret_number» может быть дана непосредственно в качестве входных данных, а ответом всегда будет «Вы выиграли». Он оценивает переменную, как если бы число было введено напрямую, что означает, что он всегда возвращает True Boolean. Используя raw_input, это было бы невозможно, так как запрещает читать переменную напрямую.

  2. Имя функции в качестве параметра . Уязвимость заключается в том, что мы даже можем предоставить имя функции в качестве значений ввода и доступа, которые в противном случае не предназначены для доступа.

    # Python 2.x программа для демонстрации функции input ()
    # уязвимость, передавая имя функции в качестве параметра

    secret_value = 500

      
    # функция, которая возвращает секретное значение

    def secretfunction():

        return secret_value

      
    # используя raw_input () для ввода числа

    input1 = raw_input("Raw_input(): Guess secret number: ")

      
    # input1 будет явно преобразован в строку

    if input1 == secret_value:

        print "You guessed correct"

    else:

        print "wrong answer"

          
    # используя input () для ввода номера

    input2 = input("Input(): Guess the secret number: ")

      
    # input2 оценивается по мере ввода

    if input2 == secret_value:

        print "You guessed correct"

    else:

        print "wrong answer"

    Входные данные:

    400
    secretfunction()
    

    Выход:

    Raw_input(): Guess secret number: wrong answer
    Input(): Guess the secret number: You guessed correct
    

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

    Входные данные:

    secretfunction()
    secret_value
    

    Выход:

    Raw_input(): Guess secret number: wrong answer
    Input(): Guess the secret number: You guessed correct
    

    Как объяснено в первом пункте, в этом примере мы также смогли просто ввести имя переменной «secret_number» в функцию ввода для функции «input ()» и получить доступ к секретному значению.
    Однако, пытаясь вызвать secretfunction () во входных данных для функции raw_input (), она дает нам значение false, поскольку компилятор преобразует наш аргумент в строку, и не оценивает его как вызов функции.

Предотвращение входных уязвимостей

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

n = int(raw_input())

Это предотвращает злонамеренный вызов или оценку функций.

Эта статья предоставлена Дипаком Шриватсавом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Уязвимость в функции input () — Python 2.x

0.00 (0%) 0 votes