English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 威盾新闻 >> 如何使用HttpModule实现sql防注入

 

如何使用HttpModule实现sql防注入

威盾防火墙 2014-12-04

 

一、什么是SQL注入

 

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
 
根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。
 
SQL注入的产生原因通常表现在以下几方面:
 
①、不当的类型处理;
②、不安全的数据库配置;
③、不合理的查询集处理;
④、不当的错误处理;
⑤、转义字符处理不合适;
⑥、多个提交处理不当。

 

二、如何防止SQL注入

 

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和
双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
 
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
 
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

 

三、使用HttpModule实现sql防注入

 

asp.net处理Http请求时,程序得到一个请求的时候,第一个会经过Http运行时,即编译过程,在这里我们的请求会被转化为机器懂的语言。下一个,我们的请求经过不同的HttpModule,即Http模块。事实上,我们的请求到达模块时系统没有对这个请求做任何的处理,也就是说此时对于请求来讲,模块是一个请求的“必经之路”。

模块可以在这个Http请求到达真正的处理中心(HttpHandler)之前,针对这个Http请求做一些额外的工作,或者在某些情况下干脆终止满足一些条件的Http请求,从而起到一个过滤器的作用。在经过我们的模块之后,我们的Http请求才到达真正的处理中心(HttpHandler)。Http请求在经过处理之后,原路返回,经过模块,进过运行时,返回到客户端。

那么既然我们的请求无论如何都会经过HttpModule,那么我们就可以在此进行一些判断(如是否有SQL关键字等)。

 

实现方式

 

1、新建一个类,实现IHttpModule接口

 
C# 代码   复制
 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状态
 

2、对网站提交的数据进行处理
 

在AcquireRequestState 事件中我们就要进行相应的处理了,思路如下,一般网站提交数据只有两个地方,表单和url,所以就在该事件中将从这两处提交的数据截取,判断是否有一些危险字符,然后做相应处理。

 
C# 代码   复制
 private void context_AcquireRequestState(object sender, EventArgs e) {     HttpContext context = ((HttpApplication)sender).Context;      try     {         string getkeys = string.Empty;         string sqlErrorPage = "~/Error.aspx";//转向的错误提示页面          string keyvalue = string.Empty;          string requestUrl = context.Request.Path.ToString();         //url提交数据         if (context.Request.QueryString != null)         {             for (int i = 0; i < context.Request.QueryString.Count; i++)             {                 getkeys = context.Request.QueryString.Keys[i];                 keyvalue = context.Server.UrlDecode(context.Request.QueryString[getkeys]);                  if (!FilterSql(keyvalue))                 {                     context.Response.Redirect(sqlErrorPage);                     context.Response.End();                     break;                 }             }         }         //表单提交数据         if (context.Request.Form != null)         {             for (int i = 0; i < context.Request.Form.Count; i++)             {                 getkeys = context.Request.Form.Keys[i];                 keyvalue = context.Server.HtmlDecode(context.Request.Form[i]);                 if (getkeys == "__VIEWSTATE") continue;                 if (!FilterSql(keyvalue))                 {                     context.Response.Redirect(sqlErrorPage);                     context.Response.End();                     break;                 }             }         }     }     catch (Exception ex)     {     } } 

 

使用HttpModule完整代码:
 

 
C# 代码   复制
 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;         }     } } 

相关内容: 最新内容:
如何从根本上防止 SQL 注入?[2014-12-04]
SQL注入攻击的总体思路[2014-12-04]
Microsoft SQL Server扩展存储过程权限提升漏洞[2014-12-04]
学会检查SQL注入式攻击漏洞[2014-12-01]
防止SQL注入攻击的方法[2014-12-01]
ASP.NET 中如何防范SQL注入式攻击[2014-12-01]
如何从根本上防止 SQL 注入?[2014-12-04]
为什么选择手工WEB注入?工具的缺陷[2014-12-04]
php防止xss攻击的方法[2014-12-04]
SQL注入攻击的总体思路[2014-12-04]
Microsoft SQL Server扩展存储过程权限提升漏洞[2014-12-04]
入侵检测和防范:不仅仅是防火墙[2014-12-04]