最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET過濾類SqlFilter,防止SQL注入 原創(chuàng)

原創(chuàng)  更新時間:2016年03月25日 11:09:36   原創(chuàng) 作者:yourber  
本文分享一個防SQL注入的過濾類SqlFilter,可以防止通過POST、GET和Cookies的注入。

什么是SQL注入?

我理解的sql注入就是一些人可以通過惡意的參數(shù)輸入,讓后臺執(zhí)行這段SQL,然后達到獲取數(shù)據(jù)或者破壞數(shù)據(jù)庫的目的!
舉個簡單的查詢例子,后臺sql是拼接的:select * from Test where name='+參數(shù)傳遞+';前臺頁面要求輸入name,那么黑客可以輸入: ';DROP TABLE Test;--   不要小瞧這一段SQL代碼:
select * from Test where name=' ';DROP TABLE Test;--';在SQL中是正確的,可執(zhí)行的,但是執(zhí)行后整個Test表都刪除了,網(wǎng)站崩潰!

最好的解決方法

最好的辦法就是不寫拼接SQL,改用參數(shù)化SQL,推薦新項目使用。這里不做介紹,感興趣的朋友可以自行搜索一下,本文介紹的方法適合老項目,就是沒有使用參數(shù)化SQL開發(fā)的程序。

使用過濾函數(shù)來過濾

將SQL一些危險的關(guān)鍵字,還有注釋百分號以及分號這些根本在我們正常寫代碼的時候根本不會出現(xiàn)的字符都過濾掉,這樣能最大限度的保證SQL執(zhí)行是安全的,代碼如下:

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);
    }

  }

}

相關(guān)文章

最新評論

延庆县| 丹阳市| 永城市| 鄯善县| 嘉善县| 杭锦后旗| 南部县| 建湖县| 辉县市| 沭阳县| 进贤县| 鲁甸县| 绿春县| 曲松县| 台东县| 巨鹿县| 永顺县| 四川省| 宁明县| 汝南县| 南川市| 枣阳市| 屏东县| 会同县| 茌平县| 通化市| 岫岩| 宁陕县| 普安县| 博白县| 丹寨县| 临西县| 界首市| 辛集市| 黄平县| 新闻| 陇川县| 大田县| 天津市| 阿鲁科尔沁旗| 西华县|