Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ช่องโหว่ Python ในฟังก์ชัน input()


ในบทความนี้ เราจะเรียนรู้เกี่ยวกับการทำงานของฟังก์ชันอินพุตในลักษณะที่ไม่พึงปรารถนาในเวอร์ชัน 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:ตอนนี้ มาสร้างเกมลูกเต๋าโดยใช้โมดูลแบบสุ่มกันเถอะ

ตัวอย่าง

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 และเอาต์พุตถูกสร้างขึ้น

ซึ่งเป็นอันตรายอย่างยิ่งที่จะใช้ในกรณีที่ต้องจัดการกับข้อมูลที่สำคัญและเป็นความลับ เช่น หมุดและรหัสผ่าน ซึ่งสามารถแก้ไขได้โดยใช้ raw_input() ที่มีให้ใน Python 2.x

จากภาพประกอบทั้งสองข้างต้น จะเห็นได้ชัดว่าฟังก์ชันอินพุตทำให้โปรแกรมพร้อมสำหรับการโจมตีแบบ Variable โดยตรง

บทสรุป

ในบทความนี้ เราได้เรียนรู้ว่าพบปัญหาและช่องโหว่ใดบ้างขณะใช้ฟังก์ชัน input() ใน Python 2.x จำเป็น