撰寫安全 Managed 控制項
更新:2007 年 11 月
Managed 控制項是 Web 網頁參考的組件,它會下載至使用者的電腦並根據需要來執行。從程式碼存取安全性的角度來看,共有兩種 Managed 控制項:在預設安全性原則下執行的 Managed 控制項,以及需要較高層級信任的 Managed 控制項。
若要撰寫在預設安全性原則下執行的 Managed 控制項,您只需要知道預設安全性原則在內部網路或網際網路區域內允許的作業即可。只要 Managed 控制項要求的使用權限不大於它所接受的原始區域,即可以執行 (請記住,管理員或使用者可以決定不要將這麼多的使用權限授與給來自網際網路或內部網路區域的程式碼)。若要執行要求較高信任程度的控制項,管理員或使用者必須調整任何將執行該程式碼的電腦其安全性原則。
如果可行的話,請將 Managed 控制項撰寫為不要求使用權限,這樣一來,根據預設,這些使用權限就不會被授與給網際網路或內部網路程式碼。對於網際網路區域而言,即表示將限制該程式碼顯示 SafeTopLevelWindows 和 SafeSubWindows (由安全性系統配置,防止它們出現於角色性的系統對話)、只能往回與原始站台溝通並使用有限制、隔離儲存區。
內部網路上的程式碼則有較多的使用權限。如需完整詳細資訊,請參閱預設安全性原則。如果您的控制項需要存取檔案、使用資料庫、收集用戶端電腦的相關資訊等等,它必須具有較高的信任程度才行。
開發
高信任度的控制項可以在限制較少的安全性原則下執行,而它們的來源 (內部網路或網際網路) 則需要較大的權限。大部分由安全程式庫設定的使用權限需求 (如 .NET Framework 類別) 都會執行堆疊查核行程 (Stack Walk),檢查所有呼叫端以確保已授與它們要求的使用權限,而 Web 網頁 (但 Managed 程式碼則否) 在安全性考量下也視為呼叫端。執行堆疊查核行程可以協助避免高度受信任的程式碼受低度受信任的程式碼影響,而執行惡意的作業。
因為裝載於瀏覽器內的 Managed 控制項可以由 Web 網頁上的 Active Script 操作,所以 Web 網頁也可以視為一個呼叫端,並在安全性堆疊查核行程期間內進行檢查,以協助防止惡意的 Web 網頁作者公開更高度受信任的程式碼。將 Web 網頁視為呼叫端的結果是根據控制項的強式名稱 (Strong Name) 或發行者憑證,授與它高信任程度並可從 Web 網頁上執行,以防止來自 Web 網頁本身 (內部網路或網際網路) 相同區域的程式碼執行一般情況下不被允許的作業。如需部署考慮事項的詳細資訊,請參閱下一節的說明。表面上看來似乎不可能撰寫高信任度的控制項,但這個案例所提供的程式碼存取安全性可以讓您選擇性地覆寫安全性堆疊查核行程行為。
高信任度的控制項必須考慮使用 Asserts,對它們的呼叫端 (執行它們的 Web 網頁) 一般不會擁有的使用權限,縮短其堆疊查核行程。當您使用 Asserts 時,您必須注意到不會公開危險的 API,而使惡意的 Web 網頁執行不適當的作業。因此,撰寫高信任度的控制項和撰寫安全類別庫一樣,都必須謹慎注意和提高安全警覺。
以下為撰寫安全 Managed 控制項的一些秘訣:
盡可能地封裝需要高信任程度的作業,使它們不會由控制項公開出來。利用這種方式,您可以安全地判斷提示這些作業所需要的使用權限,並可確信使用您控制項的 Web 網頁無法濫用這些功能。
如果控制項的設計在執行時需要公開高信任度的作業,請考慮設定一個站台或 URL 識別使用權限需求,以確保只有執行它的 Web 網頁可以呼叫它。
部署
高信任度的控制項應該永遠為強式名稱或由發行者憑證 (X.509) 簽章。如此可允許原則管理員將較高的信任程度授與這些控制項,不必因為考慮其他的內部網路或網際網路程式碼而降低了它們的安全性。在簽章組件之後,使用者即必須建立一個擁有足夠使用權限的新程式碼群組,並指定只有由使用者的公司或組織簽章的程式碼才可做為該程式碼群組的成員。利用這種方式修改安全性原則之後,高度受信任的控制項將擁有足夠的使用權限。
因為必須修改安全性原則以允許高信任程度的下載控制項能正常作業,因此在公司內部網路上部署這類的控制項是相當容易的工作,通常一位企業管理員即可以將原則變更部署至多部用戶端電腦。為使沒有共通的公司或組織聯繫的一般使用者也能透過網際網路使用高信任度的控制項,控制項發行者和使用者之間必須有信任關係存在。最後,使用者必須能夠使用發行者的命令,以修改原則並允許執行高信任度的控制項。否則,將無法允許控制項執行。