通过HttpModule、httpHandlers防止SQL注入式攻击

转载 2012年03月22日 11:53:32

通过HttpModule防止SQL注入式攻击,适用于.net1.1程序
(1)新建类文件SqlHttpModule.cs,具体代码类似如下:

SqlHttpModule.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;

namespace HttpModule.Class
{
    
/// <summary>
    
/// SqlInPost 的摘要说明
    
/// </summary>
    public class SqlHttpModule : System.Web.IHttpModule
    {
        
public SqlHttpModule()
        {
        }

        
public void Dispose()
        {
        }

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

        
private void context_AcquireRequestState(object sender, EventArgs e)
        {
            HttpContext context 
= ((HttpApplication)sender).Context;            
            
try
            {
                
string getkeys = string.Empty;  
                
string keyvalue = string.Empty;
                
string strErrorAlertScript = "<script type=\"text/javascript\">alert('字符串格式非法,请重新输入!');history.go(-1);</script>";
                
string requestUrl = context.Request.Path.ToString();
                
#region 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]).Replace("'""");

                        
if (!IsSafeString(keyvalue))
                        {
                            context.Response.Write(strErrorAlertScript);
                            context.Response.End();
                            
break;
                        }
                    }
                }
                
#endregion

                
#region 表单提交数据
                
if (context.Request.Form != null)
                {
                    
for (int i = 0; i < context.Request.Form.Count; i++)
                    {
                        getkeys 
= context.Request.Form.Keys[i].ToUpper();
                        
if (getkeys == "__VIEWSTATE" || getkeys == "__EVENTARGUMENT" || getkeys == "__EVENTTARGET" || getkeys == "__CLIENTPOSTDATA__"continue;

                        keyvalue 
= context.Server.HtmlDecode(context.Request.Form[i]).Replace("'""");
                        
if (!IsSafeString(keyvalue))
                        {
                            context.Response.Write(strErrorAlertScript);
                            context.Response.End();
                            
break;
                        }
                    }
                }
                
#endregion
            }
            
catch (Exception ex)
            {
            }
        }

        
//判断是否为安全字符串
        public bool IsSafeString(string strText)
        {
            
bool bResult = true;
            
//strText = Regex.Replace(strText, "[\\s]{1,}", "");    //two or more spaces
            strText = Regex.Replace(strText, "(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?>)""\n");    //<br>


            
string FilterSql = System.Configuration.ConfigurationSettings.AppSettings["SqlHttpModule_KeyWord"];//将关键词组配置在webconfig中
            if(FilterSql==null || FilterSql=="")
            {
                
string[] UnSafeArray = new string[23];
                UnSafeArray[
0= "'";
                UnSafeArray[
1= "xp_cmdshell ";
                UnSafeArray[
2= "declare";
                UnSafeArray[
3= "netlocalgroupadministrators ";
                UnSafeArray[
4= "delete ";
                UnSafeArray[
5= "truncate ";
                UnSafeArray[
6= "netuser ";
                UnSafeArray[
7= "/add ";
                UnSafeArray[
8= "drop ";
                UnSafeArray[
9= "update ";
                UnSafeArray[
10= "select ";
                UnSafeArray[
11= "union ";  
                UnSafeArray[
12= "exec ";
                UnSafeArray[
13= "create ";
                UnSafeArray[
14= "insertinto ";
                UnSafeArray[
15= "sp_ ";
                UnSafeArray[
16= "exec ";
                UnSafeArray[
17= "create ";
                UnSafeArray[
18= "insert ";
                UnSafeArray[
19= "masterdbo ";
                UnSafeArray[
20= "sp_ ";
                UnSafeArray[
21= ";-- ";
                UnSafeArray[
22= "1= ";
                
foreach (string strValue in UnSafeArray)
                {
                 
                    
if (strText.ToLower().IndexOf(strValue) > -1)
                    {
                        bResult 
= false;
                        
break;
                    }
                }
            }
            
else
            {
                
string sqlStr = FilterSql;
                
string[] sqlStrs = sqlStr.Split('|');
                
foreach (string ss in sqlStrs)
                {
                    
if (strText.ToLower().IndexOf(ss) >= 0)
                    {                        
                        bResult 
= false;
                        
break;
                    }
                }            
            }
            
return bResult;
        }

    }
}

 
(2)在web.config文件中做以下配置
   </system.web>
     <httpModules>
           <add name="SqlHttpModule" type="HttpModule.Class.SqlHttpModule, HttpModule" />
     </httpModules>
   </system.web> 

 

2、通过httpHandlers防止SQL注入式攻击,适用于.net2.0及以上程序
(1)新建类文件SqlhttpHandlers.cs,具体代码类似如下:

SqlhttpHandlers.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
namespace httpHandlers
{
    
/// <summary>
    
/// SqlInPost 的摘要说明
    
/// </summary>
    public class SqlhttpHandlers : IHttpHandlerFactory
    {
        
public SqlhttpHandlers()
        {
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }

        
public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            
//得到编译实例(通过反射)
            PageHandlerFactory factory = (PageHandlerFactory)Activator.CreateInstance(typeof(PageHandlerFactory), true);
            IHttpHandler handler 
= factory.GetHandler(context, requestType, url, pathTranslated);
            
//过滤字符串
            if (requestType == "POST")
            {
                Page page 
= handler as Page;
                
if (page != null)
                    page.PreLoad 
+= new EventHandler(FormFilterStrFactoryHandler_PreLoad);
            }
            
if (requestType == "GET")
            {
                Page page 
= handler as Page;
                
if (page != null)
                    page.PreLoad 
+= new EventHandler(RequestFilterStrFactoryRHandler_PreLoad);
            }
            
//返回
            return handler;
        }


       
public virtual void ReleaseHandler(IHttpHandler handler)
        {

        }
        
/// <summary>
        
/// 过滤TextBox、Input和Textarea中非法字符
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
       void FormFilterStrFactoryHandler_PreLoad(object sender, EventArgs e)
        {
            
try
            {
                  
bool isSafe = true;
                Page page 
= sender as Page;
                NameValueCollection postData 
= page.Request.Form;
                
foreach (string postKey in postData)
                {
                    Control ctl 
= page.FindControl(postKey);
                    
if (ctl as TextBox != null)
                    {
                       ((TextBox)ctl).Text 
= ((TextBox)ctl).Text.Replace("'""");
                       
string strValue = ((TextBox)ctl).Text.Trim();
                       
if (!IsSafeString(strValue))
                       {
                          isSafe 
= false;
                          
break;
                       }
                      
                        
continue;
                    }
                    
if (ctl as HtmlInputControl != null)
                    {
       
                        ((HtmlInputControl)ctl).Value 
= ((HtmlInputControl)ctl).Value.Replace("'""");
                         
string strValue = ((HtmlInputControl)ctl).Value.Trim();
                        
if (!IsSafeString(strValue))
                        {
                            isSafe 
= false;
                            
break;
                        }
                        
continue;
                    }
                    
if (ctl as HtmlTextArea != null)
                    {
                        ((HtmlTextArea)ctl).Value 
= ((HtmlTextArea)ctl).Value.Replace("'""");
                        
string strValue = ((HtmlTextArea)ctl).Value.Trim();
                        
if (!IsSafeString(strValue))
                        {
                            isSafe 
= false;
                            
break;
                        }        
                        
continue;
                   }                
                }
                
if (!isSafe)
                {
                    page.Response.Write(
"<b><font color='red' font-size=12pt>字符串格式非法!</font></b>");
                    page.Response.End();
                }
            }
            
catch(Exception ex)
            {
                
string a = ex.Message;
            }
        }

         

        
/// <summary>
        
/// 过滤QueryString 中的非法字符串
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        protected void RequestFilterStrFactoryRHandler_PreLoad(object sender, EventArgs e)
        {
            
try
            {
                Page page 
= sender as Page;
                NameValueCollection QueryNV 
= page.Request.QueryString;
                
bool isSafe = true;
                
for (int i = 0; i < QueryNV.Count; i++)
                {
                    
if (!IsSafeString(QueryNV.Get(i)))
                    {
                        isSafe 
= false;
                        
break;
                    }
                }
                
if (!isSafe)
                {
                    page.Response.Write(
"<b><font color='red' font-size=12pt>字符串格式非法!</font></b>");
                    page.Response.End();
                }
            }
            
catch { }
        }



        
//判断是否为安全字符串
        public bool IsSafeString(string strText)
        {
            
bool bResult = true;
            strText 
= Regex.Replace(strText, "[\\s]{1,}""");    //two or more spaces
            strText = Regex.Replace(strText, "(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?>)""\n");    //<br>

            
string[] UnSafeArray = new string[23];
            UnSafeArray[
0= "'";
            UnSafeArray[
1= "xp_cmdshell";
            UnSafeArray[
2= "declare";
            UnSafeArray[
3= "netlocalgroupadministrators";
            UnSafeArray[
4= "delete";
            UnSafeArray[
5= "truncate";
            UnSafeArray[
6= "netuser";
            UnSafeArray[
7= "/add";
            UnSafeArray[
8= "drop";
            UnSafeArray[
9= "update";
            UnSafeArray[
10= "select";
            UnSafeArray[
11= "union";
            UnSafeArray[
12= "exec";
            UnSafeArray[
13= "create";
            UnSafeArray[
14= "insertinto";
            UnSafeArray[
15= "sp_";
            UnSafeArray[
16= "exec";
            UnSafeArray[
17= "create";
            UnSafeArray[
18= "insertinto";
            UnSafeArray[
19= "masterdbo";
            UnSafeArray[
20= "sp_";
            UnSafeArray[
21= ";--";
            UnSafeArray[
22= "1=";
            
foreach (string strValue in UnSafeArray)
            {
                 
                
if (strText.ToLower().IndexOf(strValue) > -1)
                {
                    bResult 
= false;
                    
break;
                }
            }
            
return bResult;
        }

    }
}

 
 (2)在web.config文件中做以下配置
   </system.web>
     <httpHandlers>
        <add verb="*" path="*.aspx" type="httpHandlers.SqlhttpHandlers, httpHandlers"/>
     </httpHandlers>
   </system.web>

通过HttpModule实现数据库防注入

昨天刚把数据库防注入的原型发了上去,发觉好像还漏了点东西,现在把它全部补上.Sql注入是常常被一些菜鸟级黑客高手惯用的手法, 就是基于Sql的注入实现, 防注入程序其实就是处理Http请求,把Get和...
  • S_Sams
  • S_Sams
  • 2006年04月18日 10:54
  • 1513

使用HttpModule实现sql防注入

使用HttpModule实现sql防注入的原因   asp.net处理Http请求时,程序得到一个请求的时候,第一个会经过Http运行时,即编译过程,在这里我们的请求会被转化为机器懂的语言。下一个...
  • whaxrl
  • whaxrl
  • 2014年02月12日 12:55
  • 611

利用HttpModule实现防sql注入

    sql注入是被谈的很多的一个话题,有很多的方法能够实现sql的防注入,在这里就简单说一下如果使用HttpModule来实现sql的防注入。    在项目中添加一个类让其实现IHttpModul...
  • juhengfei
  • juhengfei
  • 2009年04月09日 15:03
  • 276

通过HttpModule、httpHandlers防止SQL注入式攻击

1、通过HttpModule防止SQL注入式攻击,适用于.net1.1程序(1)新建类文件SqlHttpModule.cs,具体代码类似如下: using System; using System....
  • kingboy2008
  • kingboy2008
  • 2011年07月27日 08:33
  • 767

SQL的注入式攻击方式和避免方法

出处:http://www.cnblogs.com/xyd21c/archive/2010/12/09/1901140.html感谢分享 SQL 注入是一种攻击方式,在这种攻击方式中,恶意代...
  • nawuyao
  • nawuyao
  • 2016年09月18日 09:34
  • 3161

简单的sql注入式攻击 教程(小白 )

SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。 以下是整理网上教程所得出的,如有误,非常感谢指出...
  • qq_34817273
  • qq_34817273
  • 2017年04月30日 01:20
  • 1212

PreparedStatement 为什么能够防止注入式攻击

其实是预编译功能,用preparedstatement就会把sql的结构给数据库预编译。SQL注入 攻 击 是利用是指利用 设计 上的漏洞,在目 标 服 务 器上运行 Sql语 句以及 进 行其他方式...
  • thor_w
  • thor_w
  • 2017年04月07日 23:21
  • 517

什么叫做SQL注入式攻击,如何防范?

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为...
  • hellochenlu
  • hellochenlu
  • 2016年08月13日 17:04
  • 1000

如何防止SQL注入攻击

如何防止SQL注入攻击            一、什么是SQL注入式攻击?   所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行...
  • shenxiuwen1989
  • shenxiuwen1989
  • 2015年03月12日 17:32
  • 1282

C#防止注入式攻击的方法

public bool Exists(int ID) { StringBuilder strSql=new StringBuilder(); strSql.Append("select coun...
  • linshichen
  • linshichen
  • 2016年07月14日 09:14
  • 271
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过HttpModule、httpHandlers防止SQL注入式攻击
举报原因:
原因补充:

(最多只允许输入30个字)