স্পষ্ট : এটি খুব শক্তিশালী, তবে আপনি যদি অবিশ্বস্ত ইনপুট থেকে মূল্যায়ন করতে স্ট্রিং গ্রহণ করেন তবে এটি খুব বিপজ্জনক। মনে করুন স্ট্রিংটি মূল্যায়ন করা হচ্ছে "os.system ('rm -rf /')"? এটি সত্যিই আপনার কম্পিউটারের সমস্ত ফাইল মুছতে শুরু করবে।
ast.literal_eval:
একটি এক্সপ্রেশন নোড বা পাইথন আক্ষরিক বা ধারক প্রদর্শনযুক্ত একটি স্ট্রিং নিরাপদে মূল্যায়ন করুন। সরবরাহ করা স্ট্রিং বা নোডে কেবলমাত্র পাইথনের আক্ষরিক কাঠামো থাকতে পারে: স্ট্রিং, বাইটস, সংখ্যা, টিপলস, তালিকা, ডিক্টস, সেটস, বুলিয়ানস, কোনওটি নয়, বাইটস এবং সেটগুলি।
বাক্য গঠন:
eval(expression, globals=None, locals=None)
import ast
ast.literal_eval(node_or_string)
উদাহরণ:
# python 2.x - doesn't accept operators in string format
import ast
ast.literal_eval('[1, 2, 3]') # output: [1, 2, 3]
ast.literal_eval('1+1') # output: ValueError: malformed string
# python 3.0 -3.6
import ast
ast.literal_eval("1+1") # output : 2
ast.literal_eval("{'a': 2, 'b': 3, 3:'xyz'}") # output : {'a': 2, 'b': 3, 3:'xyz'}
# type dictionary
ast.literal_eval("",{}) # output : Syntax Error required only one parameter
ast.literal_eval("__import__('os').system('rm -rf /')") # output : error
eval("__import__('os').system('rm -rf /')")
# output : start deleting all the files on your computer.
# restricting using global and local variables
eval("__import__('os').system('rm -rf /')",{'__builtins__':{}},{})
# output : Error due to blocked imports by passing '__builtins__':{} in global
# But still eval is not safe. we can access and break the code as given below
s = """
(lambda fc=(
lambda n: [
c for c in
().__class__.__bases__[0].__subclasses__()
if c.__name__ == n
][0]
):
fc("function")(
fc("code")(
0,0,0,0,"KABOOM",(),(),(),"","",0,""
),{}
)()
)()
"""
eval(s, {'__builtins__':{}})
উপরের কোডে ().__class__.__bases__[0]
নিজের আপত্তি ছাড়া আর কিছুই নয়। এখন আমরা সমস্ত উপশ্রেণী ইনস্ট্যান্ট করেছিলাম , এখানে আমাদের মূল enter code here
লক্ষ্য এটি থেকে এন নামের একটি শ্রেণি খুঁজে পাওয়া।
আমাদের তাত্ক্ষণিক সাবক্লাসগুলি থেকে code
আপত্তি করা এবং function
আপত্তি করা দরকার । এটি CPython
অবজেক্টের সাবক্লাস অ্যাক্সেস এবং সিস্টেমটি সংযুক্ত করার বিকল্প উপায় ।
পাইথন থেকে ৩.7 অ্যাস্ট.লাইটারাল_ওয়াল () এখন আরও কঠোর। স্বেচ্ছাসেবী সংখ্যার যোগ এবং বিয়োগের অনুমতি দেওয়া হয় না। লিংক
ast.literal_eval("1 & 1")
একটি ত্রুটি নিক্ষেপ করবে কিন্তুeval("1 & 1")
করবে না।