WCF RIA Services 的安全性
主題提供可確保安全使用網域服務的指引。套用 EnableClientAccessAttribute 屬性來公開網域服務時,網域服務便可供公開的網路上的每個人使用。您不能假設您的用戶端應用程式是唯一可存取網域服務的應用程式。這個考量對公用網路而言尤其重要。然而,對限制的網路而言也一樣重要,例如在公司網路上公開敏感性資料時。
[加入新的 DomainService 類別] 對話方塊產生的程式碼,可協助您開始使用網域服務。產生的程式碼不一定準備好部署。您必須檢閱程式碼,並修改它以符合應用程式的安全性需求,特別是必須考慮可供網路上的每個人使用的作業。下列檢查清單是可確保安全使用網域服務的起點。
安全性檢查清單
若要確保安全使用網域服務,請考慮下列指引。
盡量減少由網域服務公開的資料作業。這是防範資訊洩漏與拒絕服務的第一道防線。
只公開用戶端所需的實體。這種方式可能會需要您將伺服器邏輯和驗證與用戶端邏輯和驗證分開,若這麼做可讓您減少公開的實體數目的話。例如,在用戶端上不需要 Employee 實體的費用報表,就不應該透過網域服務將它公開。
形狀實體可避免公開敏感性資。您可以使用 ExcludeAttribute 屬性或展示模型來減少可供用戶端使用的資料。例如,如果應用程式中不需要有出生日期和身分證字號,請將它們從用戶端可見的形狀中排除。
需要查詢方法接受應用程式中所需的參數,而不是依賴 LINQ 的資料篩選功能。例如,如果要顯示指定之員工的費用報表,應該要求員工 ID 做為查詢方法中的參數,但不應該提供取得所有費用報表方法。這種方式可盡量減少可能獲得所有員工資料的機會。
建立只提供應用程式中特定案例所需之資料的查詢方法。這個方式表示您可能會提供多個傳回部分資料的查詢方法,而不是一個傳回所有資料的查詢方法。例如,如果要依分類或供應商顯示產品,您可以提供兩個接受分類或供應商資訊的方法,而不是一個傳回所有產品的方法。
篩選資料,以便只提供應用程式一般所需的資料。例如,您可能有一個查詢方法,它只傳回去年完成的訂單。
限制可從查詢傳回的結果數目,讓意外或刻意的伺服器負荷減到最少。您可以使用 QueryAttribute 上的 ResultLimit 屬性,對可傳回的結果數目進行調節。例如,如果可能會傳回大量產品,請將結果調節為 20 來強制在用戶端上進行分頁。同時請考慮為輸出快取使用 OutputCacheAttribute 屬性,以減少中介層與資料庫的負載。
盡量減少每個公開實體的作業數目。例如,如果訂單應用程式只需要加入或修改訂單,您應該在訂單實體上公開查詢、插入和更新作業,但不公開刪除作業。另外,您只應該為產品實體公開查詢作業,但不公開任何資料修改作業。
請盡可能使用具名更新方法,這種方法會限制可更新的成員。
將資料和作業存取限制為已驗證的使用者與特定角色的使用者。
使用 RequiresAuthenticationAttribute 屬性以盡可能避免匿名存取。當您必須允許匿名存取時,請將其限制為最小網域服務集和那些網域服務內最小作業子集。
盡可能加入作業特定的 RequiresRoleAttribute 屬性。考慮在網域服務中分開每個作業。例如,所有使用者可能都需要查詢產品實體,但只有管理員角色的使用者才需要更新這個實體。
考慮使用 AuthorizationContext 屬性來提供自訂授權模型。
將任何由用戶端傳送的資料視為可疑。惡意用戶端 (甚至經過驗證並獲授權) 能夠為變更集的目前值和原始值提供竄改值。應用程式邏輯不應該假設這些值是可信任的,反而應該考慮來自竄改原始值的可能威脅。
為表單驗證使用 HTTPS 通訊協定。以純文字方式傳送密碼是重大漏洞,但使用 HTTPS 可降低其影響程度。
公開最少端點數目。根據預設,RIA Services 會為網域服務建立二進位端點。只有在用戶端特別需要端點時,才加入其他端點。停用任何不在使用中的端點。