asp.net简单实现利用HttpModule实现防sql注入

关于sql注入,已经被很多人讨论过了。这篇没有新意功能也不够通用,nnd,不想引起口水,就是觉得简单而且思路有参考性才贴出来。
1、新建一个类,实现IHttpModule接口

asp.net简单实现利用HttpModule实现防sql注入 代码
     public   class  SqlHttpModule : IHttpModule
    {
        
public   void  Dispose()
        {

        }

        
public   void  Init(HttpApplication context)
        {
            context.AcquireRequestState 
+=   new  EventHandler(context_AcquireRequestState);
        }
   }

 在实现接口的Init方法时,我们选择了AcquireRequestState事件,为什么不是Begin_Request事件呢?这是因为我们在处理的时候可能用到session,而Begin_Request事件执行的时候还没有加载session状态(关于HttpModule可以参考这一篇)。
2、对网站提交的数据进行处理
(1)、GET方式

asp.net简单实现利用HttpModule实现防sql注入 代码
   // url提交数据 get方式
                 if  (context.Request.QueryString  !=   null )
                {
                    
for  ( int  i  =   0 ; i  <  context.Request.QueryString.Count; i ++ )
                    {
                        key 
=  context.Request.QueryString.Keys[i];
                        value 
=  context.Server.UrlDecode(context.Request.QueryString[key]);
                        
if  ( ! FilterSql(value))
                        {
                            
throw   new  Exception( " QueryString(GET) including dangerous sql key word! " );
                        }
                    }
                }

 (2)、POST方式

asp.net简单实现利用HttpModule实现防sql注入 代码
         // 表单提交数据 post方式
                 if  (context.Request.Form  !=   null )
                {
                    
for  ( int  i  =   0 ; i  <  context.Request.Form.Count; i ++ )
                    {
                        key 
=  context.Request.Form.Keys[i];
                        
if  (key  ==   " __VIEWSTATE " continue ;
                        value 
=  context.Server.HtmlDecode(context.Request.Form[i]);
                        
if  ( ! FilterSql(value))
                        {
                            
throw   new  Exception( " Request.Form(POST) including dangerous sql key word! " );
                        }
                    }
                }

 完整代码:

asp.net简单实现利用HttpModule实现防sql注入 代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Text;

namespace  DotNet.Common.WebForm
{
    
///   <summary>
    
///  简单防止sql注入 
    
///   </summary>
     public   class  SqlHttpModule : IHttpModule
    {
        
public   void  Dispose()
        {

        }

        
public   void  Init(HttpApplication context)
        {
            context.AcquireRequestState 
+=   new  EventHandler(context_AcquireRequestState);
        }

        
///   <summary>
        
///  处理sql注入
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         private   void  context_AcquireRequestState( object  sender, EventArgs e)
        {
            HttpContext context 
=  ((HttpApplication)sender).Context;
            
try
            {
                
string  key  =   string .Empty;
                
string  value  =   string .Empty;
                
// url提交数据 get方式
                 if  (context.Request.QueryString  !=   null )
                {
                    
for  ( int  i  =   0 ; i  <  context.Request.QueryString.Count; i ++ )
                    {
                        key 
=  context.Request.QueryString.Keys[i];
                        value 
=  context.Server.UrlDecode(context.Request.QueryString[key]);
                        
if  ( ! FilterSql(value))
                        {
                            
throw   new  Exception( " QueryString(GET) including dangerous sql key word! " );
                        }
                    }
                }
                
// 表单提交数据 post方式
                 if  (context.Request.Form  !=   null )
                {
                    
for  ( int  i  =   0 ; i  <  context.Request.Form.Count; i ++ )
                    {
                        key 
=  context.Request.Form.Keys[i];
                        
if  (key  ==   " __VIEWSTATE " continue ;
                        value 
=  context.Server.HtmlDecode(context.Request.Form[i]);
                        
if  ( ! FilterSql(value))
                        {
                            
throw   new  Exception( " Request.Form(POST) including dangerous sql key word! " );
                        }
                    }
                }
            }
            
catch  (Exception ex)
            {
                
throw  ex;
            }
        }

        
///   <summary>
        
///  过滤非法关键字,这个可以按照项目灵活配置
        
///   </summary>
        
///   <param name="key"></param>
        
///   <returns></returns>
         private   bool  FilterSql( string  key)
        {
            
bool  flag  =   true ;
            
try
            {
                
if  ( ! string .IsNullOrEmpty(key))
                {
                    
// 一般配置在公共的文件中,如xml文件,txt文本等等
                     string  sqlStr  =   " insert |delete |select |update |exec |varchar |drop |creat |declare |truncate |cursor |begin |open|<-- |-->   " ;
                    
string [] sqlStrArr  =  sqlStr.Split( ' | ' );
                    
foreach  ( string  strChild  in  sqlStrArr)
                    {
                        
if  (key.ToUpper().IndexOf(strChild.ToUpper())  !=   - 1 )
                        {
                            flag 
=   false ;
                            
break ;
                        }
                    }
                }
            }
            
catch
            {
                flag 
=   false ;
            }
            
return  flag;
        }
    }
}

 3、在web项目中应用
只要在web.config的httpModules节点下面添加如下配置即可。

     < httpModules >
      
< add  name ="SqlHttpModule"  type ="DotNet.Common.WebForm.SqlHttpModule, DotNet.Common.WebForm" ></ add >
    
</ httpModules >

 需要说明的是,这个防止sql注入的方法在特定的小项目中还是很简洁高效的,但是不通用,通常我们都是选择参数化(利用orm或者ado.net的参数化)方式防止sql注入。

附:asp.net在网页头部引入js脚本的简单方法
asp.net开发少不了JavaScript的辅助。在通常项目中,js文件都组织在一个公共目录如js文件夹下。随着项目的深入,你会发现js脚本文件越来越多,公共的脚步库越来越庞大。实际使用的时候,我们通常都是在页面中通过 <script src="..." type="text/javascript" >形式引入js文件,而且引入的越来越多。下面我们就来简单讨论在每个页面引入公共脚本库的统一方式,而不用每个页面都是很多<script src="..." type="text/javascript" >的形式。
和我们以前的做法一样,定义一个页面基类叫BasePage,事件和方法如下:

asp.net简单实现利用HttpModule实现防sql注入 Code

这样就简单地解决了引入公共js的问题。同样的原理,你也可以引入其他类型的文件,如css等。
demo下载:demo

你可能感兴趣的:(asp.net)