安全性和產生作業中的程式碼
更新:2007 年 11 月
某些程式庫的運作方式為產生程式碼,並執行它以進行呼叫端的某些作業。這種方法的基本問題在於程式庫可能會代表較不受信任的程式碼來產生程式碼並以較高的信任權限來執行它。如果呼叫端可以影響程式碼產生,這個問題會更嚴重,因此您必須確保產生的程式碼只會是您認為安全的程式碼。
您必須隨時掌握您正在產生的程式碼的種類。這表示您必須嚴格控制從使用者處得的任何數值,不論它們是加了引號的字串 (這些字串必須是逸出字元,才不會包含未預期的程式碼項目)、識別項 (必須檢查以驗證它們是不是有效的識別項) 還是其他數值。識別項可能具有危險性,因為編譯過的組件可能會被修改,讓它的識別項包含一些可能會破壞識別項的特殊字元 (雖然這通常不是安全性漏洞)。
建議您使用反射發出來產生程式碼,因為它通常可以幫助您避免許多問題。
當您編譯程式碼時,請想想惡意程式碼是否可以利用某種方式來修改它。在編譯器讀取原始程式碼之前,或是在您的程式碼載入 .dll 檔案之前,是不是有空檔時間可以讓惡意程式碼變更磁碟上的原始程式碼?如果是的話,您就必須視狀況使用程式碼存取安全性或檔案系統中的存取控制清單,來保護含有這些檔案的目錄。
如果呼叫端能夠以導致編譯器錯誤的方法來影響產生的程式碼,也表示可能有安全性漏洞存在。
請使用 PermitOnly 或 Deny,以可用的最低使用權限設定來執行產生的程式碼。