eval:
यह बहुत शक्तिशाली है, लेकिन यह भी बहुत खतरनाक है यदि आप अविश्वासित इनपुट से मूल्यांकन करने के लिए तार स्वीकार करते हैं। मान लीजिये स्ट्रिंग का मूल्यांकन किया जा रहा है "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उद्देश्य है कि हम इसमें से n नाम के एक वर्ग की खोज करें ।
हमें तात्कालिक उपवर्गों से codeवस्तु और functionवस्तु की आवश्यकता है । यह CPythonऑब्जेक्ट के उप-वर्ग तक पहुंचने और सिस्टम को संलग्न करने का एक वैकल्पिक तरीका है।
अजगर से 3.7 ast.literal_eval () अब सख्त है। मनमाना संख्याओं के जोड़ और घटाव की अब अनुमति नहीं है। संपर्क
ast.literal_eval("1 & 1")एक त्रुटि फेंक देंगे, लेकिनeval("1 & 1")नहीं करेंगे।