利用 ASP.NET 的内置功能抵御 Web 攻击 (1)

摘要: Dino 总结了最常见的 Web 攻击类型,并介绍了 Web 开发人员可以如何使用 ASP.NET 的内置功能来改进安全性。

一、ASP.NET 开发人员应当始终坚持的做法
  如果您正在阅读本文,可能就不需要再向您灌输 Web 应用程序中的安全性愈来愈重要这一事实了。您需要的可能是一些有关如何在 ASP.NET 应用程序中实现安全性的实际建议。坏消息是,没有任何开发平台 — 包括 ASP.NET在内 — 能够保证一旦采用了该平台,您就能够编写百分百安全的代码。谁要是这么说,一准在撒谎。好消息是,就 ASP.NET 来说,ASP.NET,特别是版本 1.1 和即将发行的版本 2.0,集成了一些便于使用的内置防御屏障。

  光是应用所有这些功能并不足以保护 Web 应用程序,使其免受任何可能和可预见的攻击。但是,如果与其他防御技巧和安全策略相结合,内置的 ASP.NET 功能将可以构成一个强大的工具包,有助于确保应用程序在安全的环境中运行。

  Web 安全性是各种因素的总和,是一种范围远超单个应用程序的策略的结果,这种策略涉及数据库管理、网路配置,以及社会工程和 phishing。

  本文的目的在于说明 ASP.NET 开发人员为了将安全标准保持到合理的高度,所应始终坚持的做法。这也就是安全性最主要的内容:保持警惕,永不完全放松,让坏人越来越难以发起黑客攻击。

  下面我们来看看 ASP.NET 提供了哪些可以简化这项工作的功能。

二、威胁的来源
在表 1 中,我汇总了最常见的 Web 攻击类型,以及应用程序中可能导致这些攻击得手的缺陷。

攻击 攻击的可能发起人 
跨站点脚本 (XSS)
 回显到页的不可信用户输入
 
SQL 注入
 串连用户输入以形成 SQL 命令
 
会话劫持
 会话 ID 猜测和失窃的会话 ID Cookie
 
一次单击
 通过脚本发送的未被察觉的 HTTP 张贴
 
隐藏域篡改
 未检查(且受信)的隐藏域被填充以敏感数据

表 1. 常见的 Web 攻击

  列表中显现出来的关键性事实有哪些?在我看来,起码有以下三点:

  1.无论您何时将何种用户输入插入浏览器的标记中,您都潜在地将自己暴露在了代码注入攻击(任何 SQL 注入和 XSS 变种)之下。

  2. 必须以安全的方式实现数据库访问,就是说,应当为数据库使用尽可能少的权限,并通过角色来划分各个用户的职责。

  3.永远都不通过网络发送敏感数据(更别说是明文了),并且必须以安全的方式将敏感数据存储在服务器上。

  有意思的是,上面的三点分别针对的是 Web 安全性的三个不同方面,而这三个方面结合起来,才是唯一的一种生成防攻击、防篡改应用程序的合理方式。Web 安全性的各个层面可以总结如下:

  1.编码实践:数据验证、类型和缓冲区长度检查,防篡改措施

  2.数据访问策略:使用决策来保护可能最弱的帐户,使用存储过程或者至少是参数化的命令。

  3.有效的存储和管理:不将关键性数据发送到客户端,使用哈希代码来检测操作,对用户进行身份验证并保护标识,应用严格的密码策略

  如您所看到的,只有可以通过开发人员、架构师和管理员的共同努力,才可以产生安全的应用程序。请不要假定您能够以其他方式达到同样目的。

  编写 ASP.NET 应用程序时,您并不是独自面对黑客大军:唯一的武器是通过自己的大脑、技能和手指键入的代码行。ASP.NET 1.1 和更高版本都会施加援手,它们具有一些特定的功能,可以自动提高防御以上列出的某些威胁的屏障。下面我们对它们进行详细的检视。

三、ViewStateUserKey
  从 ASP.NET 1.1 开始引入,ViewStateUserKey 是 Page 类的一个字符串属性,只有很少数开发人员真正熟悉该属性。为什么呢?让我们看看文档中是怎么说的。

  在与当前页相关联的视图状态变量中将一个标识符分配给单个用户

  除了有些累赘,这个句子的意思相当清楚;但是,您能老老实实地告诉我,它说明了该属性原本的用途吗?要理解 ViewStateUserKey 的角色,您需要继续往下读,直到 Remarks 部分。

  该属性有助于防止一次单击攻击,因为它提供了附加的输入以创建防止视图状态被篡改的哈希值。换句话说,ViewStateUserKey 使得黑客使用客户端视图状态的内容来准备针对站点的恶意张贴困难了许多。可以为该属性分配任何非空的字符串,但最好是会话 ID 或用户的 ID。为了更好地理解这个属性的重要性,下面我们简短介绍一下一次单击攻击的基本知识。

  一次单击攻击包括将恶意的 HTTP 表单张贴到已知的、易受攻击的 Web 站点。之所以称为“一次单击”,是因为它通常是以受害者不经意的单击通过电子邮件发送的或者在拥挤的论坛中浏览时发现的诱惑性链接而开始的。通过点击该链接,用户无意中触发了一个远程进程,最终导致将恶意的<form>提交到一个站点。大家都坦白些吧:您真能告诉我,您从未因为好奇而单击过 Click here to win $1,000,000 这样的链接吗?显然,并没有什么糟糕的事情发生在您身上。让我们假定的确是这样的;您能说 Web 社区中的所有其他人都幸免于难了吗?谁知道呢。

  要想成功,一次单击攻击需要特定的背景条件:

  1.攻击者必须充分了解该有漏洞的站点。这是可能的,因为攻击者可以“勤奋地”研究该文件,或者他/她是一位愤怒的内部人员(例如,被解雇而又不诚实的雇员)。因此,这种攻击的后果可能是极其严重的。

  2.站点必须是使用 Cookie(如果是持续性 Cookie,效果更好)来实现单次登录,而攻击者曾经收到过有效的身份验证 cookie。

  3.该站点的某些用户进行了敏感的事务。

  4.攻击者必须能够访问目标页。

  前已提及,攻击包括将恶意的 HTTP 表单提交到等待表单的页。可以推知,该页将使用张贴来的数据执行某些敏感操作。可想而知,攻击者清楚地了解如何使用各个域,并可以想出一些虚假的值来达到他的目的。这通常是目标特定的攻击,而且由于它所建立的三角关系,很难追本溯源 — 即黑客诱使受害者单击该黑客站点上的一个链接,而这又会导致恶意代码被张贴到第三个站点。(请参阅图 1。)

图 1. 一次单击攻击

  为什么是不抱怀疑的受害者?这是因为,这种情况下,服务器日志中所显示的发出恶意请求的 IP 地址,是该受害者的 IP 地址。如前所述,这种工具并不像“经典”的 XSS 一样常见(和易于发起);但是,它的性质决定了它的后果可能是灾难性。如何应对它?下面,我们审视一下这种攻击在 ASP.NET 环境下的工作机理。

  除非操作编码在 Page_Load 事件中,否则 ASP.NET 页根本不可能在回发事件之外执行敏感代码。要使回发事件发生,视图状态域是必需的。请牢记,ASP.NET 会检查请求的回发状态,并根据是否存在 _VIEWSTATE 输入域,相应地设置 IsPostBack。因此,无论谁要向 ASP.NET 页发送虚假请求,都必须提供一个有效的视图状态域。

  一次单击攻击要想得手,黑客必须能够访问该页。此时,有远见的黑客会在本地保存该页。这样,他/她就可以访问 _VIEWSTATE 域并使用该域,用旧的视图状态和其他域中的恶意值创建请求。问题是,这能行吗?

  为什么不能?如果攻击者可以提供有效的身份验证 cookie,黑客就可以进入,请求将被照常处理。服务器上根本不会检查视图状态内容(当 EnableViewStataMac 为 off 时),或者只会检查是否被篡改过。默认情况下,试图状态中没有机制可以将该内容与特定的用户关联起来。攻击者可以轻松地重用所获取的视图状态,冒充另一个用户合法地访问该页,以生成虚假请求。这正是 ViewStateUserKey 介入的地方。

  如果选择准确,该属性可以将用户特定的信息添加到视图状态。处理请求时,ASP.NET 会从视图状态中提取秘钥,并将其与正在运行的页的 ViewStateUserKey 进行比较。如果两者匹配,请求将被认为是合法的;否则将引发异常。对于该属性,什么值是有效的?

  为所有用户将 ViewStateUserKey 设置为常量字符串,相当于将它保留为空。您必须将它设置为对各个用户都不同的值 — 用户 ID,会话 ID 更好些。由于一些技术和社会原因,会话 ID 更为合适,因为会话 ID 不可预测,会超时失效,并且对于每个用户都是不同的。

  以下是一些在您的所有页中都必不可少的代码:

void Page_Init (object sender, EventArgs e) {
ViewStateUserKey = Session.SessionID;
:
}

  为了避免重复编写这些代码,您可以将它们固定在从 Page 派生的类的 OnInit 虚拟方法中。(请注意,您必须在 Page.Init 事件中设置此属性。)

protected override OnInit(EventArgs e) {
base.OnInit(e); 
ViewStateUserKey = Session.SessionID;
}

  总体说来,使用基 page 类始终都不失为一件好事,我在 Build Your ASP.NET Pages on a Richer Bedrock 一文中已经进行了说明。如果您要了解更多有关一次单击攻击者的伎俩的信息,可以在 aspnetpro.com 找到一篇非常好的文章。

时间: 2024-10-03 06:13:06

利用 ASP.NET 的内置功能抵御 Web 攻击 (1)的相关文章

ASP.NET内置对象(转)

asp.net学习笔记,在网上找了比较全的总结.转自:http://www.cnblogs.com/MyBeN/archive/2011/03/23/1992591.html ASP.NET中常用的内置对象(一) ASP.NET中常用的内置对象及功能说明如下所示:对 象 名 功  能  说  明Page 用于操作整个页面Response 用于向浏览器输出信息Request 用于获取来自浏览器的信息Server                    提供服务器端的一些属性和方法Applicatio

ASP.NET常用内置对象

ASP.NET 常用内置对象:Response对象.Request对象.Session对象.Server对象.Application对象 1.Response对象: (1) 用于向浏览器输出信息 常用的方法是:Response.Write()方法,例如:Response.Write("Hello"); Response.Write(“<b>当前时间是:</b>"+DateTime.Now); (2)利用Response.Redirect()方法进行页面

ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入

在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就是指使用者,下层就是指被使用者. 二.IoC控制反转 控制反转(IoC,全称Inversion of Control)是一种思想,所谓“控制反转”,就是反转获得依赖对象的过程. 三.依赖注入(DI) 依赖注入设计模式是一种在类及其依赖对象之间实现控制反转(IoC)思想的技术. 所谓依赖注入(DI,全

那些免费却未被重视的IBM PowerHA内置功能(1)

那些免费却未被重视的IBM PowerHA内置功能(1) IBM PowerHA软件全名IBM PowerHA SystemMirror for AIX,(也有for ibm i的版本,其实是完全不同的软件,本文不涉及),目前最新版本7.1.3.其原名HACMP,是运行在IBM POWER小型机/AIX操作系统下的高可用/灾备软件,应用相当广泛,相信接触过IBM小型机的技术人员都有所了解.PowerHA分SE标准版和EE企业版(V5.5以前称XD版).SE版本主要支持数据中心内的高可用solut

mysql 内置功能目录

mysql 内置功能 视图介绍  mysql 内置功能 视图 使用 mysql 内置功能 触发器介绍  mysql 内置功能 触发器 实验 原文地址:https://www.cnblogs.com/mingerlcm/p/9953649.html

ASP.NET 常用内置对象详解-----Response

利用提供的内置对象,可以实现页面之间的数据传递及实现一些特定的功能,如:缓冲输出,页面重定向等等. Response :响应,反应 Request:请求 Server:服务器 Application:应用,申请,应用程序: Session:回话,会议 Cookie:饼干 一. Response:  作用: 将动态生成的信息嵌入到HTML文档中,然后发送到客户端: 缓冲输出数据: 重定向浏览器到另一个URL: 向浏览器输出Cookie文件. 其类名为httpResponse 常用方法: : Res

ASP.NET内置对象Request 和Response

ASP.NET提供了内置对象有Page.Request.Response.Application.Session.Server.Mail和Cookies.这些对象使用户更容易收集通过浏览器请求发送的信息.响应浏览器以及存储用户信息,以实现其他特定的状态管理和页面信息的传递. 下面针对request和response做简单介绍,大家多多指正,补充. Request 读取客户端在Web请求期间发送的值,即是读取浏览器传来的请求报文数据. Request对象主要是让服务器取得客户端浏览器的一些数据,包

深入浅出CChart 每日一课——快乐高四第九课 于无声处,CChart内置功能介绍之数据存取篇

笨笨长期以来一直使用Origin软件画图和处理数据,但Origin软件没有编程语言的接口.笨笨开发CChart的一个潜在的目标.是想实现Origin软件的功能.当然这是一个不可能达到的目标.Origin软件的功能太强了.笨笨仅仅能膜拜. 下节课将介绍CChart内置的数据处理功能,这是笨笨向Origin的致敬. 在这之前.本节课首先介绍一下CChart内置的数据存取功能. A9.1 CChart数据保存 假定我们绘制了如图的两条曲线. 假设要保存全部曲线数据,请点击右键菜单"曲线数据-->

ASP.NET常见内置对象(一)

在web开发中,数据库都是通过HTTP协议来传输的.但HTTP是一个无状态协议,不会保留数据的状态和信息.为了解决这个问题,各种开发语言都提供了状态管理功能. 状态管理是在同一页或不同页的多个请求发生时,维护状态和页面信息的过程.因为web应用程序的通信协议使用了无状态的HTTP协议,所以当客户端每次请求页面时,ASP.NET服务器端都会重新生成一个网页的新实例,此时旧网页的任务已经完成了,旧网页实例也随之消失. 这种无状态,好比我们在淘宝上将很多东西加入了购物车,但是自己却在自己的购物车中看不