• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    ASP.NET过滤类SqlFilter,防止SQL注入 原创

    什么是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);
        }
    
      }
    
    }
    您可能感兴趣的文章:
    • c#.net全站防止SQL注入类的代码
    • asp.net 防止SQL注入攻击
    • asp.net利用HttpModule实现防sql注入
    • asp.net(C#)防sql注入组件的实现代码
    • asp.net下检测SQL注入式攻击代码
    • asp.net 预防SQL注入攻击之我见
    • ASP.NET防范SQL注入式攻击的方法
    • ASP.NET防止SQL注入的方法示例
    • 深入浅析.NET应用程序SQL注入
    • .Net防sql注入的几种方法
    上一篇:ASP.NET MVC的Localization本地化多语言支持
    下一篇:ASP.NET使用HttpWebRequest读取远程网页源代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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