Nếu tôi đánh giá một chuỗi Python sử dụng eval(), và có một lớp học như:Bảo mật của eval() của Python trên các chuỗi không đáng tin cậy?
class Foo(object):
a = 3
def bar(self, x): return x + a
những rủi ro bảo mật nếu tôi không tin tưởng vào chuỗi là gì? Cụ thể:
- Có phải
eval(string, {"f": Foo()}, {})
không an toàn? Đó là, bạn có thể đạt được os hoặc sys hoặc một cái gì đó không an toàn từ một ví dụ Foo? - Có phải
eval(string, {}, {})
không an toàn? Đó là, tôi có thể tiếp cận os hoặc sys hoàn toàn từ nội trang như len và danh sách? - Có cách nào để tạo nội trang không có trong ngữ cảnh eval không?
Có một số chuỗi không an toàn như "[0] * 100000000" Tôi không quan tâm, bởi vì lúc tồi tệ nhất chúng làm chậm/dừng chương trình. Tôi chủ yếu quan tâm đến việc bảo vệ dữ liệu người dùng bên ngoài chương trình.
Rõ ràng, eval(string)
không có từ điển tùy chỉnh không an toàn trong hầu hết các trường hợp.
có, nếu có nhập sys sys.dostuff trong chuỗi bạn đang thực hiện đánh giá và bạn không tin tưởng vào chuỗi nội dung có thể trở nên thực sự xấu xí. – Vasil
eval có thuộc tính đẹp, nó chỉ cho phép biểu thức. Vì vậy, những thứ như =, nhập khẩu và in ấn không được phép. –
Hãy thử 'eval ('__ import __ (" sys "). Stdout.write (" Hello Joe ")')' –