এই নিবন্ধে আমরা পাইথন ২.x-এ input ফাংশন কীভাবে অনিয়মিতভাবে behave করে তা শিখব। ভার্সন ২.x-এ raw_input() ফাংশন input() ফাংশন-এর রিপ্লেসমেন্ট হিসেবে কাজ করে। nieuwere ভার্সন ৩.x বা তার পরের ভার্সনে উভয় ফাংশনের সব ডিজায়ারেবল ফিচার এবং ফাংশনালিটি input() ফাংশনে মার্জ করা হয়েছে।
প্রথমে পাইথন ২.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 ফাংশন ইনপুটকে স্পষ্টভাবে স্ট্রিং টাইপে কনভার্ট করে ইনপুটের টাইপ যাই হোক। অন্যদিকে, input ফাংশন ইনপুট দেওয়ার সময় যেই ডেটা টাইপ দেওয়া হয়েছে সেটি রিটেইন করে।
উপরের উদাহরণ देखने পর আপনি চিন্তা করতে পারেন যে যদি input ফাংশন ডেটা টাইপ রিটেইন করে তবে কেন এটি vulnerable? একটি ইলাস্ট্রেশন দিয়ে এটি স্পষ্ট করি:
ILLUSTRATION ১: এখন র্যান্ডম মডিউল ব্যবহার করে একটি ডাইস গেম বানাই।
উদাহরণ
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
ব্যাখ্যা - যদি ইউজার ইন্টিজার ইনপুট দেয় তবে কন্ডিশনাল এক্সপ্রেশন অনুযায়ী ডিজায়ারড আউটপুট কম্পিউট হবে।
যদি ইউজার স্ট্রিং ইনপুট দেয় যেটি র্যান্ডম মডিউল ব্যবহার করে ডাইস দিয়ে জেনারেট করা র্যান্ডম ইন্টিজার স্টোর করার ভেরিয়েবল নামের সাথে সাদৃশ্য ہوয়, তবে আউটপুট কম্পিউট হবে। কিন্তু এটি ডিজায়ারড আউটপুট নয় যা আমরা কম্পিউট করতে চাই। আসলে স্ট্রিং ইনপুট দিলে এরর দিতে হতো wrong input type বলে। এটি ভেরিয়েবল নামক একটি নম্বর সরাসরি ইউজার দিয়েছে বলে বিবেচনা করে। এক্সপ্রেশনটি True বুলিয়ান ভ্যালু ইয়েল্ড করে এবং গেম শেষ হয়। অন্যদিকে, যদি raw_input() ব্যবহার করতাম, তবে এমন কোনো সমস্যা হতো না।
এই ভালনারেবিলিটি সেটি ফেটাল হতে পারে যদি আমরা লগইন ক্রেডেনশিয়াল, ইউজার ডিটেইলস এবং অ্যাকাউন্ট পাসওয়ার্ড স্টোর করি।
ILLUSTRATION ২: এখন একটি সিস্টেম বানাই যা পিন চাইবে এবং স্টোরড ভ্যালুর সাথে কমপেয়ার করবে।
উদাহরণ
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"
ব্যাখ্যা
যেমন أننا পূর্বের ILLUSTRATION-এ আলোচনা করেছি যে ইনপুট যদি ইন্টিজার টাইপ হয় তবে ফাংশন নরমালি কাজ করে। কিন্তু যেকোনো কেসে ইউজার যদি ফাংশনের রিটার্ন ভ্যালুর সাথে সাদৃশ্য ইনপুট দেয়, তবে কন্ডিশনাল True হয়ে যায় এবং আউটপুট প্রোডিউস হয়।
পিন এবং পাসওয়ার্ডের মতো ক্রিটিক্যাল এবং গোপনীয় তথ্য হ্যান্ডল করার কেসে এটি খুবই বিপজ্জনক। এটি পাইথন ২.x-এ raw_input() ব্যবহার করে দূর করা যায়।
উপরের দুটি ILLUSTRATION থেকে স্পষ্ট যে input ফাংশন প্রোগ্রামকে ডায়রেক্ট ভেরিয়েবল অ্যাটাকের জন্য রেডি করে দেয়।
উপসংহার
এই নিবন্ধে আমরা পাইথন ২.x-এ input() ফাংশন ব্যবহার করার সময় কী কী সমস্যা এবং লুপহোল مواجه করতে হয় তা শিখেছি।