2.2.2 使用表单验证
小结:不安全的验证表单设置可削弱Web应用程序的安全性
威胁:账户劫持、信息泄漏
全世界范围内,实际应用的非严格编写的ASP Web站点登录验证方案有数千个。程序员经常犯一些相同的安全错误,特别是在他们没有适当地接受过安全编码实践的训练时。ASP.NET引入了一种新的概念,称为表单验证(form authentication)。尽管表单验证还不是很完善,但它至少可以提供一个合理的强框架,程序员可从中构建安全的登录机制。
表单验证提供良好的安全性,并且非常易于使用:创建一个登录页面,并且在web.config文件中改变一些设置。但是,这种易用性也导致相对较弱的安全性做法。
最大的问题在于,表单验证允许在web.config文件中直接添加用户名和密码,甚至允许使用普通的、未加密的密码,如图2-2所示。可以选择在web.config文件中存储MD5或SHA-1哈希,如图2-3所示。但是,ASP.NET没有提供简单的方法来创建密码的哈希。因此,许多开发者将选择普通文本的密码,只是因为它更为简单。这些开发者可能打算以后加密这些密码,但看起来这项工作从来没有在他们紧张的时间表中得到实施。如果在web.config文件中设置了密码,请务必继续进行处理,从一开始就使用MD5或SHA-1。

图2-2 web.config中的明文密码

图2-3 使用SHA-1加密密码
使用如图2-4所示的C#代码或如图2-5所示的VB.NET代码,编译命令行实用程序,创建密码哈希。另一种可选方法是,使用在线哈希生成器,例如www.securecode. net/HashCalc+main.html中的哈希生成器。

图2-4 PassHash实用程序(C#)


图2-4 PassHash实用程序(C#)(续)

图2-5 PassHash实用程序(VB .NET)


图2-5 PassHash实用程序(VB .NET)(续)
一些人可能认为,在web.config文件中使用普通文本密码非常安全,因为ASP.NET可防止外部用户查看该文件。在一定程度上,这种观点确实是正确的。然而,经验告诉我们,这些文件并不总是安全的。将来可能会发现ASP.NET中的某个缺陷,允许查看web.config文件;或者可以通过其他方法访问该文件,例如通过非严格配置的文件共享或FTP服务器。许多开发者都深有体会,太难保证服务器上的文件足够安全,不会被查看。
但是,即使确实使用了MD5或SHA-1哈希,通过字典或暴力攻击也能破解这些密码。www.oxid.it/cain.html中的Cain & Abel等工具就能够破解MD5和SHA-1哈希。虽然这种方法在破解强密码时可能非常缓慢,但对于如图2-6所示的常见密码,Cain在数分钟之内就可以破解。在将Web应用程序提交到产品系统之前,应该权衡依赖web.config文件来存储安全证书的风险。
web.config文件是没有利用salt的普通哈希,因此它们更容易受到根据预先计算的哈希列表进行破解的攻击。查看第4章“加密私有数据”,了解更多有关使用salt进行哈希的知识。

图2-6 对SHA-1哈希执行字典攻击的Cain & Abel
使用表单验证时,必须记住,它只适用于由ASP.NET管理的资源。这些资源包括带有如下扩展名的文件:
n .asax
n .aspx
n .ascx
n .ashx
n .asmx
n .axd
n .vsdisco
n .rem
n .soap
n .config
n .cs
n .csproj
n .vb
n .vbproj
n .webinfo
n .licx
n .resx
n .resources
n .jsl
n .java
n .vjsproj
如果使用表单验证,并且要求使用受保护目录中带有以上任意扩展名的文件,则转向到登录页面。如果请求带有其他任意扩展名的文件,将直接获得文件,而不会要求验证。如果需要了解如何保护这些文件,可查看本节后面的补充注释“映射非ASP.NET资源”。
虽然表单验证在很大程度上改进了ASP中的相关特性,但在使用表单验证时,仍然必须多加注意。对SQL数据库,受保护的数据文件,LDAP或操作系统账户使用自定义验证时,表单验证是最安全的方式。在web.config文件自身中存储密码或哈希可能是安全的,但它也带来很大的风险。另一个可选的方法是使用受保护目录中的自定义XML文件来处理验证。如何实现该解决方案的示例,可查看http://msdn.microsoft.com/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp。
映射非ASP.NET资源
大多数ASP.NET安全特性只保护ASP.NET资源,因此必须采取额外的措施来保护非ASP.NET文件。为了做到这一点,必须使用IIS 5或IIS 6将这些资源映射到ASP.NET ISAPI过滤器。
使用IIS 5:
1.在Internet Services Manager中,为需要配置的应用程序选择相关的属性。
2.在“Home Directory”选项卡中,单击“Configuration”按钮。
3.在“App Mappings”选项卡中,单击“Add”按钮。
4.单击“Browse”按钮,并且定位到.NET ISAPI过滤器(一般位于
C:\Winnt\Microsoft.NET\Framework\<version>\aspnet_isapi.dll)。
5.输入希望映射到ASP.NET的扩展名(或者输入“.*”映射所有的扩展名)。
使用IIS 6:
1.在Internet Services Manager中,为需要配置的应用程序选择相关的属性。
2.在“Home Directory”选项卡中,单击“Configuration”按钮。
3.在“Mappings”选项卡中,单击“Add”按钮。
4.单击“Browse”按钮,并且定位到.NET ISAPI过滤器(一般位于
C:\Winnt\Microsoft.NET\Framework\<version>\aspnet_isapi.dll)。
5.输入希望映射到ASP.NET的扩展名。
6.为了添加一个通配符映射,单击“Mappings”选项卡中的“Insert”按
钮,并且将相关的路径输入到.NET ISAPI过滤器中。
注意,添加通配符应用程序映射将使得ASP.NET处理所有的文件扩展名。对于大多数静态内容,能正常工作;但是,对于映射到其他应用程序(例如Perl或Cold Fusion)的扩展名,则不能正常工作。通配符映射可能对服务器性能有一定影响,这取决于Web目录中内容的类型。ASP.NET有一个针对静态内容的特殊处理程序,但可以针对特殊Web站点运行性能测试。
配置表单验证
Web.config文件的Form元素中的一些属性对安全性有一定的影响。这些设置如下:
n name=“[cookie name]”选择一个独特的名称,该名称与其他表单名称不会产生冲突。
n protection=“[All|None|Encryption|Validation]”虽然其中一些设置可提供更好的性能,但应该总是将其设置为All,以获得最大的cookie保护。
n timeout=“[minutes]”这是有效cookie的超时时间,以分钟为单位,并且从上次请求的时间开始计时。默认值是30分钟,也可以使用较短的超时时间,例如10分钟或15分钟。
n requireSSL=“[true|false]”设置为true时,该设置把cookie标记为安全,使得浏览器仅在建立安全的SSL会话后才传送cookie。将该值设置为true,并且使用SSL提供针对cookie劫持的惟一实际保护。
安全策略
n 绝对不要在产品系统或部署上使用passwordFormat=“Clear”。
n 理解在web.config文件中存储明文证书的风险。
n 使用表单验证时,采取额外的措施保护不是由ASP.NET处理的文件。
n 仔细地计划授权cookie的设置,以限制对劫持的暴露。







