Computer >> Máy Tính >  >> Lập trình >> Python

Lỗ hổng Python trong hàm input ()

Trong bài viết này, chúng ta sẽ tìm hiểu về cách hàm đầu vào hoạt động theo cách không mong muốn trong phiên bản 2.x. Hoặc sớm hơn. Trong phiên bản 2.x. hàm raw_input () hoạt động thay thế cho hàm input (). Trong các phiên bản mới hơn 3.x. hoặc sau đó, tất cả các tính năng &chức năng mong muốn của cả hai hàm đều được hợp nhất vào hàm input ().

Trước tiên, hãy xem kiểu đầu vào của các hàm tích hợp để lấy đầu vào trong Python 2.x.

Ví dụ

# 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)

Đầu ra

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:

Giải thích - Từ đầu ra, rõ ràng là hàm raw_input chuyển đổi rõ ràng đầu vào thành kiểu chuỗi bất kể loại đầu vào được cung cấp. Ngược lại, hàm nhập vẫn giữ nguyên kiểu dữ liệu như được cung cấp trong quá trình nhập.

Bây giờ sau khi xem ví dụ trên, bạn có thể tự hỏi rằng nếu hàm đầu vào giữ nguyên kiểu dữ liệu thì tại sao nó lại dễ bị tấn công? Hãy làm rõ điều này bằng cách sử dụng một minh họa -

MINH HỌA 1:Bây giờ chúng ta hãy tạo trò chơi xúc xắc bằng mô-đun ngẫu nhiên.

Ví dụ

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

Giải thích - Trong trường hợp người dùng cung cấp đầu vào là số nguyên thì đầu ra mong muốn theo biểu thức điều kiện sẽ được tính toán tương ứng.

Trong trường hợp người dùng cung cấp đầu vào chuỗi, tức là trùng với tên biến trong đó chúng tôi lưu trữ số nguyên ngẫu nhiên được tạo bởi xúc xắc bằng mô-đun ngẫu nhiên, thì đầu ra cũng được tính toán. Nhưng đây không phải là đầu ra mong muốn mà chúng ta muốn tính toán. Trên thực tế, nó phải phát sinh lỗi mang kiểu đầu vào sai khi nhập chuỗi. Nó coi tên biến tương đương với một số do người dùng nhập trực tiếp, Biểu thức mang lại giá trị True Boolean và trò chơi kết thúc. Ngược lại, nếu tôi sử dụng raw_input () để thay thế, thì không gặp phải vấn đề nào như vậy.

Lỗ hổng này có thể gây tử vong trong trường hợp chúng tôi đang lưu trữ thông tin đăng nhập, chi tiết người dùng và mật khẩu tài khoản.

MINH HỌA 1:Bây giờ chúng ta hãy tạo một hệ thống yêu cầu mã pin và so sánh với giá trị được lưu trữ.

Ví dụ

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"

Giải thích

Như chúng ta đã thảo luận trong MINH HỌA trước đó rằng trong trường hợp đầu vào được cung cấp là kiểu số nguyên, thì hàm hoạt động bình thường. Nhưng trong mọi trường hợp người dùng cung cấp đầu vào giống với giá trị trả về của hàm, thì điều kiện sẽ trở thành Đúng và đầu ra được tạo ra.

Điều này rất nguy hiểm khi sử dụng trong trường hợp xử lý các phần thông tin quan trọng và bí mật như ghim và mật khẩu. Điều này có thể được khắc phục bằng cách sử dụng raw_input () được cung cấp trong Python 2.x.

Từ hai Chứng chỉ trên, rõ ràng là hàm input làm cho chương trình sẵn sàng để tấn công trực tiếp Variable.

Kết luận

Trong bài viết này, chúng tôi đã tìm hiểu tất cả các vấn đề và sơ hở gặp phải khi sử dụng hàm input () trong Python 2.x. cần thiết.