Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

input() 함수의 Python 취약점

<시간/>

이 기사에서는 입력 함수가 버전 2.x에서 바람직하지 않은 방식으로 동작하는 방법에 대해 배울 것입니다. 또는 더 일찍. 버전 2.x에서. raw_input() 함수는 input() 함수를 대체하는 역할을 합니다. 최신 버전 3.x. 또는 나중에 두 함수의 모든 바람직한 기능이 input() 함수로 병합됩니다.

먼저 Python 2.x에서 입력을 받기 위한 내장 함수의 입력 유형을 살펴보겠습니다.

# Input Given : String
str1 = raw_input("Output of raw_input() function: ")
print type(str1)
str2 = input("Output of input() function: ")
print type(str2)
# Input Given : Float
str3 = raw_input("Output of raw_input() function: ")
print type(str3)
str4 = input("Output of input() function: ")
print type(str4)
# Input Given : Integer
str5 = raw_input("Output of raw_input() function: ")
print type(str5)
str6 = input("Output of input() function: ")
print type(str6)

출력

Output of raw_input() function:
Output of input() function:
Output of raw_input() function:
Output of input() function:
Output of raw_input() function:
Output of input() function:

설명 − 출력에서 ​​raw_input 함수는 제공된 입력 유형에 관계없이 명시적으로 입력을 문자열 유형으로 변환한다는 것이 분명합니다. 반대로, 입력 함수는 입력 시 제공되는 것과 동일한 데이터 유형을 유지합니다.

이제 위의 예를 본 후 입력 함수가 데이터 유형을 유지하는 경우 왜 취약한지 궁금할 것입니다. 삽화를 사용하여 이것을 명확히 합시다 -

그림 1:이제 random 모듈을 사용하여 주사위 게임을 만들어 봅시다.

import random as rd
number = random.randint(1,6)
print ("Pick a number between 1 to 6")
while True:
   user_input = input("Guess the number: ")
   if user_input==number:
      print ("You guessed it right.")
      break
   else:
      print ("OOPS! try it next time.")
      continue

설명 − 사용자가 정수 입력을 제공하는 경우 조건식에 따라 원하는 출력이 그에 따라 계산됩니다.

사용자가 임의의 모듈을 사용하여 주사위에서 생성된 임의의 정수를 저장하는 변수 이름과 동일한 문자열 입력을 제공하는 경우 출력도 계산됩니다. 그러나 이것은 우리가 계산하고자 하는 원하는 출력이 아니어야 합니다. 실제로 문자열 입력 시 잘못된 입력 유형을 포함하는 오류를 발생시켜야 합니다. 변수 이름을 사용자가 직접 입력한 숫자와 동일하게 간주하며, 표현식은 True Boolean 값을 산출하고 게임은 끝납니다. 반대로 raw_input()을 사용하면 그런 문제가 발생하지 않습니다.

이 취약점은 로그인 자격 증명, 사용자 세부 정보 및 계정 암호를 저장하는 경우 치명적일 수 있습니다.

그림 1:이제 핀을 요청하고 저장된 값과 비교하는 시스템을 만들어 보겠습니다.

stored_value = 7863
def return_function():
   return stored_value
inp = input()
if inp == stored_value:
   print "You Entered Correctly"
else:
   print "Oops! It's Incorrect"

설명

이전 그림에서 논의한 바와 같이 제공된 입력이 정수형인 경우 함수가 정상적으로 작동합니다. 그러나 어떤 경우에도 사용자가 함수의 반환 값과 동일한 입력을 제공하면 조건이 True가 되어 출력이 생성됩니다.

핀 및 비밀번호와 같은 중요하고 기밀 정보를 처리하는 경우 사용하는 것은 매우 위험합니다. 이것은 Python 2.x에서 제공되는 raw_input()을 사용하여 극복할 수 있습니다.

위의 두 가지 그림에서 입력 기능이 프로그램을 직접 변수 공격에 대비하도록 만드는 것이 분명합니다.

결론

이 기사에서 우리는 Python 2.x에서 input() 함수를 사용하는 동안 발생하는 모든 문제와 허점을 배웠습니다. 필요합니다.