第17章  ASP.NET的安全性
17.1  威胁来自何方
17.2  ASP.NET安全性上下文
aspnet和net的区别17.3  使用Forms身份验证
17.4  成员资格与角管理API
17.5  安全性相关的控件
许多开发者都认识到,安全性并不是一项能够事后添加到现有应用程序的功能。换而言之,不能等到开
发阶段的后期才引入它。安全性是应用程序的固有特性,应作为设计阶段的首要任务来规划。
因其本性使然,Web应用程序很容易遭受各种类型的攻击,根据应用程序本身的特性,其毁坏力和影响程度是不同的。最安全的Web应用程序是那些能够实际抵御攻击的应用程序,而不是设计上完美无缺的应用程序。安全性是一个相当复杂的问题,不同应用程序的解决方案各不相同。但应记住,安全性的实现需要同时在应用程序级和系统级采取合理的措施。
ASP.NET提供了内建的应用程序级保护基础架构,能够防止对Web页面的未授权访问,这样便简化了安全应用程序的编写。但应意识到,这种安全性只是安全性的一个方面。真正安全的Web站点能够很好地防御服务器攻击,而这种攻击很可能会逾越应用程序最坚实的逻辑防线。
本章将讨论ASP.NET安全环境,其中包括它与服务器端Internet信息服务(IIS)身份验证机制的关系,以及抵御Web攻击的最佳编码实践。【805】
17.1  威胁来自何方
安全性的概念意味着攻击者的存在,而我们要竭力抵御。表17.1对最常见的几种Web攻击做了总结。
表17.1  常见的Web攻击
攻击说明
跨站点脚本攻击
恶意的用户输入随页面回发
(Cross-site scripting,XSS)
续表 攻  击
说  明 拒绝服务
(Denial of Service ,DoS)
攻击者向网络中发送大量虚假请求,致使系统负担过重,造成网路阻塞 窃听(Eavesdropping)
由于未加密的网络数据包在网络中是透明的,因而攻击者可以通过窃听工具读取它们 隐藏字段篡改
(Hidden-field tampering)
攻击者会篡改填充有敏感数据的未被检查的(受信任的)隐藏字段 单键攻击(One-click attack)
通过脚本发送恶意的HTTP 投递指令 会话劫持(Session hijacking)
攻击者猜中或窃取有效的会话ID ,进而连接到另一个用户的会话 SQL 注入(SQL injection) 代码在不知情的情况下将攻击者插入的恶意输入连接成危险的SQL 命令 从根本上讲,不论将用户向浏览器的标记中插入何种数据,都有可能遭受代码注入攻击(即,SQL 注入和XSS 的各种变体)。此外,敏感数据不应被传输(更不要说以明文的形式传输了),而必须安全地保存在服务器上。
如果有办法编写既防注入又防篡改的应用程序,那么它可能只需要具备以下3点: z  代码实践  采取数据验证、类型与缓冲长度检查,以及防篡改措施。
z
数据访问策略  通过角来限制弱权限的帐户访问服务器的资源,并使用存储过
程,或者至少使用带参数的命令。
z  有效的存储与管理  不将敏感数据发送到客户端,使用经过散列处理来检测数据是
否被篡改,对用户进行身份验证,保护标识(身份)信息,并采用严格的密码策略。 可以看出,为了确保应用程序的安全,需要开发者、架构师和管理员齐心协力,除此以外,别无他法。 【806】 17.2  ASP.NET 安全性上下文
从应用程序的角度来看,安全性主要是对用户进行身份验证,以及授予其对系统资源的操作权限。ASP.NET 结合了IIS 、.NET Framework 和操作系统的底层安全服务,提供了身份验证和授权机制。ASP.NET 应用程序整体的安全性上下文由以下3个级别构成。 z  IIS 级将有效的安全令牌(security token)与请求的发送者关联(该安全令牌取决于当
前IIS 身份验证机制)。
z  ASP.NET 工作进程级会确定处理该请求的ASP.NET 工作进程中线程的标识。如果
启用了模拟(impersonation),那么它会更改与该线程关联的安全令牌。根据当前使用的进程模型,该进程模型的标识会由配置文件或IIS 元库中的设置确定。
z  ASP.NET 管道级会获取当前应用程序特定用户的凭据。这项工作完成的方式取决于
配置文件中有关身份验证和授权的设置。
ASP.NET 应用程序最常选择的是Forms(窗体)身份验证。
ASP.NET 3.5核心编程
此外,ASP.NET 工作进程的标识还会影响本地文件、文件夹和数据库的访问。
17.2.1  ASP.NET 应用程序涉及的安全性上下文
当ASP.NET 请求到达Web 服务器后,IIS 会获取该请求,并将其分配给池中的一个线程。IIS 运行在SYSTEM 帐户下(Windows 中权限最高的帐户)。在处理该请求的过程中,会依次执行3个ASP.NET 应用程序安全性上下文。
IIS 线程安全性上下文
在物理上处理请求的线程会根据当前IIS 身份验证设置(基本身份验证、摘要式身份验证、集成Windows 身份验证或匿名身份验证)模拟出一个标识。如果当前网站的访问配置为匿名身份验证,那么由该线程模拟的标识是管理员通过如图17.1所示对话框设置的。在默认情况下,它的用户名为IUSR_xxx(其中xxx 代表计算机名)(该对话框是Internet 信息服务[IIS]管理器的【属性】对话框)。 【807】
图17.1  为网站启用匿名访问并设置身份验证方法
“基本身份验证”是HTTP 标准,几乎所有浏览器都支持。如果选择这种身份验证方法,请求会返回一个特殊的HTTP 状态码,提示浏览器显示一个标准的对话框,提示输入用户
的凭据。采集到的信息会被发送到IIS ,
IIS 会尝试着将其与Web 服务器中的帐户进行比对。由于凭据是以Base64方式编码的文本(基本上是明文),因而只推荐通过HTTPS 安全信道进行基本身份验证。
“摘要式身份验证”与基本身份验证不同,主要是因为摘要式身份验证会在发送前对凭据进行散列处理。摘要式身份验证是HTTP 1.1
的功能,有些低版本的浏览器可能不支持。此
外,Windows 2000要求将密码以可逆的加密方式存储服务器上,而Windows Server 2003没有这样的要求。基本身份验证和摘要式身份验证即使通过防火墙和代理服务器也能正常工作。
“集成Windows 身份验证”需要建立浏览器与Web 服务器间的对话。浏览器会发送当前登录的Windows 用户的凭据,而不需要手动输入。用户需要有Web 服务器的有效帐户,或位于一个能够成功被身份验
证的受信任的域中。这种身份验证可以通过NTLM 的质询/响应(challenge/response)方法或由Kerberos 来执行。支持该项技术的浏览器很有限,如果有防火墙,则不适合使用这种身份验证。它针对的是内联网。
提示:还有两外一种身份验证方式,它基于的是证书。当用户请求Web 站点的信息时,我
们可以使用IIS 安全套接字层(SSL)的安全功能和客户端证书来对该用户进行身份验证。在用户登录的过程中,SSL 会检查浏览器提交的证书的内容。用户要通过受信任的第三方组织获取客户端证书。在内联网环境下,证书颁发机构由各自的公司管
理,那么用户便可以从那里获得证书。
【808】 经过身份验证后,该线程会将请求派发给相应的外部模块。对于ASP.NET 请求来说,随后要发生的取决于当前应用程序的进程模型。
工作进程的安全性上下文
在IIS 5.0的进程模型中,IIS 线程会将请求交给ASP.NET ISAPI 扩展(aspnet_isapi.dll),再由该扩展启动 工作进程。在IIS 6.0进程模型中,请求会在ASP.NET 应用程序的应用程序池中排队,并由服务于该应用程序池的 IIS 工作进程的副本获取。那么该工作进程的标识是什么呢?
如果使用的是IIS 5.0进程模型,那么该工作进程会运行于ASPNET 帐户下。ASPNET
是一个本地帐户,在.NET Framework 安装时创建。该帐户的权限很低,远不如SYSTEM 帐户。
我们可以在fig 文件中修改现有帐户的标识:  <processModel userName="…" password="…" />
如果使用IIS 6.0进程模型,那么该工作进程的标识为NETWORK SERVICE(网络服务)。可以通过图17.2所示的对话框来更改此项设置。为此,我们需要在Internet 信息服务[IIS]管理器中,选择相应的应用程序池,并查看其属性。NETWORK SERVICE 与ASPNET 的权限相同,是Windows Server 2003和Windows XP 内建的帐户。
在该工作进程中,入池线程会获取请求,并为其服务。该线程的标识是什么?在默认情况下,如果禁用ASP.NET 应用程序的模拟,那么该线程的标识与其工作进程的标识相同。如果启用模拟,那么该工作线程会采用IIS 传给它的安全令牌。我们可以在fig 文件中启用模拟:  <impersonation enabled="true" />
ASP.NET 3.5核心编程
图17.2  设置IIS 6.0中服务于应用程序池的工作进程的默认标识【809】
关于ASP.NET模拟,有很多内容值得讨论,尤其是在指定固定标识时模拟的扩展形式。我们稍后会详细讨论。
若启用模拟,工作进程的帐户不会更改。它仍会使用原帐户来编译页面并读取配置文件。模拟只能由页面中执行的代码使用,将请求交给页面处理程序之前的所有步骤是不能使用模拟的。例如,使用模拟来访问本地文件或数据库,而不会使用工作进程的帐户。
ASP.NET管道的安全性上下文
第三个安全性上下文是发出请求的用户的标识。这一层的关键在于用户的身份验证,以及对页面及内嵌资源访问的授权。显然,如果被请求的页面完全公开,则不需要执行验证过程,生成页面输出并返回给用户即可。
为保护页面不受未授权的访问,ASP.NET应用程序域要选择一种身份验证策略——Windows、Passport或Forms。对于受保护的页面,身份验证模块会拦截请求,并设法获取用户的凭据。仅当该用户的凭据被认为是有效的,并且证明其拥有被请求资源的访问权限时,他/她才会被转到目标页面。
17.2.2  ASP.NET进程标识的更改
如果要更改ASP.NET的帐户,为其授予更多权限,我们需要怎么做?是为相应的工作进程创建一个自定义的帐户,还是让工作进程模拟一个固定的标识呢?
提示:如果要创建比ASPNET或NETWORK SERVICE
权限还低的帐户,那几乎是不能使

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。