保护会话状态

更新:2007 年 11 月

当用户在构成 Web 应用程序的不同 ASP.NET 页面之间导航时,ASP.NET 会话状态使您能够为用户存储和检索值。ASP.NET 会话状态将一个限定的时间窗口内来自同一浏览器的请求标识为一个会话,并能在该会话持续期间内保留变量的值。浏览器会话在会话 cookie 中标识;或者当会话状态配置为“无 cookie”时,在 URL 中标识。

默认情况下,为所有 ASP.NET 应用程序启用 ASP.NET 会话状态,并将其配置为使用会话 cookie 来标识浏览器会话。

默认情况下,ASP.NET 会话状态将会话变量值存储在内存中,但是也可以配置会话状态以将会话变量值存储在状态服务器、SQL Server 或自定义的会话状态存储区中。

尽管遵循编码和配置的最佳做法可以提高应用程序的安全性,但是不断地使用 Microsoft Windows 和 Internet Information Services (IIS) 的最新安全修补程序,以及 Microsoft SQL Server、Active Directory 和您应用程序的其他数据源的所有修补程序来更新应用程序服务器也很重要。

有关编写安全代码和确保应用程序安全的最佳做法的更多详细信息,请参见由 Michael Howard 和 David LeBlanc 编写的书籍《编写安全代码》以及由“Microsoft Patterns and Practices”(Microsoft 模式和实践)(https://www.microsoft.com/resources/practices/default.mspx)提供的指导。

安全的会话状态配置

默认情况下将启用会话状态功能。尽管默认配置设置已设置为最安全的值,但是如果您的应用程序不需要会话状态,则仍应该禁用它。有关会话状态配置设置及其默认值的信息,请参见 sessionState 元素(ASP.NET 设置架构)

保证配置值的安全

当在应用程序的配置文件中存储敏感信息时,应使用受保护配置对敏感值进行加密。特别敏感的信息包括存储在 machineKey 配置元素中的加密密钥和存储在 connectionStrings 配置元素中的数据源连接字符串。有关更多信息,请参见 使用受保护的配置加密配置信息

保护到会话状态数据源的连接

连接字符串

如上所述,对运行 SQL Server 的计算机、会话状态服务或其他数据源的连接字符串中存储的敏感信息进行保护很重要。若要确保到数据服务器的连接的安全,建议使用“受保护配置”对配置中的连接字符串信息进行加密。有关更多信息,请参见 使用受保护的配置加密配置信息

使用集成安全性连接到 SQL Server

您应使用集成安全性连接到运行 SQL Server 的计算机,以避免泄露连接字符串以及暴露用户 ID 和密码的可能性。如果指定一个使用集成安全性的连接来连接到运行 SQL Server 的计算机,则会话状态功能将恢复为进程的标识。应确保正运行 ASP.NET 的进程的标识(例如,应用程序池)为默认进程帐户或受限制的用户帐户。有关更多信息,请参见 ASP.NET 模拟会话状态模式

保护会话 ID

保护应用程序和数据时,确保会话标识符不会通过网络暴露给不必要的源以及不会用于针对您应用程序的重播攻击,这一点很重要。下面的建议可以提高会话标识符的安全性。

  • 使用安全套接字层 (SSL) 来保护应用程序。

  • 为会话 Timeout 指定一个较小值。也可考虑使用客户端脚本对客户端强制执行一个与会话超时一样长的重定向,或使用下面的示例所示的 AddHeader 方法添加一个刷新标头。

    Response.AddHeader("Refresh", Session.Timeout & ";URL=Logoff.htm"
    Response.AddHeader("Refresh", Session.Timeout + ";URL=Logoff.htm";
    
  • 避免使用无 cookie 的会话。如果指定无 cookie 的会话,需警告用户不要在电子邮件和书签中使用包含会话 ID 的链接,也不要保存这些链接。

  • 避免指定 AutoDetectUseDeviceProfile 的 cookie 模式。

  • 允许用户注销,此时应调用 HttpSessionState.Abandon 方法。警告用户在注销后关闭浏览器。

  • 使用无 cookie 的会话时,将 regenerateExpiredSessionID 配置为 true 以便在提供过期的会话标识符时始终启动一个新会话。

保护使用会话状态的网页

应确保使用敏感数据的应用程序页的安全,方法是使用标准 Web 安全机制,例如使用安全套接字层 (SSL) 并要求用户登录后才能执行敏感操作(如更新个人信息或删除帐户)。

此外,网页上不应以明文形式公开敏感数据,如密码(有时候还包括用户名)。请确保显示这种信息的页面使用了 SSL,并且仅可供已经过身份验证的用户使用。

错误信息和事件

异常

若要防止向不必要的源公开敏感信息,可对应用程序进行配置,从而做到不显示详细的错误信息,或者仅当客户端是 Web 服务器本身时才显示详细错误信息。有关更多信息,请参见 customErrors 元素(ASP.NET 设置架构)

事件日志

如果服务器运行的是 Windows Server 2003,则可通过保证事件日志的安全,以及设置有关事件日志的大小、保留时间等参数,从而防止间接拒绝服务攻击,提高应用程序的安全性。

自定义会话状态存储提供程序

创建自定义会话状态存储提供程序时,确保遵循安全性最佳做法以避免在使用数据库时遭受攻击(如 SQL 注入式攻击)。在使用自定义会话状态存储提供程序时,确保已对提供程序进行了安全性最佳做法检查。

请参见

概念

ASP.NET 会话状态概述

其他资源

保证 ASP.NET 网站的安全