了解IHttpModule接口事件执行顺便 获取Session

简介:

最近公司一个项目让人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 >
分类:  IIS, C# Asp.net

本文转自快乐就好博客园博客,原文链接:http://www.cnblogs.com/happyday56/archive/2008/12/27/1363602.html,如需转载请自行联系原作者
相关文章
|
6月前
|
Java 关系型数据库 应用服务中间件
ThreadLocal不调用remove方法会导致业务逻辑错误
ThreadLocal不调用remove方法会导致业务逻辑错误
|
12月前
|
Java Spring
任何 bean 初始化回调前自定义逻辑
任何 bean 初始化回调前自定义逻辑
on方法多次绑定会多次执行的解决方法
on方法多次绑定会多次执行的解决方法
99 0
08初始化HandlerAdapter并执行找到的Handler或者HandlerExecution
HandlerAdapter介绍 实际应用使用的RequestMappingHandlerAdapter的初始化 从注册的HandlerAdapter列表中找到能处理当前找到的Handler的HandlerAdapter HandlerAdapter的执行
|
缓存 NoSQL Java
TimedCache 带时间缓存工具类,附加监听回调 | Java工具类
TimedCache 带时间缓存工具类,附加监听回调 | Java工具类
TimedCache 带时间缓存工具类,附加监听回调 | Java工具类
NestJS 7.x 折腾记: (6) 异常过滤器,取其精华去其糟粕!比如响应异常数据的包装~
正如官方所说: 内置的异常层负责处理整个应用程序中的所有抛出的异常。 当捕获到未处理的异常时,最终用户将收到友好的响应。
393 0
|
监控 Java Android开发
【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )
【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )
166 0
如何处理使用ngrx时遇到的错误消息: NullInjectorError R3InjectorError(AppModule)[StoreFeatureModule]
如何处理使用ngrx时遇到的错误消息: NullInjectorError R3InjectorError(AppModule)[StoreFeatureModule]
446 0
如何处理使用ngrx时遇到的错误消息: NullInjectorError R3InjectorError(AppModule)[StoreFeatureModule]
|
测试技术
为什么Spartacus单元测试里对http返回的Observable对象调用subscribe时,会触发依赖注入的框架代码
为什么Spartacus单元测试里对http返回的Observable对象调用subscribe时,会触发依赖注入的框架代码
为什么Spartacus单元测试里对http返回的Observable对象调用subscribe时,会触发依赖注入的框架代码
|
Android开发
AsyncHttpClient放在子线程执行时抛出异常的解决方法
AsyncHttpClient放在子线程执行时抛出异常的解决方法
383 0