共用方式為


.NET Framework 遠端處理中的自動還原序列化

依賴執行階段型別驗證的遠端處理系統,必須將遠端資料流還原序列化,才能開始使用它,而未授權的用戶端可能會嘗試擅用這段還原序列化的時間。為了防範這類的攻擊,.NET Framework 遠端處理提供兩種層級的自動還原序列化,也就是 LowFullLow (預設值) 只會還原序列化與最基本遠端處理功能 (例如自動還原序列化遠端處理基礎結構型別、有限的一組系統實作型別和一組基本的自訂型別) 相關的型別,藉以防範還原序列化的攻擊。Full 還原序列化層級則支援在所有情況下,自動還原序列化遠端處理支援的所有型別。

警告

請不要假設控制還原序列化是應用程式唯一需要的安全性。在分散式應用程式中,即使是高度的序列化控制,也無法保證未授權的用戶端攔截不到通訊,並用某種方式使用它 (即使只是將資料顯示給他人看)。因此,雖然 Low 還原序列化層級可以提供一些保護,防範根據自動還原序列化的特定類型攻擊,但您仍必須評估是否使用驗證和加密來保護您的資料。如需詳細資訊,請參閱安全性

下列清單描述 .NET Framework 遠端處理的還原序列化層級:

  • Low (預設層級)

    .NET Framework 遠端處理中的預設還原序列化層級,支援下列型別的還原序列化:

    • 遠端處理基礎結構物件。這些是使遠端處理工作達到基本層級運作所需的型別。

    • 基本型別,以及組成基本型別的參考型別和實值型別。

    • 使用 SerializableAttribute 屬性標記,但未實作 ISerializable 介面的參考型別和實值型別。

    • 系統提供的型別,前提是實作 ISerializable,且未在序列化外提出任何其他要求。

    • 自訂型別,前提是具有強式名稱,且位在未使用 AllowPartiallyTrustedCallersAttribute 屬性標記的組件中。

    • 自訂型別,前提是實作 ISerializable,且未在序列化外提出任何其他要求。

    • 實作 ILease 介面且不是 MarshalByRefObject 物件的型別。

    • 用於啟動的 ObjRef 物件 (以支援用戶端啟動的物件);也就是說,用戶端可還原序列化所傳回的 ObjRef,但伺服器則無法做到。

  • Full

    .NET Framework 遠端處理中的 Full 還原序列化層級則支援所有其他案例,包括還原序列化下列其他型別:

    • 當做參數傳遞的 ObjRef 物件。

    • 實作 ISponsor 介面的物件。

    • 透過 IContributeEnvoySink 介面在 Proxy 與用戶端管線間插入的物件。

    • 當做參數傳遞的委派型別。

    • 繼承自當做參數傳遞之 MarshalByRefObject 的物件。

    • 當做參數傳遞的 ISerializable 型別。

    • 儲存在 GAC 中且未使用 AllowPartiallyTrustedCallersAttribute 屬性標記的型別。

    如果應用程式需要使用只可在 Full 還原序列化層級使用的遠端處理功能,則您必須提供必要的驗證類型和加密層級,以保護遠端案例中因使用這些進階功能而遭受風險的任何資源。

您可用程式設計方式或使用應用程式組態檔,設定還原序列化層級。

以程式設計方式設定還原序列化層級

若要以程式設計方式設定還原序列化層級,請在建立 SoapServerFormatterSinkProvider 物件或 BinaryServerFormatterSinkProvider 物件時,將下列屬性傳遞給這些物件。然後,當格式子插入至接收鏈結時,遠端處理系統會設定該格式子上的值。下列範例示範如何在主應用程式定義域中,將還原序列化層級設定為 Full

// Creating a custom formatter for a TcpChannel sink chain.
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
// Creating the IDictionary to set the port on the channel instance.
IDictionary props = new Hashtable();
props["port"] = 8085;
// Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
TcpChannel chan = new TcpChannel(props, null, provider);
' Creating a custom formatter for your TcpChannel sink chain.
Dim provider As New BinaryServerFormatterSinkProvider()
provider.TypeFilterLevel = TypeFilterLevel.Full
' Creating the IDictionary to set the port on the channel instance.
Dim props As IDictionary = New Hashtable()
props("port") = 8085
' Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
Dim chan As New TcpChannel(props, DBNull.Value, provider)

使用應用程式組態檔設定還原序列化層級

若要使用組態檔設定還原序列化層級,您必須明確指定 <formatter> 項目的 typeFilterLevel 屬性。雖然這通常是在伺服器端完成,但您還是必須指定這個屬性,以針對用戶端上註冊為接聽回呼的任何通道,控制還原序列化層級。下列範例會將應用程式定義域中之 SoapFormatterBinaryFormatter 的還原序列化層級,明確設定為 Low

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown 
type="ServiceType, common" 
objectUri="ServiceType.soap" 
mode="Singleton" 
/>
</service>
<channels>
<channel ref="http">
<serverProviders> 
<provider ref="wsdl" />
<formatter ref="soap" typeFilterLevel=Low />
<formatter ref="binary" typeFilterLevel=Low />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>

請參閱

參考

RemotingConfiguration
BinaryServerFormatterSinkProvider.TypeFilterLevel
BinaryFormatter.FilterLevel

概念

遠端應用程式組態