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