কম্পিউটার

ইনপুট() ফাংশনে পাইথন দুর্বলতা


এই নিবন্ধে, আমরা শিখব কিভাবে ইনপুট ফাংশন 2.x সংস্করণে একটি অবাঞ্ছিত পদ্ধতিতে আচরণ করে। বা তার আগে. সংস্করণ 2.x এ raw_input() ফাংশন input() ফাংশনের প্রতিস্থাপন হিসাবে কাজ করে। নতুন সংস্করণে 3.x. অথবা পরে উভয় ফাংশনের সমস্ত পছন্দসই বৈশিষ্ট্য এবং কার্যকারিতা ইনপুট() ফাংশনে একত্রিত করা হয়৷

প্রথমে আসুন পাইথন 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

ব্যাখ্যা − যদি ব্যবহারকারী একটি পূর্ণসংখ্যা ইনপুট প্রদান করে তাহলে শর্তসাপেক্ষ অভিব্যক্তি অনুযায়ী পছন্দসই আউটপুট সেই অনুযায়ী গণনা করা হবে৷

যদি ব্যবহারকারী একটি স্ট্রিং ইনপুট প্রদান করে যেমন পরিবর্তনশীল নামের সাথে অভিন্ন যেখানে আমরা র্যান্ডম মডিউল ব্যবহার করে ডাইস দ্বারা তৈরি র্যান্ডম পূর্ণসংখ্যা সংরক্ষণ করি, তবে আউটপুটটিও গণনা করা হয়। তবে এটি অবশ্যই কাঙ্ক্ষিত আউটপুট নয় যা আমরা গণনা করতে চাই। প্রকৃতপক্ষে, এটি একটি স্ট্রিং ইনপুট করার সময় ভুল ইনপুট টাইপ সহ একটি ত্রুটি বাড়াতে হবে। এটি পরিবর্তনশীল নামটিকে ব্যবহারকারীর দ্বারা সরাসরি প্রবেশ করা একটি সংখ্যার সমতুল্য বিবেচনা করে, অভিব্যক্তিটি একটি সত্যিকারের বুলিয়ান মান দেয় এবং গেমটি শেষ পর্যন্ত পৌঁছে যায়। বিপরীতে, যদি আমি এর পরিবর্তে 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 হয় এবং আউটপুট উৎপন্ন হয়।

পিন এবং পাসওয়ার্ডের মতো গুরুত্বপূর্ণ এবং গোপনীয় তথ্যগুলি পরিচালনা করার ক্ষেত্রে এটি ব্যবহার করা খুবই বিপজ্জনক। পাইথন 2.x এ দেওয়া raw_input() ব্যবহার করে এটি কাটিয়ে উঠতে পারে।

উপরের দুটি চিত্র থেকে, এটা বেশ স্পষ্ট যে ইনপুট ফাংশন প্রোগ্রামটিকে সরাসরি পরিবর্তনশীল আক্রমণের জন্য প্রস্তুত করে।

উপসংহার

এই নিবন্ধে, আমরা শিখেছি যে পাইথন 2.x-এ input() ফাংশন ব্যবহার করার সময় সমস্ত সমস্যা এবং ত্রুটির সম্মুখীন হয়। প্রয়োজন।


  1. Python Tkinter-এ বাইন্ডিং ফাংশন

  2. পাইথনে issubset() ফাংশন

  3. ইন্টারসেকশন() ফাংশন পাইথন

  4. পাইথনে input() ফাংশন কি করে?