我正在建立一個網站,我有一個需要,用戶應該能夠評估一些表達式基於數據庫表中的值,而不是使用像pyparsing等工具,我正在考慮使用python本身,並且已經想出了一個足以達到我的目的的解決方案。我基本上使用eval來評估表達式並傳遞全局空字符__builtins__
,這樣就不會有任何東西可以被訪問,並且當地人從DB中得到值,如果用戶需要某些函數,我也可以通過這些函數。使用eval進行表達式評估安全性如何?
import datetime
def today():
return datetime.datetime.now()
expression = """ first_name.lower() == "anurag" and today().year == 2010 """
print eval(expression, {'__builtins__':{}}, {'first_name':'Anurag', 'today':today})
所以我的問題是,如何安全是,我有三個標準
- 我的程序或表格等someshow的用戶訪問當前的狀態可以嗎?
- 用戶可以訪問os級別的調用嗎?
- 用戶可以通過循環或使用大量內存來暫停我的系統,例如通過做範圍(10 * 8),在某些情況下,他可以例如100 ** 1000等等,所以3不是一個問題。我可以使用標記來檢查這樣的操作,無論如何,我將使用GAE,所以它不是很關心。
編輯:IMO這不是Q:661084重複的,因爲在那裏結束這一個開始,我想知道,即使__builtins__
堵塞,用戶可以做壞事?
檢查:http:// stackoverflow。com/questions/661084/pythons -eval-on-untrusted-strings – fserb 2010-01-03 05:36:19
@fserb查看編輯 – 2010-01-03 05:40:59