聲明性安全可提供以下安全檢查:
•Demand 指定代碼訪問安全性的堆棧審核:堆棧上的所有調用方都必須擁有權限或標識才能通過。Demand 會發生在每個調用上,這是因為堆?赡馨煌恼{用方。如果您重復調用某個方法,則每次都會進行該安全檢查。Demand 對引誘攻擊具有強大的抵御能力;它可捕獲試圖通過它的未經授權的代碼。
•LinkDemand 發生在實時 (JIT) 編譯時(在前面的示例中,當引用 Class1 的 App1 代碼將要執行時),并且它只檢查直接調用方。該安全檢查不檢查調用方的調用方。一旦通過該檢查,無論它被調用多少次,都不會有其他安全開銷。但是,它無法防御引誘攻擊。如果使用 LinkDemand,則您的接口是安全的,但通過測試并且可以引用您的代碼的任何代碼都可以潛在地破壞安全性,因為它們允許使用授權代碼調用惡意代碼。因此,除非可以完全避免所有可能的弱點,否則不要使用 LinkDemand。
使用 LinkDemand 時所需的額外預防措施必須是“手工制訂的”(安全系統可以幫助實施)。任何錯誤都會導致安全漏洞。使用您代碼的所有經授權代碼都必須通過執行以下操作,來負責實現其他安全性:
•將呼叫代碼的訪問權限制到類或程序集。
•為該代碼設置相同的安全檢查,并強制它的調用方這樣做。例如,如果您編寫的代碼調用了某個方法,而該方法通過對 SecurityPermission.UnmanagedCode 權限使用 LinkDemand 獲得保護,那么您的方法也應當對該權限使用 LinkDemand(或 Demand,這是更強的手段)。例外情況是,假如代碼中有其他安全保護機制(例如,Demand),則您的代碼將以一種總是安全的或您決定是安全的受限方式使用 LinkDemand 所保護的方法。在調用方負責削弱對基礎代碼的安全保護情況下,會出現此例外情況。
•確保它的調用方無法進行欺騙,以代表它去調用受保護的代碼(也就是說,調用方不能強迫經授權的代碼將特定參數傳遞給受保護的代碼,或從中獲得結果)。
接口和 LinkDemands如果具有 LinkDemand 的虛擬方法、屬性或事件重寫了某個基類方法,則此基類方法也必須具有相同的 LinkDemand,以便重寫方法也是安全的。惡意代碼可能會強制轉換回基礎類型,并調用基類方法。還要注意,可以將 LinkDemands 隱式地添加到不具有 AllowPartiallyTrustedCallersAttribute 程序集級屬性的程序集中。
好的做法是,當接口方法也有 LinkDemands 時,使用 LinkDemands 對方法實現進行保護。
關于對接口使用 LinkDemands,請注意以下事項:
•AllowPartiallyTrustedCallers 屬性會影響接口。
•
文章來源于領測軟件測試網 http://www.kjueaiud.com/