某些對象自身可保持安全狀態。您不應將這些對象傳遞給不受信任的代碼,如果這樣,后者會獲得超越它自身權限的安全授權。
以創建一個 FileStream 對象為例。在創建該對象時需要 FileIOPermission,如果成功,將返回文件對象。但是,如果將該對象引用傳遞給沒有文件權限的代碼,則該對象將能夠讀/寫此特定文件。
對此類對象的最簡單防御措施是,通過公共 API 元素要求試圖獲得該對象引用的所有代碼都擁有相同的 FileIOPermission。
序列化使用序列化可以允許其他代碼看到或修改以其他方式不可訪問的對象實例數據。同樣,執行序列化的代碼也需要擁有特殊的權限:SecurityPermission.SerializationFormatter。在默認策略下,該權限不會授予從 Internet 下載的代碼或 Intranet 代碼;只有本地機器上的代碼才會被授予該權限。
正常情況下,對象實例的所有字段均被序列化,這意味著數據將以實例的序列化數據形式表示。這樣,代碼就可以解釋該格式以確定數據值是什么,這與成員的可訪問性無關。同樣,反序列化將從序列化表現形式中提取數據并直接設置對象狀態,這同樣也與可訪問性規則無關。
對于可以包含安全敏感數據的任何對象來說,應使該對象不可序列化(如果可能)。如果它必須是可序列化的,請嘗試使包含敏感數據的特定字段不可序列化。如果無法這樣做,則應知道該數據將被公開給有權進行序列化的任何代碼,并確保沒有惡意代碼可以獲得該權限。
ISerializable 接口的原定用途是僅供序列化基礎結構使用。但是,如果未受保護,它也會潛在地泄漏敏感信息。如果通過實現 ISerializable 來提供自定義序列化,則應確保采取以下預防措施:
•應通過請求 SecurityPermission.SerializationFormatter 權限,或者確保方法輸出中未包含敏感信息,來顯式地確保 GetObjectData 的安全。例如:
[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter =true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) •用于序列化的特殊構造函數還應執行徹底的輸入驗證,并且應當受保護或是私有的,以避免被惡意代碼濫用。它應當實施相同的安全檢查以及通過其他手段(通過某類工廠顯式創建或間接創建)獲得該類的實例所需的權限。
應用程序域跨域問題要在托管宿主環境中隔離代碼,常用方法是:使用降低各種程序集權限級別的顯式策略,來創建多個子應用程序域。但是,在默認的應用程序域中,這些程序集的策略保持不變。如果其中一個子應用程序域可以強制默認應用程序域加載程序集,這就會失去代碼隔離的效果,并且這些程序集中的類型將能夠以更高的信任級別運行代碼。
一個應用程序域可以強制另一個應用程序域加載某個程序集,并通過調用駐留在其他應用程序域中的對象的代理來運行所包含的代碼。要獲得跨應用程序域代理,宿主該對象的應用程序域必須提供一個代理(通過一個方法調用參數或返回值),或者,如果該應用程序域剛剛創建,則創建者將擁有 AppDomain 對象的代理。因此,要避免破壞代碼隔離,具有較高信任級別的應用程序域不應將對其域中的 MarshalByRefObject 對象的引用提供給具有較低信任級別的應用程序域。
通常,默認應用程序域在創建子應用程序域時會在每一個子域中包含一個控件對象?丶䦟ο罂晒芾硇碌膽贸绦蛴,并且有時會從默認應用程序域獲取命令,但實際上它不并知道如何直接與域聯系。有時,默認應用程序域將調用它的控件對象代理。但是,有時可能需要控件對象能夠回調到默認應用程序域。在這些情況下,默認應用程序域會將按引用封送的回調對象傳遞給控件對象的構造函數?丶䦟ο筘撠煴Wo該代理。如果控件對象打算將代理放到公共類的公共靜態字段上,或者公開地公開該代理,那么這會為其他代碼回調到默認應用程序域創造一個危險的機制。因此,控件對象始終被隱式信任,以保持代理的私有性。
文章來源于領測軟件測試網 http://www.kjueaiud.com/