好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > T-SQL篇如何防止SQL注入的解決方法

T-SQL篇如何防止SQL注入的解決方法

熱門標簽:重慶防封電銷機器人供應商 北京辦理400電話多少 山西語音外呼系統價格 威海智能語音外呼系統 400電話申請需要開戶費嗎 溫州語音外呼系統代理 西安青牛防封電銷卡 智能語音外呼系統哪個牌子好 南京電銷外呼系統運營商
1.什么是SQL注入
所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。

2.怎么進行SQL注入
關于怎么進行SQL注入,網上已經有很多文章詳細介紹過了,可以參考博友滴答的雨的博文 《SQL注入攻防入門詳解》,親測有效。當執行完文中的5、6、7三步的時候,你會發現服務器上的安全保護措施都已是浮云,服務器也因此變成了名副其實的“肉機”。下面附上一張我在本機執行完文中描述的腳本后的效果截圖(Win8 x64 操作系統):


微軟的“不禁止即允許(Not forbidden is allow)”的做法使得操作系統像是服務器所穿的鏤空禮物一樣,美觀但卻有很多“漏洞”。好了,現在此小黑已經擁有了服務器的管理員權限,很顯然元芳怎么看已經不重要了。

3.如何防止SQL注入的發生
滴答的雨已經在博文詳細闡述了SQL Server數據庫如何進行防注入的操作,這里不再贅述。這一篇我主要說一下對于一個使用拼接SQL進行查詢操作的Web應用,怎么進行防注入操作。
先說一些前提,為什么我們要使用拼接SQL的方式進行查詢?偷懶唄。這在開發過程中,看似省去了編寫參數化部分的代碼量,節省了時間和精力。但這樣做的結果就是應用的安全性大打折扣,而且拼SQL方式創建的應用,后期的維護難度也很大。SQL參數化查詢是最簡單有效的避免SQL注入的解決方案,目前主流的ORM框架(MyBatis.NET/NHibernate/EntityFramework)都內置支持并且推薦使用這種方式進行持久層封裝。

然而有數據庫不支持參數化查詢怎么辦?是的,你沒有看錯,確實有這樣的數據庫存在。吐個槽先,個人認為,一切不支持參數化查詢的數據庫都是在“耍流氓”,這種天然的缺陷會讓小黑們肆無忌憚地去“非禮”服務器,至少是數據庫本身。在這樣的情況下,我覺得其他功能做得再好也只能算是花拳繡腿,連最基本的數據都保護不了,那不等同于將勞動成果拱手讓人。按照存在即合理的邏輯,我們暫且認為它是合理的。

