কম্পিউটার টিউটোরিয়াল

পাইথনে eval() ফাংশন – ডাইনামিক কোড এক্সিকিউশন এবং সিকিউরিটি রিস্ক

`eval()` মেথড একটি স্ট্রিং এক্সপ্রেশন পার্স করে এবং প্রোগ্রামের ভিতরে সেটি এক্সিকিউট করে। অন্য কথায়, এটি একটি স্ট্রিংকে পাইথন কোড হিসেবে ইন্টারপ্রেট করে।

সিনট্যাক্স

eval(expression, globals=None, locals=None)
  • Expression: পাইথন এক্সপ্রেশন স্ট্রিং।
  • globals: গ্লোবাল মেথড/ভেরিয়েবল ডিকশনারি।
  • locals: লোকাল মেথড/ভেরিয়েবল ডিকশনারি।

বেসিক উদাহরণ

user_expr = input("Enter expression in terms of a: ")
a = int(input("Enter value of a: "))
result = eval(user_expr)
print("Result =", result)

আউটপুট

Enter expression in terms of a: a*(a-3)+a^2
Enter value of a: 7
Result = 33

সিকিউরিটি ইস্যু ও প্রতিরোধ

`eval()` ব্যবহার করলে সিকিউরিটি ভালনרבিলিটি হতে পারে, কারণ ইউজার সিস্টেম কমান্ড (যেমন ফাইল ডিলিট) দিয়ে দূষিত কোড রান করতে পারে। নিচের উপায়গুলো ব্যবহার করে রেস্ট্রিক্ট করা যায়:

১. globals এবং locals উভয়ই ओমিট করুন

তবে করেন্ট স্কোপের বাহিরের ভেরিয়েবল অ্যাক্সেসIBLE হবে না।

২. শুধু locals ওমিট করুন, globals-এ খালি ডিকশনারি পাস করুন

from time import *
print(eval('dir()', {}))

আউটপুট

['__builtins__']

শুধু বিল্ট-ইন ফাংশনগুলোই অ্যাক্সেসIBLE।

৩. নির্বাচিত ফাংশনগুলো globals-এ পাস করুন

from time import *
print(eval('dir()', {'sleeptime': sleep, 'Localtime': localtime}))

আউটপুট

['Localtime', '__builtins__', 'sleeptime']

৪. globals এবং locals উভয়ই রেস্ট্রিক্ট করুন (সর্বোচ্চ সিকিউর)

from time import *
a = 1445945763
print(eval('gmtime(a)', {'__builtins__': None}, {'a': a, 'gmtime': gmtime}))

আউটপুট

time.struct_time(tm_year=2015, tm_mon=10, tm_mday=27, tm_hour=11, tm_min=36, tm_sec=3, tm_wday=1, tm_yday=300, tm_isdst=0)

শুধু নির্দিষ্ট ফাংশন (`gmtime`) এবং ভেরিয়েবল (`a`) অ্যাক্সেসIBLE।

  1. পাইথনে লোকেশন কোঅর্ডিনেটকে টাপলে রূপান্তর করা

  2. পাইথন প্রোগ্রাম: দिये गये এক্সপ্রেশন থেকে এক্সপ্রেশন ট্রি (Expression Tree) নির্মাণ

  3. পাইথন রেগুলার এক্সপ্রেশনে মডিফায়ার (Modifiers/Flags) এর কাজ

  4. পাইথনে রেগুলার এক্সপ্রেশন কী