ASP.NET过滤类SqlFilter,防止SQL注入 原创

原创  更新时间:2016年03月25日 11:09:36   原创 作者:yourber  
本文分享一个防SQL注入的过滤类SqlFilter,可以防止通过POST、GET和Cookies的注入。

什么是SQL注入?

我理解的sql注入就是一些人可以通过恶意的参数输入,让后台执行这段SQL,然后达到获取数据或者破坏数据库的目的!
举个简单的查询例子,后台sql是拼接的:select * from Test where name='+参数传递+';前台页面要求输入name,那么黑客可以输入: ';DROP TABLE Test;--   不要小瞧这一段SQL代码:
select * from Test where name=' ';DROP TABLE Test;--';在SQL中是正确的,可执行的,但是执行后整个Test表都删除了,网站崩溃!

最好的解决方法

最好的办法就是不写拼接SQL,改用参数化SQL,推荐新项目使用。这里不做介绍,感兴趣的朋友可以自行搜索一下,本文介绍的方法适合老项目,就是没有使用参数化SQL开发的程序。

使用过滤函数来过滤

将SQL一些危险的关键字,还有注释百分号以及分号这些根本在我们正常写代码的时候根本不会出现的字符都过滤掉,这样能最大限度的保证SQL执行是安全的,代码如下:

public class SqlFilter
{
  public static void Filter()
  {
    string fileter_sql = "execute,exec,select,insert,update,delete,create,drop,alter,exists,table,sysobjects,truncate,union,and,order,xor,or,mid,cast,where,asc,desc,xp_cmdshell,join,declare,nvarchar,varchar,char,sp_oacreate,wscript.shell,xp_regwrite,',%,;,--";
    try
    {
      // -----------------------防 Post 注入-----------------------
      if (HttpContext.Current.Request.Form != null)
      {
        PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        //把 Form 属性改为可读写
        isreadonly.SetValue(HttpContext.Current.Request.Form, false, null);

        for (int k = 0; k < System.Web.HttpContext.Current.Request.Form.Count; k++)
        {
          string getsqlkey = HttpContext.Current.Request.Form.Keys[k];
          string sqlstr = HttpContext.Current.Request.Form[getsqlkey];
          string[] replace_sqls = fileter_sql.Split(',');
          foreach (string replace_sql in replace_sqls)
          {
            sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase);
          }
          HttpContext.Current.Request.Form[getsqlkey] = sqlstr;
        }
      }


      // -----------------------防 GET 注入-----------------------
      if (HttpContext.Current.Request.QueryString != null)
      {
        PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        //把 QueryString 属性改为可读写
        isreadonly.SetValue(HttpContext.Current.Request.QueryString, false, null);

        for (int k = 0; k < System.Web.HttpContext.Current.Request.QueryString.Count; k++)
        {
          string getsqlkey = HttpContext.Current.Request.QueryString.Keys[k];
          string sqlstr = HttpContext.Current.Request.QueryString[getsqlkey];
          string[] replace_sqls = fileter_sql.Split(',');
          foreach (string replace_sql in replace_sqls)
          {
            sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase);
          }
          HttpContext.Current.Request.QueryString[getsqlkey] = sqlstr;
        }
      }


      // -----------------------防 Cookies 注入-----------------------
      if (HttpContext.Current.Request.Cookies != null)
      {
        PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        //把 Cookies 属性改为可读写
        isreadonly.SetValue(HttpContext.Current.Request.Cookies, false, null);

        for (int k = 0; k < System.Web.HttpContext.Current.Request.Cookies.Count; k++)
        {
          string getsqlkey = HttpContext.Current.Request.Cookies.Keys[k];
          string sqlstr = HttpContext.Current.Request.Cookies[getsqlkey].Value;
          string[] replace_sqls = fileter_sql.Split(',');
          foreach (string replace_sql in replace_sqls)
          {
            sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase);
          }
          HttpContext.Current.Request.Cookies[getsqlkey].Value = sqlstr;
        }
      }
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.Message);
    }

  }

}

相关文章

  • Visual Studio 2017中找回消失的“在浏览器中查看”命令

    Visual Studio 2017中找回消失的“在浏览器中查看”命令

    这篇文章主要为大家详细介绍了如何在Visual Studio 2017中找回消失的“在浏览器中查看”命令,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • .net三层结构初探分析

    .net三层结构初探分析

    最近开始对架构开始了研究,当然由于水平不够,先研究了“简单的三层结构”,至于“抽象工厂模式”放后面来研究吧!
    2008-09-09
  • 浅谈.Net Core 认证系统源码解析

    浅谈.Net Core 认证系统源码解析

    这篇文章主要介绍了浅谈.Net Core 认证系统源码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • asp.net+jquery Jsonp使用方法

    asp.net+jquery Jsonp使用方法

    Jsonp的用法非常简单,不过需要服务器端和客户端同时支持。
    2010-04-04
  • 请求如何进入ASP.NET MVC框架

    请求如何进入ASP.NET MVC框架

    这篇文章主要介绍了请求如何进入ASP.NET MVC框架的实现过程,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • asp.net TripleDES加密、解密算法

    asp.net TripleDES加密、解密算法

    加密,使用密码产生加密算法的公钥,并使用TripleDES对密码进行加密。解密,使用密码产生加密算法的公钥,并使用TripleDES对加密数据进行解密。
    2008-08-08
  • asp.net 读取xml文件里面的内容,绑定到dropdownlist中

    asp.net 读取xml文件里面的内容,绑定到dropdownlist中

    asp.net 读取xml文件里面的内容,绑定到dropdownlist中的实现代码。
    2009-05-05
  • ASP.NET Web页生命周期和执行的方法介绍

    ASP.NET Web页生命周期和执行的方法介绍

    这是前几天去一家公司时,其中当时的一个笔试题! 我去,看了当时我就晕菜了,所以,就记录下来,以备以后查看,方便需要的朋友
    2012-10-10
  • .NET 6开发TodoList应用之实现ActionFilter

    .NET 6开发TodoList应用之实现ActionFilter

    Filter在.NET Web API项目开发中也是很重要的一个概念,它运行在执行MVC响应的Pipeline中执行,允许我们将一些可以在多个Action之间重用的逻辑抽取出来集中管理。本文将详细介绍一下.NET 6如何实现ActionFilter,感兴趣的可以学习一下
    2021-12-12
  • .NET分页控件简单学习

    .NET分页控件简单学习

    这篇文章主要为大家详细介绍了.NET分页控件的制作方法和实现原理,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论