eval:
Điều này rất mạnh mẽ, nhưng cũng rất nguy hiểm nếu bạn chấp nhận các chuỗi để đánh giá từ đầu vào không đáng tin cậy. Giả sử chuỗi được đánh giá là "os.system ('rm -rf /')"? Nó thực sự sẽ bắt đầu xóa tất cả các tập tin trên máy tính của bạn.
ast.literal_eval: Đánh
giá một cách an toàn một nút biểu thức hoặc một chuỗi chứa màn hình hiển thị bằng chữ hoặc container của Python. Chuỗi hoặc nút được cung cấp chỉ có thể bao gồm các cấu trúc bằng chữ Python sau: chuỗi, byte, số, bộ dữ liệu, danh sách, dicts, bộ, booleans, Không, byte và bộ.
Cú pháp:
eval(expression, globals=None, locals=None)
import ast
ast.literal_eval(node_or_string)
Thí dụ:
# 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__':{}})
Trong đoạn mã trên ().__class__.__bases__[0]
không có gì ngoài chính đối tượng. Bây giờ chúng tôi khởi tạo tất cả các lớp con , ở đây enter code here
mục tiêu chính của chúng tôi là tìm một lớp có tên n từ nó.
Chúng ta cần code
đối tượng và function
đối tượng từ các lớp con khởi tạo. Đây là một cách khác CPython
để truy cập các lớp con của đối tượng và đính kèm hệ thống.
Từ python 3.7 ast.literal_eval () bây giờ chặt chẽ hơn. Phép cộng và phép trừ các số tùy ý không còn được phép. liên kết
ast.literal_eval("1 & 1")
sẽ ném một lỗi nhưngeval("1 & 1")
sẽ không.