Vulnerabilidad en la función input() – Python 2.x

Este artículo tiene como objetivo explicar y explorar la vulnerabilidad en la función input() en Python 2.x. En Python 3, la función raw_input() se borró y su funcionalidad se transfirió a una nueva función integrada conocida como input().

Diferentes formas de ingresar datos en Python 2.x

Hay dos métodos comunes para recibir entradas en Python 2.x:

  1. Uso de la función input(): esta función toma el valor y el tipo de la entrada que ingresa tal como está sin modificar ningún tipo.
  2. Usando la función raw_input() : esta función convierte explícitamente la entrada que das para escribir una string,

Usemos el siguiente programa para determinar la diferencia entre los dos: 

Python

# Python 2.x program to show differences between
# input() and rawinput()function
 
# 3 inputs using raw_input() function,
# after which data type of the value
# entered is displayed
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 inputs using input() function,
# after which data type of the value
# entered is displayed
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)

Aporte:

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

Producción:

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 to test input() function: <type 'str'>
Enter input to test input() function: <type 'list'>

Nota: Al proporcionar una entrada de string en la función input(), tenemos que encerrar el valor entre comillas dobles. Esto no es necesario en raw_input()

Vulnerabilidad en el método input()

La vulnerabilidad en el método input() radica en el hecho de que cualquier persona puede acceder a la variable que accede al valor de entrada simplemente usando el nombre de la variable o método. Exploremos esto uno por uno:

Nombre de variable como parámetro de entrada: 

La variable que tiene el valor de la variable de entrada puede acceder directamente al valor de la variable de entrada. 

Python

# Python 2.x program to show Vulnerabilities
# in input() function using a variable
 
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

Python3

# Python 3  to demonstrate difference in input() function
 
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

Aporte:

15

Producción:

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

Aporte:

secret_number

Producción:

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

Como se puede ver, en el segundo caso se puede dar directamente como entrada la variable “secret_number” y la respuesta siempre es “Tú ganaste”. Evalúa la variable como si se hubiera ingresado un número directamente, lo que significa que siempre devuelve un valor booleano verdadero. Usar raw_input no sería posible ya que no permite leer la variable directamente.

Python 3 muestra resultados diferentes. Si se proporciona “número_secreto” como entrada, la respuesta es ‘Usted pierde’.

Nombre de la función como parámetro: 

La vulnerabilidad radica aquí, ya que incluso podemos proporcionar el nombre de una función como valores de entrada y acceso a los que de otro modo no se debería acceder. 

Python

# Python 2.x program to demonstrate input() function
# vulnerability by passing function name as parameter
secret_value = 500
 
# function that returns the secret value
def secretfunction():
    return secret_value
 
# using raw_input() to enter the number
input1 = raw_input("Raw_input(): Guess secret number: ")
 
# input1 will be explicitly converted to a string
if input1 == secret_value:
    print "You guessed correct"
else:
    print "wrong answer"
     
# using input() to enter the number
input2 = input("Input(): Guess the secret number: ")
 
#input2 is evaluated as it is entered
if input2 == secret_value:
    print "You guessed correct"
else:
    print "wrong answer"

Aporte:

400
secretfunction()

Producción:

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

En este conjunto de entrada/salida, podemos ver que cuando usamos raw_input, necesariamente tenemos que ingresar el número correcto. Sin embargo, mientras usamos la función input(), incluso podemos proporcionar el nombre de una función o variable, y el intérprete lo evaluará. Aquí, por ejemplo, la entrada para la función input() se ha dado como el nombre de una función ‘secretfunction()’. El intérprete evalúa esta llamada de función y devuelve el número secreto que deseamos encontrar y, por lo tanto, si la condición se evalúa como verdadera, aunque no hayamos ingresado el número secreto Entrada:

secretfunction()
secret_value

Producción:

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

Como se explicó en el primer punto, en este ejemplo también pudimos simplemente ingresar el nombre de la variable ‘secret_number’ en la entrada de la función ‘input()’ y pudimos acceder al valor secreto. Sin embargo, al intentar llamar a secretfunction() en la entrada de la función raw_input(), nos da false ya que el intérprete convierte nuestro argumento en una string y no lo evalúa como una llamada de función.

Prevención de vulnerabilidades de entrada

Siempre es mejor usar raw_input() en python 2.x y luego convertir explícitamente la entrada al tipo que necesitemos. Por ejemplo, si deseamos tomar la entrada de un número entero, podemos hacer lo siguiente

n = int(raw_input())

Esto evita la llamada maliciosa o la evaluación de funciones. 

Este artículo es una contribución de Deepak Srivatsav . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *