自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

安全 數(shù)據(jù)安全
所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請(qǐng)求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令,對(duì)于這種行為,我們應(yīng)該如何制止呢?本文將介紹一種方法,希望可以幫助有需要的朋友。

所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請(qǐng)求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令,對(duì)于這種行為,我們應(yīng)該如何制止呢?本文將介紹一種方法,希望可以幫助有需要的朋友。

1.什么是SQL注入

所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請(qǐng)求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶輸入的內(nèi)容直接用來構(gòu)造(或者影響)動(dòng)態(tài)SQL命令,或作為存儲(chǔ)過程的輸入?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三步的時(shí)候,你會(huì)發(fā)現(xiàn)服務(wù)器上的安全保護(hù)措施都已是浮云,服務(wù)器也因此變成了名副其實(shí)的“肉機(jī)”。下面附上一張我在本機(jī)執(zhí)行完文中描述的腳本后的效果截圖(Win8 x64 操作系統(tǒng)):

微軟的“不禁止即允許(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)行防注入的操作,這里不再贅述。這一篇我主要說一下對(duì)于一個(gè)使用拼接SQL進(jìn)行查詢操作的Web應(yīng)用,怎么進(jìn)行防注入操作。

先說一些前提,為什么我們要使用拼接SQL的方式進(jìn)行查詢?偷懶唄。這在開發(fā)過程中,看似省去了編寫參數(shù)化部分的代碼量,節(jié)省了時(shí)間和精力。但這樣做的結(jié)果就是應(yīng)用的安全性大打折扣,而且拼SQL方式創(chuàng)建的應(yīng)用,后期的維護(hù)難度也很大。SQL參數(shù)化查詢是最簡單有效的避免SQL注入的解決方案,目前主流的ORM框架(MyBatis.NET/NHibernate/EntityFramework)都內(nèi)置支持并且推薦使用這種方式進(jìn)行持久層封裝。

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

來說說我目前的做法,基于上述數(shù)據(jù)庫創(chuàng)建的Web應(yīng)用,拼接SQL操作已經(jīng)滲透到站點(diǎn)的每個(gè)頁面、每個(gè)用戶控件,所以我采用的方式是請(qǐng)求過濾。

下面是防SQL注入的操作類:

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

#p#

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

復(fù)制代碼 代碼如下:

  1. <!--防SQL注入時(shí)的特征字符集-->   
  2. <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"/>   
  3. <add key="SqlRegex" value=";|(|)|[|]|{|}|%|@|*|'|!"/> 

使用方法很簡單,在站點(diǎn)的Global文件中,添加 Application_BeginRequest 事件即可:

復(fù)制代碼 代碼如下:

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

ASP.NET SQL 注入免費(fèi)解決方案

任何一種使用數(shù)據(jù)庫web程序(當(dāng)然,也包括桌面程序)都有被SQL注入的風(fēng)險(xiǎn)。防止被SQL注入,最基本的方法是在代碼級(jí)別就要阻止這種可能,這個(gè)網(wǎng)上講的很多,我就不多說了。不過如果你拿到的是一個(gè)已經(jīng)完工的產(chǎn)品,這個(gè)時(shí)候該如何解決呢?我介紹幾種對(duì)于ASP和ASP.NET有效的防止SQL注入的方案,而且是免費(fèi)的。

UrlScan 3.1

UrlScan 3.1是一個(gè)安全方面的工具,微軟官方的東西。它會(huì)檢查所有IIS處理的HTTP請(qǐng)求。UrlScan 可以在有安全問題的HTTP請(qǐng)求到達(dá)應(yīng)用程序之前就阻止這個(gè)請(qǐng)求。UrlScan 3.1 是UrlScan 2.5的一個(gè)升級(jí)版本,支持Windows Vista 和Windows Server 2008系統(tǒng)之上的IIS 5.1, IIS 6.0 和 IIS 7.0。

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

IIS 6 SQL Injection Sanitation ISAPI Wildcard

這個(gè)ISAPI dll 也是通過檢查HTTP請(qǐng)求避免SQL注入。只兼容windows 2003上的 IIS 6.0。對(duì)于Windows XP 上的 IIS 5 不支持。

責(zé)任編輯:藍(lán)雨淚 來源: 黑客x檔案
相關(guān)推薦

2010-10-22 15:18:18

SQL注入漏洞

2010-07-20 13:52:27

SQL Server

2020-09-28 09:30:13

mybatis

2023-08-15 08:26:34

SQL Server查找死鎖

2017-03-01 14:16:20

2020-08-07 08:13:08

SQL攻擊模式

2010-10-19 16:06:26

SQL Server索

2010-07-06 10:36:35

SQL Server

2011-10-19 10:07:16

T-SQL查詢變量

2010-12-06 09:26:23

SQL Server

2010-07-19 13:22:45

SQL Server

2009-05-06 17:31:17

SQL EnlightT-SQL分析器

2011-07-08 13:40:18

2010-06-30 14:54:42

SQL Server

2011-03-31 09:30:27

SQL Server數(shù)管理SQL

2011-02-25 14:42:10

SQLwith關(guān)鍵字

2011-12-30 11:04:14

2020-10-04 13:29:00

SQL數(shù)據(jù)庫工具

2009-02-04 16:51:48

2009-07-24 16:59:57

iBatis模糊查詢
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)