.NET Framework 遠端處理中的自動還原序列化
依賴執行階段型別驗證的遠端處理系統,必須將遠端資料流還原序列化,才能開始使用它,而未授權的用戶端可能會嘗試擅用這段還原序列化的時間。為了防範這類的攻擊,.NET Framework 遠端處理提供兩種層級的自動還原序列化,也就是 Low 和 Full。Low (預設值) 只會還原序列化與最基本遠端處理功能 (例如自動還原序列化遠端處理基礎結構型別、有限的一組系統實作型別和一組基本的自訂型別) 相關的型別,藉以防範還原序列化的攻擊。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 屬性。雖然這通常是在伺服器端完成,但您還是必須指定這個屬性,以針對用戶端上註冊為接聽回呼的任何通道,控制還原序列化層級。下列範例會將應用程式定義域中之 SoapFormatter 和 BinaryFormatter 的還原序列化層級,明確設定為 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