設定登入控制項的安全性
更新:2007 年 11 月
ASP.NET 登入控制項可讓您根據使用者驗證 (Authentication)、成員資格和角色提供控制 Web 網頁存取權的方案。登入控制項包含 CreateUserWizard 控制項、Login 控制項、LoginStatus 控制項、LoginView 控制項、PasswordRecovery 控制項和 ChangePassword 控制項。這個主題的資訊說明了如何透過最好的組態和程式碼作法,改善登入控制項的安全性。
雖然下列程式碼編寫和組態最佳作法可以改善應用程式的安全性,但是持續保持 Web 伺服器電腦使用最新的 Microsoft Windows 和網際網路資訊服務 (IIS) 安全性修補檔案,以及任何 Microsoft SQL Server 或其他資料來源的修補檔案,仍是非常重要的工作。
關於撰寫安全程式碼和安全應用程式之最佳作法的詳細資訊,請參閱 Michael Howard 和 David LeBlanc 所撰寫的《撰寫安全的程式碼》一書,以及「Microsoft 典範與實例」所提供的指示 (https://www.microsoft.com/resources/practices/default.mspx)。
在下列主題中,可以取得其他控制項型別之特別安全性作法的詳細資訊:
登入控制項的一般安全性作法
設定登入控制項的安全性牽涉到下列數個領域的最佳作法,您可以透過底下的連結了解詳細資訊。
使用 Secure Sockets Layer (SSL) 通訊協定
ASP.NET 登入控制項會透過 HTTP 以純文字格式將資訊傳輸給伺服器。處理敏感性資訊時,強烈建議您使用具備 Secure Sockets Layer (SSL) 加密的 HTTPS 通訊協定。SSL 可防止資料被替代 (資料完整性)、保護使用者的識別 (機密性),並確保資料來自所要的用戶端 (驗證)。如需詳細資訊,請參閱密碼編譯概觀,以及 IIS 文件中的 Configuring SSL on a Web Server or a Web Site。
驗證使用者輸入
絕對不要假設從使用者取得的輸入是安全的。惡意使用者可以將具有潛在危險的資訊從用戶端傳送至應用程式。針對登入控制項而言,因為輸入的資訊經常是敏感性資訊,所以特別重要的是注意使用者輸入。如需保護免受惡意輸入破壞的詳細資訊,請參閱 Web 應用程式的基本安全性實行方式。
實際進行時,請使用驗證控制項來測試有效的使用者名稱和強式密碼。您可以驗證部分使用者輸入而不需驗證控制項。例如,CreateUserWizard 控制項支援必要的及比較驗證。您也可以指定具有 EmailRegularExpression 屬性 (Property) 的規則運算式 (Regular Expression),以驗證電子郵件地址是否符合指定的模式,而具有 PasswordRegularExpression 屬性則用以驗證密碼是否符合需求。
使用範本驗證登入控制項的使用者輸入,是最具彈性的方式。只要可行,請建立控制項的範本、加入個別控制項 (通常是 TextBox 控制項) 並加入驗證控制項,將使用者輸入限制成最有限的輸入。
注意事項: |
---|
使用驗證控制項時,除了使用用戶端驗證之外,請一律使用伺服端程式碼執行驗證。這可停用或變更用戶端指令碼檢查,以防止使用者略過驗證。 |
如需詳細資訊,請參閱驗證 ASP.NET Web 網頁中的使用者輸入。
設定檢視狀態的安全性
登入控制項可在網頁的檢視狀態中儲存資訊,所以它是保護檢視狀態的最安全作法。雖然檢視狀態資料是以編碼格式儲存,但仍可檢視和篡改。如需詳細資訊,請參閱ASP.NET 檢視狀態概觀。
設定成員資格的安全性
ASP.NET 成員資格提供了驗證和儲存使用者認證的功能。CreateUserWizard、Login、PasswordRecovery 和 ChangePassword 控制項會使用 ASP.NET 成員資格,讓您能建立需要少許或根本不需要程式碼的完整驗證系統。此外,可以使用 LoginName、LoginStatus 和 LoginView 控制項完成方案,以處理使用者成員資格,並控制網站內網頁的存取權。如需詳細資訊,請參閱成員資格簡介和保護成員資格的安全。
ASP.NET 隨附的成員資格提供者 (Provider) 具有無效密碼之次數上限或密碼回應嘗試次數上限的內建臨界值 (如 MaxInvalidPasswordAttempts 屬性中所指定)。ASP.NET 成員資格也可讓您設定在鎖定成員資格使用者之前,容許之無效密碼次數上限或密碼回應嘗試次數上限的分鐘數 (如 PasswordAttemptWindow 屬性中所指定)。預設密碼嘗試臨界值是 5,而預設的密碼嘗試視窗是 10 分鐘。可以使用應用程式 Web.config 檔之 membership 區段中所設定的臨界值,覆寫預設提供者中的臨界值。如果設定這些臨界值,則建議將這些臨界值設定的愈小愈好。此外,建議不要將 RequiresQuestionAndAnswer 屬性設定為 false,因為系統不會追蹤無效的密碼回答嘗試。如需詳細資訊,請參閱成員資格提供者。
設定電子郵件安全性
CreateUserWizard、ChangePassword 和 PasswordRecovery 控制項可傳送內含完整使用者交易的電子郵件訊息。請確定傳送給使用者的任何電子郵件訊息都只包含必要資訊。例如,避免讓無意的第三方從其他電子郵件訊息中輕鬆篩選出電子郵件訊息的主旨行。建議不要以電子郵件傳送密碼。請考慮其他驗證密碼交易的方法,例如傳送確認代碼及傳回 URL,要求使用者使用 URL 完成交易。
如果未指定 CreateUserWizard、ChangePassword 和 PasswordRecovery 控制項的 MailDefinition 屬性,則不會傳送電子郵件訊息。設定這些控制項傳送電子郵件訊息時,建議您處理郵件錯誤事件以攔截任何 SMTP 相關的錯誤,並避免將不必要的資訊洩露給使用者。若為 ChangePassword 控制項,請處理 SendMailError 並將 SendMailErrorEventArgs 物件的 Handled 屬性設為 true。如需顯示如何處理郵件錯誤事件的範例,請參閱 SendMailError 事件。如需安裝 Simple Mail Transfer Protocol (SMTP) 服務的詳細資訊,請參閱 HOW TO:在 IIS 6.0 中安裝和設定 SMTP 虛擬伺服器。
個別控制項的安全性考量
下列各節說明個別登入控制項的安全性考量。
CreateUserWizard
CreateUserWizard 控制項會收集使用者的資訊,然後在 ASP.NET 成員資格系統中建立該使用者的帳戶。您可以擴充 CreateUserWizard 控制項接收其他資訊,方法是在 CreateUserWizardStep 和 CompleteWizardStep 步驟之前或之後加入欄位或步驟。如果使用者未完成 CreateUserWizard 控制項中的所有步驟,但已建立帳戶,則會引發安全性問題。若要防止使用者略過自訂精靈步驟,請覆寫 OnNextButtonClick 方法,並執行自訂驗證。收集好資訊後,請使用 MembershipProvider 類別的 CreateUser 方法建立使用者。
如果執行的是管理工作且使用 CreateUserWizard 自動建立使用者帳戶,則建議將 AutoGeneratePassword 屬性設為 true,並將 LoginCreatedUser 屬性設為 false。在這種特殊案例中,建議將 DisableCreatedUser 屬性設定為 false。
登入控制項
Login 控制項為複合控制項,內含使用者名稱和密碼文字方塊,以及指出是否於下次造訪網頁時記住使用者的核取方塊。RememberMeSet 屬性會將驗證 Cookie 傳送給使用者的瀏覽器,而 DisplayRememberMe 屬性會顯示核取方塊,讓使用者控制是否傳送持續性 (Persistent) Cookie。因為會傳送 Cookie,但使用者不認得它,所以避免將 RememberMeSet 設為 true,以及避免將 DisplayRememberMe 設為 false。一般而言,在使用者電腦上儲存 Cookie 有一些風險。Cookie 是另一種形式的使用者輸入,因此容易造成資訊外洩和詐騙攻擊。如需詳細資訊,請參閱 ASP.NET Cookie 概觀。
如果有大量的使用者會使用 Login 控制項,請考慮編寫控制項,讓公用電腦上的使用者可以選擇使用非持續性的 Cookie,在工作階段逾時後便可捨棄。如需撰寫 Cookie 的詳細資訊,請參閱 HOW TO:撰寫 Cookie。
LoginName 控制項
LoginName 控制項會顯示使用者登入的名稱,如果應用程式使用的是 Windows 驗證,則會顯示使用者的網域和帳戶名稱。請考慮加入核取方塊,讓使用者指定是否要顯示他們的名稱或帳戶資訊。例如,公用電腦的使用者可能不想顯示重要的資訊。
LoginView 控制項
LoginView 控制項可以讓您對已登入或未登入的使用者 (匿名使用者) 顯示不同的資訊。請檢閱使用 AnonymousTemplate 和 LoggedInTemplate 範本顯示的內容,以及使用與 RoleGroups 屬性關聯之範本所顯示的任何內容,以確定使用者無法檢視不可讓他們檢視的範本。特別是,系統會以範本的定義順序搜尋 RoleGroups 屬性中的集合。使用者會看到第一個符合的角色群組範本。如果使用者是多個角色的成員,則會顯示與任何使用者角色相符的第一個角色群組範本。如果多個範本與單一角色關聯,則會使用第一個定義的範本。如需詳細資訊,請參閱了解角色管理。
PasswordRecovery 控制項
PasswordRecovery 控制項允許使用者根據與其使用者名稱關聯的電子郵件地址擷取密碼。設定 PasswordRecovery 控制項時,請遵循下列方針:
處理 SendMailError 事件,若在傳送電子郵件訊息時發生錯誤,則採取動作。
使用 MaxInvalidPasswordAttempts 屬性設定有次數限制的密碼回應嘗試,以及使用 PasswordAttemptWindow 屬性設定有時間限制的視窗。
檢閱傳送給使用者電子郵件的所有資訊,以及用來傳輸訊息之通道的安全性,特別是在密碼復原電子郵件訊息包含使用者密碼時。請避免傳送清楚標記為含有敏感性資訊的電子郵件訊息,例如主旨行中含有文字 "password" 的訊息。
ChangePassword 控制項
ChangePassword 控制項允許使用者變更他們的密碼。設定 ChangePassword 控制項時,請遵循下列方針:
處理 SendMailError 事件,若在傳送電子郵件時發生錯誤,則採取動作。
使用 MaxInvalidPasswordAttempts 屬性設定有次數限制的密碼回應嘗試,以及使用 PasswordAttemptWindow 屬性設定有時間限制的視窗。
檢閱傳送給使用者電子郵件的所有資訊,以及用來傳輸訊息之通道的安全性,特別是在將 ChangePassword 控制項設定成使用電子郵件將新密碼傳送給使用者時。
使用 SSL,確定無法在回傳時讀取使用者的新密碼。
限制檔案的存取權,而 ChangePassword 控制項會將該檔案做為傳送給使用者之電子郵件訊息的主體。這個檔案是由 MailDefinition 類別之 BodyFileName 屬性所定義。
請參閱
工作
HOW TO:在 IIS 6.0 中安裝和設定 SMTP 虛擬伺服器