遠端處理中的安全性

身為 .NET 遠端應用程式的開發人員,您不只需要對 .NET 遠端處理的安全性意涵有充分的瞭解,同時還要熟悉一般的分散式應用程式。如果實作不安全,任何人都可以呼叫遠端物件上的方法,或是攔截在遠端物件上來回傳遞的機密資訊。為了避免發生這種情況,您必須驗證用戶端 (甚至是伺服器) 並針對兩者之間的通訊進行加密。

同時,直接發生的問題也會比較少。假設有一個可定義方法的遠端物件將委派當成參數來使用。惡意的開發人員可以利用委派來強制伺服器應用程式執行任何他/她希望的程式碼。當委派包裝靜態方法時,將不會遠端處理該委派的任何呼叫,而會在叫用委派的應用程式定義域中呼叫程式碼。例如,惡意用戶端可以利用此弱點對遠端物件進行呼叫,並將包裝了靜態方法的委派傳遞出去。實作靜態方法的組件可以複製到伺服器,而且在叫用委派時,也會在伺服器上執行靜態方法。若要預防發生這種情況,您應該使用駭客猜不出來的自訂型別與參數來宣告遠端物件使用的委派。此外,您絕對不要讓用戶端定義型別並將型別傳遞至即將還原序列化的遠端物件上。

本節說明以特定設計決策為基礎的各種安全性方法。儘管此處無法涵蓋所有情況,但是下列主題仍舊不失為良好的起點。

程式碼存取安全性

程式碼存取安全性是協助限制程式碼存取受保護資源和作業的一項機制。一般來說,當程式碼程式存取受保護資源時,會執行堆疊查核行程 (Stack Walk) 以確保所有堆疊框架 (Stack Frame) 具有存取資源的權限。一旦在遠端物件上進行呼叫,就不會在遠端界限上執行此堆疊查核行程。因此,遠端基礎結構需要 FullTrust 權限以便在用戶端或伺服器上執行。FullTrust 權限基本上會關閉「程式碼存取安全性」。任何遠端應用程式的未授權使用將提供未授權的 FullTrust 權限存取。

Note注意:

好幾種系統型別都會延伸 MarshalByRefObject,但同時會在執行階段執行安全性檢查,以預防應用程式定義域以外的任何事物從遠端叫用該型別的物件。AppDomainSystem.Windows.Forms.Form 是此類系統型別的兩個範例。

遠端應用程式的安全性考量

一般來說,分散式應用程式中有兩大安全性領域需要特別注意:保護通訊通道的安全,以及保護應用程式免於濫用。

保護通訊通道的安全包含確保訊息經過加密,且未在傳輸過程中遭到修改。保護應用程式免於濫用包含驗證與授權呼叫端。驗證呼叫端意思就是確認呼叫端身分無誤。授權呼叫端意思就是確認呼叫端具有進行特定呼叫或是存取受保護資源的必要權限。

內建的通道支援下列安全性:

HttpChannel - 當遠端物件由網際網路資訊服務 (IIS) 負責裝載時,僅支援驗證。當 IIS 設為使用 SSL 時,僅支援加密。

TcpChannel - 支援驗證與加密。

IpcChannel - 支援驗證。

Note注意:

授權就是您在程式碼中提供的某樣東西。內建的通道無法為您提供驗證,因為它們無法得知您的程式碼用途,以及您所加諸的限制為何。

Caution note注意:

.NET Framework 遠端處理依預設不進行驗證或加密。因此,建議您採取所有必要的步驟,以確認用戶端或伺服器的識別 (Identity),然後再與其進行遠端互動。由於 .NET Framework 遠端處理應用程式需要 FullTrust 權限才能執行,所以如果某個未經授權的用戶端被授與伺服器的存取權,該用戶端就可以執行程式碼,如同它已完全受信任。請務必驗證用戶端並針對通訊資料流進行加密。

請參閱

參考

RemotingConfiguration
ChannelServices
Context
MethodCall
RemotingServices

概念

以 HTTP 通道進行驗證

其他資源

NET Framework 遠端處理概觀

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.