程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> T-SQL篇若何避免SQL注入的處理辦法

T-SQL篇若何避免SQL注入的處理辦法

編輯:MSSQL

T-SQL篇若何避免SQL注入的處理辦法。本站提示廣大學習愛好者:(T-SQL篇若何避免SQL注入的處理辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是T-SQL篇若何避免SQL注入的處理辦法正文


1.甚麼是SQL注入
所謂SQL注入式進擊,就是進擊者把SQL敕令拔出到Web表單的輸出域或頁面要求的查詢字符串,誘騙辦事器履行歹意的SQL敕令。在某些表單中,用戶輸出的內容直接用來結構(或許影響)靜態SQL敕令,或作為存儲進程的輸出參數,這類表單特殊輕易遭到SQL注入式進擊。

2.怎樣停止SQL注入
關於怎樣停止SQL注入,網上曾經有許多文章具體引見過了,可以參考博友滴答的雨的博文 《SQL注入攻防入門詳解》,親測有用。當履行完文中的5、6、7三步的時刻,你會發明辦事器上的平安掩護辦法都已經是浮雲,辦事器也是以釀成了名不虛傳的“肉機”。上面附上一張我在本機履行完文中描寫的劇本後的後果截圖(Win8 x64 操作體系):

image
微軟的“不由止即許可(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.WordStr("'", "單引號");
 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 不支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved