本文转载自:http://www.cnblogs.com/eflylab/archive/2008/05/29/1209767.html

最近公司一个项目让人SQL注入了~为了临时先解决这个问题,使攻击者不再危害数据库。
初步决定先采用IHttpModule过滤一道请求。

public class HttpModule:IHttpModule
{
public HttpModule()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region IHttpModule 成员 public void Init(System.Web.HttpApplication context)
{
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
}
public void Dispose()
{
// TODO: 添加 HttpModule.Dispose 实现
}
#endregion /// <summary>
///
/// </summary>
/// <param name="sender">事件的源</param>
/// <param name="e">包含事件数据的 EventArgs</param>
private void ReUrl_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
string userID = "";
if(context.Session != null)
{
userID = context.Session["userID"].ToString();
}
/*
…………以下过滤SQL注入细节省略
*/
}
}

以前还没留意到,只知道在Global.asa里面的Application_Start获取不到Session.因为在应用程序启动时,还没有加载Session状态!
以为在这里的 BeginRequest 时已经加载了Session!但事实是这里context.Session 永远等于null.
上MSDN查了一下事件的执行顺序 如下:
    在处理该请求时将由 HttpApplication 类执行以下事件。希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件。

1. 对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见 ValidateRequest 和脚本侵入概述
    2.如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。
    3.引发 BeginRequest 事件。
    4.引发 AuthenticateRequest 事件。
    5.引发 PostAuthenticateRequest 事件。
    6.引发 AuthorizeRequest 事件。
    7.引发 PostAuthorizeRequest 事件。
    8.引发 ResolveRequestCache 事件。
    9.引发 PostResolveRequestCache 事件。
  10.根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。如果该请求针对从 Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。
  11.引发 PostMapRequestHandler 事件。
  12.引发 AcquireRequestState 事件。
  13.引发 PostAcquireRequestState 事件。
  14.引发 PreRequestHandlerExecute 事件。
  15.为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。
  16.引发 PostRequestHandlerExecute 事件。
  17.引发 ReleaseRequestState 事件。
  18.引发 PostReleaseRequestState 事件。
  19.如果定义了 Filter 属性,则执行响应筛选。
  20.引发 UpdateRequestCache 事件。
  21.引发 PostUpdateRequestCache 事件。
  22.引发 EndRequest 事件。

AcquireRequestState事件,当实际服务请求的处理程序获得与该请求关联的状态信息时发生。在这个事件发生时才能取到Session中是userId信息。BeginRequest事件在AcquireRequestState之前发生,我们把取Session状态的代码放在BeginRequest中肯定是取不到的。
    因此将以上代码放在AcquireRequestState事件里,应该是可行的,改为如下:

using System;
using System.Web;
namespace EbzonLibrary
{
/// <summary>
/// HttpModule 的摘要说明。
/// </summary>
public class HttpModule:IHttpModule
{
public HttpModule()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region IHttpModule 成员 public void Init(System.Web.HttpApplication context)
{
// Begin_Request时还没有加载Session状态
// context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
context.AcquireRequestState +=new EventHandler(context_AcquireRequestState);
} public void Dispose()
{
// TODO: 添加 HttpModule.Dispose 实现
} #endregion private void context_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
string userID= "";
if(context.Session["UserID"] != null)
{
userID = context.Session["UserID"].ToString();
}
/*
……
具体过滤SQL危险字符串
*/ } }
}

这样测试是可行的!看来还是要留心一下!
另外说明一点 使用IHttpModule接口时 需要在Web.Config中配置如下信息

<system.web>

    <httpModules>
<add type="EbzonLibrary.HttpModule, EbzonLibrary" name="HttpModule"/>
</httpModules>
<!--
……
-->
</system.web>

