設定工作階段狀態的安全性

更新:2007 年 11 月

ASP.NET 工作階段狀態讓您在使用者巡覽組成 Web 應用程式的不同 ASP.NET 網頁時,儲存和擷取使用者的值。ASP.NET 工作階段狀態會在限制時間間隔內,將來自相同瀏覽器的要求識別為一個工作階段,並且能夠保存這個工作階段期間內的變數值。當工作階段狀態設定為 "Cookieless" 時,就會在工作階段 Cookie 或 URL 中識別瀏覽器工作階段。

根據預設,所有 ASP.NET 應用程式的 ASP.NET 工作階段狀態都會啟用,並且設定使用工作階段 Cookie 識別瀏覽器工作階段。

根據預設,ASP.NET 工作階段狀態會將工作階段變數值存放在記憶體中,但是您也可以設定工作階段狀態將工作階段變數值,存放在狀態伺服器、SQL Server、或自訂工作階段狀態存放區中。

下列程式碼和組態最佳作法可以改進應用程式的安全性,同樣重要的是使用 Microsoft Windows 和網際網路資訊服務 (IIS) 的最新安全性修補檔案,以及 Microsoft SQL Server、Active Directory 和應用程式其他資料來源的任何修補檔案,將應用程式伺服器保持在最新的狀態。

如需撰寫安全程式碼以及設定應用程式安全性的最佳作法詳細資訊,請參閱 Michael Howard 和 David LeBlanc 所著的《撰寫安全的程式碼》,以及「Microsoft 典範與實例」提供的指南 (https://www.microsoft.com/taiwan/resources/practices/default.mspx)。

保護工作階段狀態組態安全性

預設會啟用工作階段狀態功能。當預設組態設定為最安全的值時,如果應用程式不需要工作階段狀態,您應該予以停用。如需工作階段狀態組態設定和其預設值的詳細資訊,請參閱 sessionState 項目 (ASP.NET 設定結構描述)

設定組態值安全性

儲存敏感應用程式資訊至組態檔案時,您應該使用「受保護的組態」將敏感資料加密。資訊 (特別是敏感的資訊) 包含了儲存在 machineKey 組態項目中的加密金鑰,以及儲存在 connectionStrings 組態項目中的資料來源連接字串。如需詳細資訊,請參閱使用受保護的組態加密組態資訊

設定工作階段狀態資料來源連接的安全性

連接字串

如同稍早所提的,當您要連接執行 SQL Server、工作階段狀態服務或其他資料來源的電腦時,保護存放在連接字串的敏感資訊是很重要的。若要保護資料伺服器連接的安全性,建議您使用「受保護的組態」加密組態中的連接字串資訊。如需詳細資訊,請參閱使用受保護的組態加密組態資訊

使用整合式安全性連接 SQL Server

您應該使用「整合式安全性」連接執行 SQL Server 的電腦,避免連接字串被洩漏以及使用者 ID 和密碼被公開的可能性。當您指定使用「整合式安全性」連接執行 SQL Server 電腦的連接時,工作階段狀態功能會還原成處理序的識別。您應該確定執行 ASP.NET (例如,應用程式集區) 的處理序識別,是預設處理序帳戶或限制的使用者帳戶。如需詳細資訊,請參閱 ASP.NET 模擬工作階段狀態模式

設定工作階段 ID 的安全性

當保護應用程式和資料時,重要的是保護工作階段識別項,避免透過網路公開給非必要的來源,將它公開給不適當的對象,導致在重播攻擊中用來攻擊您的應用程式。下列建議可以改進工作階段識別項的安全性。

  • 使用 Secure Sockets Layer (SSL) 保護應用程式。

  • 為工作階段 Timeout 指定較小的值。同時考慮使用用戶端指令碼,強制重新導向與工作階段逾時等長的用戶端,或使用下列範例所顯示的 AddHeader 方法加入重新整理標頭。

    Response.AddHeader("Refresh", Session.Timeout & ";URL=Logoff.htm"
    Response.AddHeader("Refresh", Session.Timeout + ";URL=Logoff.htm";
    
  • 避免使用 Cookieless 工作階段。如果您指定 Cookieless 工作階段,請警告使用者不要將包含工作階段 ID 的連結,以電子郵件傳送、加入書籤、或予以儲存。

  • 避免指定 AutoDetectUseDeviceProfile 的 Cookie 模式。

  • 允許使用者登出,此時您應該呼叫 HttpSessionState.Abandon 方法。警告使用者在登出後關閉瀏覽器。

  • 當使用 Cookieless 工作階段時,請將 regenerateExpiredSessionID 設定為 true,以便在提供過期的工作階段識別項時永遠啟動新的工作階段。

保護使用工作階段狀態之 Web 網頁的安全

使用敏感資料的應用程式頁面應該使用標準 Web 安全性機制加以保護,例如使用 Secure Sockets Layer (SSL),並且要求使用者要登入才能執行像是更新個人資訊或刪除帳戶的敏感作業。

此外,頁面上不應該以明文公開機密功能資料,例如密碼和使用者名稱 (某些情況下)。請確定顯示這類資訊的頁面使用 SSL,並且只能由已驗證的使用者使用。

錯誤訊息和事件

例外狀況

若要避免機密資訊公開給不適當的對象,請設定應用程式為不顯示詳細的錯誤訊息,或只在用戶端就是 Web 伺服器本身時才顯示詳細錯誤訊息。如需詳細資訊,請參閱 customErrors 項目 (ASP.NET 設定結構描述)

事件記錄檔

如果您的伺服器執行的是 Windows Server 2003,可以藉由設定事件記錄檔安全性以及設定與事件記錄檔的大小和保留期間等相關的參數,防止間接的拒絕服務攻擊,以改進應用程式的安全性。

自訂工作階段狀態存放區提供者

當建立自訂工作階段狀態存放區提供者時,請確定遵循安全性最佳作法以避免在使用資料庫時遭受像是 SQL 插入 (SQL Injection) 的攻擊。當使用自訂工作階段狀態存放區提供者時,請確定已重新審查該提供者的安全性最佳作法。

請參閱

概念

ASP.NET 工作階段狀態概觀

其他資源

保護 ASP.NET 網站