检查表:保护 ASP.NET 的安全
本页内容
![]() | 如何使用此检查表 |
![]() | 设计注意事项 |
![]() | 应用程序类别注意事项 |
![]() | 配置文件设置 |
如何使用此检查表
该检查表是模块 10 构建安全的 ASP.NET 网页和控件、模块 19 保护 ASP.NET 应用程序和 Web 服务的安全以及模块 20 驻留多个 Web 应用程序的配套指南。该检查表可以帮助保护 ASP.NET 应用程序的安全,还可以作为相应模块的快照。
设计注意事项
检查 | 说明 |
| 安全决策不应依赖于客户端验证,而应在服务器端进行。 |
| 将网站划分为公共访问区域和需要身份验证访问的受限制区域。这些区域之间的导航不应传递敏感的凭据信息。 |
| 应明确区分用于从 ASP.NET Web 应用程序访问远程资源的标识。 |
| 已经确定了要采用哪些机制来保护在网络上和持久性存储区中的凭据、身份验证票证以及其他敏感信息。 |
| 标识用于例外管理的安全方法。如果出现例外,应用程序会安全地失败。 |
| 网站为网页和目录提供了精确的授权检查。 |
| 将 Web 控件、用户控件和资源访问代码按照各自的集合进行划分,以获得精确的安全性。 |
应用程序类别注意事项
输入验证
检查 | 说明 |
| 应对用户输入的类型、长度、格式和范围进行验证。检查输入时,先检查已知、有效和安全的数据,然后检查恶意、危险的数据。 |
| 使用正则表达式来验证字符串表单域的输入,例如使用 RegularExpressionValidator 控件。 |
| 对于常规的 HTML 控件、查询字符串、cookie 以及其他形式的输入,可以使用 Regex 类和/或自定义验证代码来验证。 |
| RequiredFieldValidator 控件用于必须输入数据的场合。 |
| 服务器控件中的范围检查是由 RangeValidator 控件来检查。 |
| 净化自由格式的输入以便除去恶意数据。 |
| 输入文件名的格式应是正确的,并且在应用程序上下文中经过验证是有效的。 |
| 使用 HtmlEncode 和 UrlEncode 对包含输入的输出进行编码。 |
| 在适当情况下,使用 MapPath 限制跨应用程序的映射。 |
| 字符编码应由服务器设置(建议设置为 ISO-8859-1)。 |
| 启用 ASP.NET 版本 1.1 的 validateRequest 选项。 |
| 在 Web 服务器上安装 URLScan。 |
| 对于深层防御,使用 HttpOnly cookie 选项,以便帮助防止 cross-site 脚本。(应用于 Internet Explorer 6.1 或以上版本。) |
| 在数据访问代码中使用 SQL 参数来验证数据的长度和类型,并帮助防止 SQL injection。 |
身份验证
检查 | 说明 |
| 将站点划分为受限制区域和公共区域。 |
| 将站点划分为安全和不安全文件夹时,应使用绝对 URL 进行导航。 |
| 使用安全套接字层 (SSL) 来保护凭据和身份验证 cookie。 |
| 如果没有使用 SSL 对 cookie 进行保护,则将 slidingExpiration 属性设置为“false”,并使用有限的身份验证 cookie 超时。 |
| 通过使用 requireSSL 属性或 Secure cookie 属性,将表单身份验证 cookie 限制在 HTTPS 连接中。 |
| 加密身份验证 cookie,并检查其完整性 (protection="All")。 |
| 身份验证 cookie 不是持久的。 |
| 应用程序 cookie 有唯一的路径/名称组合。 |
| 个人化 cookie 应与身份验证 cookie 分开。 |
| 不应将密码直接存储在用户存储区,而是存储在带有 salt 的密码摘要中。 |
| 通过使用 Aspnet_setreg.exe,在配置文件中加密模拟凭据(如果使用固定标识)。 |
| 实施强密码策略来进行身份验证。 |
| 不应在 <forms> 元素中使用 <credentials> 元素进行表单身份验证,而应当仅用它进行测试。 |
授权
检查 | 说明 |
| 使用 URL 授权对网页和目录进行访问控制。 |
| 与 Windows 身份验证一起使用文件授权。 |
| 使用主要权限需求来保护对类和成员的访问。 |
| 如果需要精确的授权,则使用明确的角色检查。 |
配置管理
检查 | 说明 |
| 通过使用 HttpForbiddenHandler 来阻止对配置文件的检索。 |
| 使用最低权限的帐户运行 ASP.NET。 |
| 通过使用 Aspnet_setreg.exe,在 <processModel> 元素上对自定义帐户凭据(如果使用)进行加密。 |
| 要强制实施计算机范围的策略,可以通过使用 Machine.config 中的 allowOveride="false",来锁定 Web.config 的设置。 |
敏感数据
检查 | 说明 |
| 使用 SSL 保护网络上的敏感数据。 |
| 不应在网页间传递敏感数据,而是使用服务器端的状态管理来维护。 |
| 不应将敏感数据存储在 cookie、隐藏的表单域或查询字符串中。 |
| 关闭包含敏感数据的网页的输出缓存。 |
| 避免在 Web.config 和 Machine.config 文件中使用明文密码。(使用 Aspnet_setreg.exe 来加密凭据。) |
会话管理
检查 | 说明 |
| 使用 SSL 保护需要身份验证访问的所有网页上的会话 cookie。 |
| 如果不使用,应禁用会话状态服务。 |
| 如果使用会话状态服务,应使用最低权限的帐户运行该服务。 |
| 使用 Windows 身份验证连接到 Microsoft® SQL Server™ 状态数据库。 |
| 限制对 SQL Server 中的状态数据的访问。 |
| 使用 Aspnet_setreg.exe 对连接字符串进行加密。 |
| 对通向状态存储区的通讯通道进行加密(IPSec 或 SSL)。 |
参数操纵
检查 | 说明 |
| 使用消息验证代码 (MAC) 来保护查看状态。 |
| 对带有服务器机密的查询字符串进行哈希运算。 |
| 验证所有输入参数。 |
| 使用 Page.ViewStateUserKey 来防范 One-click 攻击。 |
例外管理
检查 | 说明 |
| 使用结构化的例外处理。 |
| 在服务器上记录例外详细信息。 |
| 将无有害消息的一般错误页面返回客户端。 |
| 执行页面级别或应用程序级别的错误处理程序。 |
| 应用程序应区别错误和例外条件。 |
审核与日志记录
检查 | 说明 |
| 配置 ASP.NET 进程,以便允许在运行时新建事件源,或在安装时创建应用程序事件源。 |
配置文件设置
检查 | 说明 |
| <trace/> <trace enabled="false"> |
| <globalization> |
| <httpRuntime> |
| <compilation> <compilation debug="false" . . ./> . ./> |
| <pages> <pages enableViewState="false" . . ./> . ./> 如果应用程序使用查看状态,应将 enableViewState 设置为 "true",并将 enableViewStateMac 设置为 "true",以便检测查看状态的篡改。 <pages enableViewState="true" enableViewStateMac="true" /> |
| <customErrors> <customErrors mode="On" /> 由 defaultRedirect 属性来指定一般的错误页。 <customErrors mode="On" defaultRedirect="/apperrorpage.htm" /> |
| <authentication> <location path="" allowOverride="false"> <system.web> <authentication mode="Windows" /> </system.web></location> |
| <forms> <forms loginUrl="Restricted\login.aspx" protection="All" requireSSL="true" timeout="10" name="AppNameCookie" path="/FormsAuth" slidingExpiration="true" /> 对身份验证 cookie 进行加密,并检查其完整性 (protection)。 |
| <identity> <identity impersonate="true" userName="registry:HKLM\SOFTWARE\YourApp\ identity\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourApp\ identity\ASPNET_SETREG,password"/> |
| <authorization> |
| <machineKey> <machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" /> 如果ASP.NET Web 应用程序运行在 Web 场中,则需要特定的计算机密钥,并且这些密钥是通过 Web 场中所有服务器来复制的。 |
| <sessionState> |
| <httpHandlers> <add verb="*" path="*.rem" type="System.Web.HttpForbiddenHandler"/> |
| <processModel> <processModel userName="Machine" password="AutoGenerate" 不应使用系统帐户运行 ASP.NET 进程。 <processModel userName="registry:HKLM\SOFTWARE\MY_SECURE_APP\ processmodel\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\MY_SECURE_APP\ processmodel\ASPNET_SETREG,password" . . ./> . ./> 如果应用程序使用企业服务,则应正确配置 comAuthenticationLevel 和 comImpersonationLevel。 |
| <webServices> |
Web 场注意事项
检查 | 说明 |
| 会话状态为了避免服务器的相似性,应在进程外维护 ASP.NET 会话状态,如在 ASP.NET SQL Server 的状态数据库,或运行在远程计算机上的进程外状态服务中。 |
| 加密和验证用于加密和验证表单身份验证的密钥 |
| DPAPI DPAPI 不能与计算机密钥一起用于对农场中所有服务器都需要访问的公共数据进行加密。要对远程服务器上的共享数据进行加密,应使用另外的方案,如 3DES。 |
驻留多个应用程序
检查 | 说明 |
| 应用程序有独特的计算机密钥。 <machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" . . . /> . . /> |
| 启用每个应用程序的表单身份验证 cookie 的唯一路径/名称组合。 |
| 在 Microsoft Windows® Server 2003 上使用多个进程(IIS 6.0 应用程序池)进行应用程序隔离。 |
| 在 Windows 2000 上使用多个匿名用户帐户(和模拟)进行应用程序隔离。 |
| 在 Web 农场中的所有服务器上启用公共计算机密钥。 |
| 如果在单个服务器上驻留多个应用程序,则每个应用程序都使用单独的计算机密钥。 |
| 使用代码访问安全信任级别进行进程隔离,并限制对系统资源的访问(需要 .NET Framework 版本 1.1)。 |
ACL 和权限
检查 | 说明 |
| 临时的 ASP.NET 文件 %windir%\Microsoft.NET\Framework\{version}Temporary ASP.NET Files ASP.NET 进程帐户和模拟标识:完全控制 |
| 临时目录 (%temp%) ASP.NET 进程帐户:完全控制 |
| .NET Framework 目录 %windir%\Microsoft.NET\Framework\{version} ASP.NET 进程帐户和模拟标识: |
| .NET Framework 配置目录 %windir%\Microsoft.NET\Framework\{version}\CONFIG ASP.NET 进程帐户和模拟标识: |
| 网站根目录 C:\inetpub\wwwroot 或默认网站指向的路径 |
| 系统根目录 %windir%\system32 ASP.NET 进程帐户:读取 |
| 全局程序集缓存 %windir%\assembly 进程帐户和模拟标识:读取 |
| 内容目录 C:\inetpub\wwwroot\YourWebApp 进程帐户: C:\ C:\inetpub\ C:\inetpub\wwwroot\ |
应用程序的 Bin 目录
检查 | 说明 |
| 配置 IIS Web 权限。 |
| 删除身份验证设置,因而拒绝所有访问。 |