
434
|
第 13 章 執行的控制
永遠都不要 exec 或 eval 不受信任的程式碼
舊版的 Python 試著提供工具來減低使用
exec
和
eval
的風險,並以「受限
的執行(restricted execution)」來稱呼它們,但那些工具對上聰明駭客的
高超手法時,永遠都不是完全安全的,而目前版本的 Python 也因此捨棄
了它們。如果你需要防備這種攻擊,就善用你作業系統的防護機制:在分
開的個別行程中執行不受信任的程式碼,並讓它們的權限盡可能受到限制
(研究你的 OS 為此所提供的機制,例如
chroot
、
setuid
與
jail
),或是在
分開的、高度受限的虛擬機器中執行不信任的程式碼。要防備「阻斷服務
(denial of service)」攻擊,就讓主行程監視分別的行程,並在資源消耗過
度時終止它們。行程(processes)涵蓋於後面的「執行其他程式」中。
不受信任的程式碼對
exec
和
eval
來說很不安全
函式
exec_with_data
用於不受信任的程式碼時很不安全:
如果你傳入作為引數
user_code_string
的字串是以你無法
完全
信任的方式取得的,那麼它可能造成的損害,基本上
是沒有限制的。很遺憾地,對於
exec
和
eval
的任何使用來
說,幾乎也都是這樣,除了那些你可以對要執行或估算的
程式碼設下非常嚴格且可檢查的限制的罕見情況,如函式
safer_eval
那樣。
內部型別
本節中的某些內部 Python 物件很難使用。要正確使用這種物件以達到好的
效果,你得研讀你 Python 實作的某些 ...