來說說我目前的做法,基于上述數據庫創建的Web應用,拼接SQL操作已經滲透到站點的每個頁面、每個用戶控件,所以我采用的方式是請求過濾。
下面是防SQL注入的操作類:

 1: /// summary>
 2:  ///SqlInject 的摘要說明
 3:  /// /summary>
 4:  public class SqlInject : System.Web.UI.Page
 5:  {
 6:   //檢測到注入后的處理方式: 0:僅警告;1:警告+記錄;2:警告+自定義錯誤頁面;3:警告+記錄+自定義錯誤頁面
 7:   private const int _type = 0;
 8:   private const string errRedirectPage = "/err.aspx";
 9:  
 10:   //如果記錄注入信息,那么請設置:errMDBpath:數據庫路徑
 11:   private const string errMDBpath = "/SqlInject.mdb";
 12:  
 13:  
 14:   //過濾特征字符
 15:   //過濾特征字符
 16:   private static string StrKeyWord = ConfigurationManager.AppSettings["SqlKeyWord"]; //@"select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec|master|net local group administrators|net user|or|and";
 17:   private static string StrRegex = ConfigurationManager.AppSettings["SqlRegex"];  //@";|/|(|)|[|]|{|}|%|@|*|'|!"; // 原始過濾條件:【-|;|,|/|(|)|[|]|{|}|%|@|*|'|!】
 18:  
 19:   private HttpRequest request;
 20:   public SqlInject(System.Web.HttpRequest _request)
 21:   {
 22:    this.request = _request;
 23:   }
 24:   ///summary>
 25:   ///檢測SQL注入及記錄、顯示出錯信息
 26:   ////summary>
 27:   public void CheckSqlInject()
 28:   {
 29:    bool isInject = false;
 30:    if (CheckRequestQuery() || CheckRequestForm())
 31:    {
 32:     isInject = true;
 33:    }
 34:    else
 35:    {
 36:     return;
 37:    }
 38:  
 39:    switch (_type)
 40:    {
 41:     case 0:
 42:      ShowErr();
 43:      break;
 44:     case 1:
 45:      ShowErr();
 46:      SaveToMdb();
 47:      break;
 48:     case 2:
 49:      ShowErr();
 50:      string temp;
 51:      System.Web.HttpContext.Current.Response.Write("script>setTimeout(\"" + "location.href='" + errRedirectPage + "'" + "\",5000)/script>");
 52:      break;
 53:     case 3:
 54:      ShowErr();
 55:      SaveToMdb();
 56:      System.Web.HttpContext.Current.Response.Write("script>setTimeout(\"" + "location.href='" + errRedirectPage + "'" + "\",5000)/script>");
 57:      break;
 58:     default:
 59:      break;
 60:    }
 61:    System.Web.HttpContext.Current.Response.End();
 62:  
 63:   }
 64:   private void SaveToMdb()
 65:   {
 66:    OleDbConnection conn = new OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + Server.MapPath(errMDBpath));
 67:    conn.Open();
 68:    OleDbCommand cmd = conn.CreateCommand();
 69:  
 70:    cmd.CommandText = "insert into [Record] (sIP,sDate,sPath) values ('" +
 71:        request.ServerVariables["REMOTE_ADDR"].ToString() + "','" +
 72:        DateTime.Now + "','" + request.ServerVariables["URL"].ToLower() + RelaceSingleQuotes(request.QueryString.ToString()) + "')";
 73:    int code = cmd.ExecuteNonQuery();
 74:    if (code == 1)
 75:     System.Web.HttpContext.Current.Response.Write("br>****以上信息已記錄至日志數據庫****");
 76:    else
 77:     System.Web.HttpContext.Current.Response.Write("br>日志數據庫出錯");
 78:    conn.Close();
 79:  
 80:   }
 81:   private string RelaceSingleQuotes(string _url)
 82:   {
 83:    string URL = _url.Replace("'", "單引號");
 84:    return URL;
 85:   }
 86:   private void ShowErr()
 87:   {
 88:    //string msg = @"font color=red>請不要嘗試未授權之入侵檢測!/font>" + @"br>br>";
 89:    //msg += @"操作IP:" + request.ServerVariables["REMOTE_ADDR"] + @"br>";
 90:    //msg += @"操作時間:" + DateTime.Now + @"br>";
 91:    //msg += @"頁面:" + request.ServerVariables["URL"].ToLower() + request.QueryString.ToString() + @"br>";
 92:    //msg += @"a href='#' onclick='javascript:window.close()'>關閉/a>";
 93:    //System.Web.HttpContext.Current.Response.Clear();
 94:    //System.Web.HttpContext.Current.Response.Write(msg);
 95:    System.Web.HttpContext.Current.Response.Write("script>alert('請不要嘗試未授權之入侵檢測!');javascript:history.go(-1);/script>");
 96:   }
 97:   ///summary>
 98:   /// 特征字符
 99:   ////summary>
 100:   public static string KeyWord
 101:   {
 102:    get
 103:    {
 104:     return StrKeyWord;
 105:    }
 106:   }
 107:   ///summary>
 108:   /// 特征符號
 109:   ////summary>
 110:   public static string RegexString
 111:   {
 112:    get
 113:    {
 114:     return StrRegex;
 115:    }
 116:   }
 117:  
 118:   ///summary>
 119:   ///檢查字符串中是否包含Sql注入關鍵字
 120:   /// param name="_key">被檢查的字符串/param>
 121:   /// returns>如果包含注入true;否則返回false/returns>
 122:   ////summary>
 123:   private static bool CheckKeyWord(string _key)
 124:   {
 125:    string[] pattenString = StrKeyWord.Split('|');
 126:    string[] pattenRegex = StrRegex.Split('|');
 127:    foreach (string sqlParam in pattenString)
 128:    {
 129:     if (_key.Contains(sqlParam + " ") || _key.Contains(" " + sqlParam))
 130:     {
 131:      return true;
 132:     }
 133:    }
 134:    foreach (string sqlParam in pattenRegex)
 135:    {
 136:     if (_key.Contains(sqlParam))
 137:     {
 138:      return true;
 139:     }
 140:    }
 141:    return false;
 142:  
 143:   }
 144:   ///summary>
 145:   ///檢查URL中是否包含Sql注入
 146:   /// param name="_request">當前HttpRequest對象/param>
 147:   /// returns>如果包含注入true;否則返回false/returns>
 148:   ////summary>
 149:   public bool CheckRequestQuery()
 150:   {
 151:    if (request.QueryString.Count > 0)
 152:    {
 153:     foreach (string sqlParam in this.request.QueryString)
 154:     {
 155:      if (sqlParam == "__VIEWSTATE") continue;
 156:      if (sqlParam == "__EVENTVALIDATION") continue;
 157:      if (CheckKeyWord(request.QueryString[sqlParam].ToLower()))
 158:      {
 159:       return true;
 160:      }
 161:     }
 162:    }
 163:    return false;
 164:   }
 165:   ///summary>
 166:   ///檢查提交的表單中是否包含Sql注入
 167:   /// param name="_request">當前HttpRequest對象/param>
 168:   /// returns>如果包含注入true;否則返回false/returns>
 169:   ////summary>
 170:   public bool CheckRequestForm()
 171:   {
 172:    if (request.Form.Count > 0)
 173:    {
 174:     foreach (string sqlParam in this.request.Form)
 175:     {
 176:      if (sqlParam == "__VIEWSTATE") continue;
 177:      if (sqlParam == "__EVENTVALIDATION") continue;
 178:      if (CheckKeyWord(request.Form[sqlParam]))
 179:      {
 180:       return true;
 181:      }
 182:     }
 183:    }
 184:    return false;
 185:   }
 186:  }

