Share via


安全性和序列化

因為序列化可以讓其他程式碼看見或修改在其他情況下無法存取的物件執行個體資料,所以執行序列化的程式碼必須具有特殊的使用權限:SecurityPermission 並指定 SerializationFormatter 旗標。 依照預設原則,這個使用權限不會授與給網際網路下載或內部網路的程式碼;只有本機電腦上的程式碼才會被授與這個使用權限。

通常,物件執行個體的所有欄位都會被序列化,也就是執行個體的資料會以序列化資料來表示。 能夠解譯格式的程式碼便可以判斷資料值,不需依賴成員的存取範圍。 同樣地,還原序列化 (Deserialization) 會從序列化表示抽取資料,並直接設定物件狀態,也不需依賴存取範圍規則。

對於可能含有安全性顧慮資料的任何物件,應盡可能使它不可序列化。 如果物件必須序列化,請嘗試將含有敏感資料的特定欄位還原序列化。 如果不行,請留意這個資料將會公開給擁有序列化使用權限的所有程式碼,同時也請確定不會有任何惡意程式碼可以取得這個使用權限。

ISerializable 介面只供序列化基礎結構使用。 但是,如果未受到保護,它也可能會將敏感資訊公開。 如果您要實作 ISerializable 以提供自訂序列化,請務必採取下列防範措施:

  • GetObjectData 方法應明確受到保護,請要求指定 SerializationFormatterSecurityPermission 使用權限,或確定不會隨同這個方法的輸出公開任何機密資訊。 例如:

    Public Overrides<SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter := True)>  _
    Sub GetObjectData(info As SerializationInfo, context As StreamingContext)
    End Sub 
    
    [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter 
    =true)]
    public override void GetObjectData(SerializationInfo info, 
    StreamingContext context)
    {
    }
    
  • 用來執行序列化的特殊建構函式也應該進行徹底的輸入驗證,而且應該受到保護或是設定為私用,以利避免惡意程式碼的誤用。 它應該強制使用以其他手段取得這種類別 (例如透過某種 Factory 明確建立或間接建立類別) 的執行個體時,所需執行的相同安全檢查和使用權限。

請參閱

概念

安全程式碼撰寫方針