.NET Framework 遠端處理中的自動還原序列化
本主題專門說明一項為了在現有應用程式中提供回溯相容性而保留的舊有技術,不建議用於新的開發工作。分散式應用程式應使用 Windows Communication Foundation (WCF) 進行開發。
仰賴執行階段型別驗證的遠端處理系統必須還原序列化遠端資料流才能開始使用它,而且未授權的用戶端可能會嘗試利用還原序列化期間。為了協助防護此類型的攻擊,.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