過濾類是在某前輩的作品基礎上改的,很抱歉我已經找不到最原始的出處了。需要在Web.Config中添加防SQL注入的特征字符集:

復制代碼 代碼如下:

!--防SQL注入時的特征字符集-->
add key="SqlKeyWord" value="select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec|master|net local group administrators|net user|or|and"/>
add key="SqlRegex" value=";|(|)|[|]|{|}|%|@|*|'|!"/>

使用方法很簡單,在站點的Global文件中,添加 Application_BeginRequest 事件即可:
復制代碼 代碼如下:

protected void Application_BeginRequest(object sender, EventArgs e)
{
//防SQL注入代碼
SqlInject myCheck = new SqlInject(this.Request);
myCheck.CheckSqlInject();
}

ASP.NET SQL 注入免費解決方案
任何一種使用數據庫web程序(當然,也包括桌面程序)都有被SQL注入的風險。防止被SQL注入,最基本的方法是在代碼級別就要阻止這種可能,這個網上講的很多,我就不多說了。不過如果你拿到的是一個已經完工的產品,這個時候該如何解決呢?我介紹幾種對于ASP和ASP.NET有效的防止SQL注入的方案,而且是免費的。
UrlScan 3.1
UrlScan 3.1是一個安全方面的工具,微軟官方的東西。它會檢查所有IIS處理的HTTP請求。UrlScan 可以在有安全問題的HTTP請求到達應用程序之前就阻止這個請求。UrlScan 3.1 是UrlScan 2.5的一個升級版本,支持Windows Vista 和Windows Server 2008系統之上的IIS 5.1, IIS 6.0 和 IIS 7.0。

鏈接地址:http://www.iis.net/expand/UrlScan 這里還有很多非常有用的IIS擴展,可以看看。

IIS 6 SQL Injection Sanitation ISAPI Wildcard
這個ISAPI dll 也是通過檢查HTTP請求避免SQL注入。只兼容windows 2003上的 IIS 6.0。對于Windows XP 上的 IIS 5 不支持。

您可能感興趣的文章:
  • php中防止SQL注入的最佳解決方法
  • PHP開發中常見的安全問題詳解和解決方法(如Sql注入、CSRF、Xss、CC等)
  • ASP+MSSQL2000 數據庫被批量注入后的解決方法
  • MySQL Proxy(解決注入的另一思路)
  • MySQL解決SQL注入的另類方法詳解
  • SQL注入原理與解決方法代碼示例
  • 通過ibatis解決sql注入問題
  • sqlserver 數據庫被注入解決方案
  • SQL注入漏洞過程實例及解決方案
  • 實例介紹SQL注入以及如何解決

標簽:貸款群呼 河源 宜春 濟寧 黃山 中衛 新余 金昌

巨人網絡通訊聲明:本文標題《T-SQL篇如何防止SQL注入的解決方法》,本文關鍵詞  T-SQL,篇,如何,防止,SQL,注入,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《T-SQL篇如何防止SQL注入的解決方法》相關的同類信息!
  • 本頁收集關于T-SQL篇如何防止SQL注入的解決方法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 黄色国产| 美女黄色免费看| 国产精品久久777777是什么意思| 久草网站在线| 欧美xxxx做受欧美88xx| 女生一次可以吃多少精华液| 91肥熟| 国产露脸无套对白在线播放| 91香蕉成人免费高清网站| 美国电影《浴室吃奶》| 老牛影院在线精品免费观看网站| 男同黄网站| 国产2345在线亚洲精品 | 龚玥菲被4个3小时| 老色鬼久久亚洲AV无码AI换脸| 国产精品www夜色视频| 跳蛋在里面震动嗯哼~啊哈...| 一区二区国产精品精华液| 女人把私密部位扒开让男生摸 | 东京热Av成人无码免费视频| 小说h乳喷榨乳奶水| 欧美高清性xxxxxxx| jizzjizz老师太多水日本| 翁莹情乱第全部篇| 巨胸美女爆X免费网站软件| 乱辈三级完整电影| 欧美日韩在线视频| 日久成瘾糙汉h1vl1| 黄视频软件大全| wwwxxxxhd| 女人被躁到高潮嗷嗷叫视频| 国产精品无码无片在线观看秋葵视| 好吊顶视频国产在线观看| ?国产精品嫩草影院入口| 被各种工具扩张虐女拳头视频| 操鸡小说| 男人女人拍拍拍免费网站| 男女狂揉吃奶胸高潮动态图免费| 懂色Av一区二区三区四区在线播放 | 噜噜噜在线观看| 长大了可以c了视频|