2012-05-12 57 views
5

下面是一個例子類:正在受控條件下使用'exec'是否存在安全威脅?

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 

正如你所看到的,我使用exec優化多個property()對象的創建。我經常讀到使用exec很糟糕,它是您的程序中的一個安全漏洞。在這種情況下,是嗎?

回答

6

在這種情況下,這不是真正的安全威脅,因爲當執行的字符串是用戶有權訪問的某些內容時,會出現安全威脅。在這種情況下,它是一個拆分字符串文字。

但是,即使這不是安全風險,exec幾乎總是一個不好的選擇。爲什麼不用getattrsetattr來代替?

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)) 

一個缺陷是,這已在__init__方法來完成,所以這取決於你是否有一個很好的理由不將其列入那裏。

+3

+1。幾乎總是有'eval()'和'exec()'的替代方法。 –

+0

它可以很容易地在類裝飾器中添加類屬性而不是實例屬性。 – agf

0

使用執行與可信數據是好的;然而,在這種情況下,它不是必需的,會減慢你的腳本。

相關問題