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:
- 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.
- 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