`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।