2012-05-12 27 views
5

Dưới đây là một lớp dụ:Có sử dụng 'exec' trong điều kiện kiểm soát một mối đe dọa bảo mật không?

from datetime import datetime 
class Article: 
    published = datetime.now() 
    for propname in "year month day hour minute second".split(): 
     exec "%s = property(lambda self: self.published.%s)"%(propname, propname) 
    del propname 

Như bạn thấy, tôi đang sử dụng exec để tối ưu hóa việc tạo ra nhiều property() đối tượng. Tôi thường đọc rằng sử dụng exec là xấu và rằng nó là một lỗ hổng bảo mật trong chương trình của bạn. Trong trường hợp này, phải không?

Trả lời

6

Trong trường hợp này, nó không thực sự là một mối đe dọa an ninh, vì các mối đe dọa bảo mật phát sinh khi chuỗi thực hiện là một cái gì đó mà người dùng có bất kỳ loại truy cập nào. Trong trường hợp này, nó là một chuỗi ký tự phân tách.

Tuy nhiên, ngay cả khi đó không phải là rủi ro bảo mật, thì exec hầu như luôn là lựa chọn không tốt. Tại sao không sử dụng getattrsetattr thay thế?

from datetime import datetime 
class Article: 
    published = datetime.now() 

    def __init__(self): 
     for propname in "year month day hour minute second".split(): 
      setattr(self, propname, getattr(self.published, propname)) 

Một lỗ hổng là điều này phải được thực hiện trong phương pháp __init__, vì vậy nó phụ thuộc vào việc bạn có một lý do chính đáng không bao gồm nó ở đó.

+3

+1 cho điều này. Có gần như luôn luôn là một thay thế cho 'eval()' và 'exec()'. –

+0

Nó có thể dễ dàng được thực hiện trong một trang trí lớp để thêm các thuộc tính lớp thay vì các thuộc tính dụ. – agf

0

Sử dụng exec với dữ liệu tin cậy là không sao; tuy nhiên, trong trường hợp này nó không cần thiết và sẽ làm chậm kịch bản của bạn.

Các vấn đề liên quan