人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

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

發(fā)布日期:2022-01-10 12:22 | 文章來源:gibhub
1.什么是SQL注入
所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶輸入的內(nèi)容直接用來構(gòu)造(或者影響)動態(tài)SQL命令,或作為存儲過程的輸入?yún)?shù),這類表單特別容易受到SQL注入式攻擊。 2.怎么進(jìn)行SQL注入
關(guān)于怎么進(jìn)行SQL注入,網(wǎng)上已經(jīng)有很多文章詳細(xì)介紹過了,可以參考博友滴答的雨的博文 《SQL注入攻防入門詳解》,親測有效。當(dāng)執(zhí)行完文中的5、6、7三步的時候,你會發(fā)現(xiàn)服務(wù)器上的安全保護(hù)措施都已是浮云,服務(wù)器也因此變成了名副其實(shí)的“肉機(jī)”。下面附上一張我在本機(jī)執(zhí)行完文中描述的腳本后的效果截圖(Win8 x64 操作系統(tǒng)):

image
微軟的“不禁止即允許(Not forbidden is allow)”的做法使得操作系統(tǒng)像是服務(wù)器所穿的鏤空禮物一樣,美觀但卻有很多“漏洞”。好了,現(xiàn)在此小黑已經(jīng)擁有了服務(wù)器的管理員權(quán)限,很顯然元芳怎么看已經(jīng)不重要了。 3.如何防止SQL注入的發(fā)生
滴答的雨已經(jīng)在博文詳細(xì)闡述了SQL Server數(shù)據(jù)庫如何進(jìn)行防注入的操作,這里不再贅述。這一篇我主要說一下對于一個使用拼接SQL進(jìn)行查詢操作的Web應(yīng)用,怎么進(jìn)行防注入操作。
先說一些前提,為什么我們要使用拼接SQL的方式進(jìn)行查詢?偷懶唄。這在開發(fā)過程中,看似省去了編寫參數(shù)化部分的代碼量,節(jié)省了時間和精力。但這樣做的結(jié)果就是應(yīng)用的安全性大打折扣,而且拼SQL方式創(chuàng)建的應(yīng)用,后期的維護(hù)難度也很大。SQL參數(shù)化查詢是最簡單有效的避免SQL注入的解決方案,目前主流的ORM框架(MyBatis.NET/NHibernate/EntityFramework)都內(nèi)置支持并且推薦使用這種方式進(jìn)行持久層封裝。 然而有數(shù)據(jù)庫不支持參數(shù)化查詢怎么辦?是的,你沒有看錯,確實(shí)有這樣的數(shù)據(jù)庫存在。吐個槽先,個人認(rèn)為,一切不支持參數(shù)化查詢的數(shù)據(jù)庫都是在“耍流氓”,這種天然的缺陷會讓小黑們肆無忌憚地去“非禮”服務(wù)器,至少是數(shù)據(jù)庫本身。在這樣的情況下,我覺得其他功能做得再好也只能算是花拳繡腿,連最基本的數(shù)據(jù)都保護(hù)不了,那不等同于將勞動成果拱手讓人。按照存在即合理的邏輯,我們暫且認(rèn)為它是合理的。 來說說我目前的做法,基于上述數(shù)據(jù)庫創(chuàng)建的Web應(yīng)用,拼接SQL操作已經(jīng)滲透到站點(diǎn)的每個頁面、每個用戶控件,所以我采用的方式是請求過濾。
下面是防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:   //如果記錄注入信息,那么請設(shè)置:errMDBpath:數(shù)據(jù)庫路徑
 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>****以上信息已記錄至日志數(shù)據(jù)庫****");
 76:    else
 77:     System.Web.HttpContext.Current.Response.Write("<br>日志數(shù)據(jù)庫出錯");
 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>請不要嘗試未授權(quán)之入侵檢測!</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()'>關(guān)閉</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('請不要嘗試未授權(quán)之入侵檢測!');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:   }
國內(nèi)礦機(jī)海外托管產(chǎn)品方案

-->

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實(shí)時開通

自選配置、實(shí)時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信