了解IHttpModule接口事件执行顺便 获取Session的更多相关文章

  1. IHttpModule接口事件执行 获取Session 找了很多国内的都不对,从国外转过来一个测试可用的

    我的环境,asp.net4.0框架集 不多说上代码 public class MyHttpModule : IHttpModule { public void Init(HttpApplication ...

  2. [Log]ASP.NET之HttpModule 事件执行顺序

    ASP.Net下的HttpModule是基于事件的处理模型,这使得我们在选择事件监听和处理的时候有更多选择.下面是对HttpModule有关事件被触发的监测: 有关代码如下 using System; ...

  3. SQLServer中使用扩展事件获取Session级别的等待信息以及SQLServer 2016中Session级别等待信息的增强

    本文出处:http://www.cnblogs.com/wy123/p/6835939.html 什么是等待 简单说明一下什么是等待:当应用程序对SQL Server发起一个Session请求的时候, ...

  4. WPF TreeView 选择事件执行两次,获取TreeView的父节点的解决方法

    1.TreeView选择事件执行两次 Very often, we need to execute some code in SelectedItemChanged depending on the ...

  5. 运行page页面时的事件执行顺序

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  6. 转:运行page页面时的事件执行顺序及页面的回发与否深度了解

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  7. Oracle获取session的trace

    1. 使用参数SQL_TRACE 下面是官网对此参数的说明 SQL_TRACE Property Description Parameter type Boolean Default value fa ...

  8. .net实现IHttpModule接口顾虑器

    这篇文章主要介绍了C#使用IHttpModule接口修改http输出的方法,涉及C#操作IHttpModule接口的相关技巧,非常具有实用价值,需要的朋友可以参考下   本文实例讲述了C#使用IHtt ...

  9. ASP.NET MVC自定义Module记录管道事件执行顺序

    1. 在Visual Studio 新建项目,模板为空,下面结构选择MVC. 2. 在项目中新建一个类MyModule,实现IHttpModule接口 namespace SimpleApp.Infr ...

随机推荐

  1. 迭代器、foreach循环、泛型集合

    集合的迭代 语法:Iterator<Object> it=集合.iterator(); while(it.hasNext()){ Object obj=it.next(); } is.ha ...

  2. JMter请求参数中文显示乱码

    如上图所示,上传的参数为中文的时候,显示不出来,解决方法如下: 1.进入Jmter安装文件bin文件夹,找到文件jmeter.properties 2.在该文件找到jsyntaxtextarea.fo ...

  3. iOS runloop 自定义输入源

    创建自定义输入源需要定义以下内容 1)输入源要处理的信息 2)使感兴趣的客户端知道如何和输入源交互的调度例程 3)处理其他任何客户发送请求的例程 4)使输入源失效的取消例程 上图的处理流程:主线程(M ...

  4. jQuery插件实现表格隔行换色且感应鼠标高亮行变色

    实现表格隔行换色,且感应鼠标行变色的方法有很多,在本文将为大家介绍的是使用jQuery插件来实现,具体如下 看代码: : css代码:  

  5. 物体识别重要指标——平均准确率(Average Precision, AP )

    师兄的截图,不知道出处,仅用于学习,多多包涵.

  6. BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换

    BD09坐标(百度坐标) WGS84(GPS坐标) GCJ02(国测局坐标) 的相互转换 http://www.cnphp6.com/archives/24822 by root ⋅ Leave a ...

  7. BZOJ1229 USACO2008 Nov toy 玩具 【三分+贪心】*

    BZOJ1229 USACO2008 Nov toy 玩具 Description 玩具 [Chen Hu, 2006] Bessie的生日快到了, 她希望用D (1 <= D <= 10 ...

  8. MAC OS环境下搭建基于Python语言的Selenium2自动化测试环境

    #1安装Python Mac OS上自带python2.7,在此介绍安装python3.x版本 去官网下载Python for MAC版本 https://www.python.org 安装文件为pk ...

  9. 应该抛出什么异常?不应该抛出什么异常?(.NET/C#)

    我在 .NET/C# 建议的异常处理原则 中描述了如何 catch 异常以及重新 throw.然而何时应该 throw 异常,以及应该 throw 什么异常呢? 究竟是谁错了? 代码中从上到下从里到外 ...

  10. NSURLSession学习笔记(二)Session Task

    Session Task分为三种Data Task,Upload Task,Download Task.毫无疑问,Session Task是整个NSURLSession架构的核心目标. 下面写了一个简 ...