成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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)都內置支持并且推薦使用這種方式進行持久層封裝。

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

來說說我目前的做法,基于上述數據庫創建的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.   //如果記錄注入信息,那么請設置:errMDBpath:數據庫路徑  
  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注入及記錄、顯示出錯信息  
  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>****以上信息已記錄至日志數據庫****");  
  72.    else 
  73.      System.Web.HttpContext.Current.Response.Write("<br>日志數據庫出錯");  
  74.     conn.Close();  
  75.    
  76.  }  
  77.    private string RelaceSingleQuotes(string _url)  
  78.   {  
  79.    string URL = _url.Replace("'""單引號");  
  80.    return URL;  
  81.   }  
  82.   private void ShowErr()  
  83.    {  
  84.    //string msg = @"<font color=red>請不要嘗試未授權之入侵檢測!</font>" + @"<br><br>";  
  85.   //msg += @"操作IP:" + request.ServerVariables["REMOTE_ADDR"] + @"<br>";  
  86.    //msg += @"操作時間:" + DateTime.Now + @"<br>";  
  87.    //msg += @"頁面:" + request.ServerVariables["URL"].ToLower() + request.QueryString.ToString() + @"<br>";  
  88.    //msg += @"<a href='#' onclick='javascript:window.close()'>關閉</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('請不要嘗試未授權之入侵檢測!');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.  /// 特征符號  
  105.    ///</summary>  
  106.   public static string RegexString  
  107.  {  
  108.     get  
  109.    {  
  110.      return StrRegex;  
  111.     }  
  112.   }  
  113.     
  114.   ///<summary>  
  115.   ///檢查字符串中是否包含Sql注入關鍵字  
  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">當前HttpRequest對象</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">當前HttpRequest對象</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#

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

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

  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 注入免費解決方案

任何一種使用數據庫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 不支持。

責任編輯:藍雨淚 來源: 黑客x檔案
相關推薦

2010-10-22 15:18:18

SQL注入漏洞

2010-07-20 13:52:27

SQL Server

2020-09-28 09:30:13

mybatis

2010-07-06 10:36:35

SQL Server

2010-10-19 16:06:26

SQL Server索

2023-08-15 08:26:34

SQL Server查找死鎖

2020-08-07 08:13:08

SQL攻擊模式

2011-10-19 10:07:16

T-SQL查詢變量

2017-03-01 14:16:20

2010-07-19 13:22:45

SQL Server

2009-05-06 17:31:17

SQL EnlightT-SQL分析器

2010-06-30 14:54:42

SQL Server

2010-12-06 09:26:23

SQL Server

2011-02-25 14:42:10

SQLwith關鍵字

2011-07-08 13:40:18

2011-12-30 11:04:14

2010-10-19 10:25:29

SQL Server連

2011-03-31 09:30:27

SQL Server數管理SQL

2020-10-04 13:29:00

SQL數據庫工具

2011-08-09 12:15:08

SQL Server日志已滿
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91久久精品一区二区二区 | 成人亚洲精品久久久久软件 | 久久中文字幕电影 | 2021狠狠干 | 97色在线观看免费视频 | 成人网av | 99re视频| 最新国产视频 | 91精品国产91久久久久久最新 | 欧美xxxx性xxxxx高清 | 国产精品爱久久久久久久 | 成人在线观看免费视频 | 成人在线激情 | 欧美久久不卡 | 99免费视频 | 中文字幕日韩欧美 | 91精品国产自产在线老师啪 | 一区二区在线免费观看 | 亚洲高清一区二区三区 | 国产精品高潮呻吟久久 | 日日夜夜精品免费视频 | 免费观看一级特黄欧美大片 | 久久精品这里精品 | 免费一区 | 特级做a爰片毛片免费看108 | 成人在线视频观看 | www国产精品 | 欧美精品99 | 色综合99| 亚洲一区二区三区四区五区中文 | 亚洲精品一区二三区不卡 | 欧州一区二区 | 农村真人裸体丰满少妇毛片 | 亚洲第一成人av | 一区二区三区在线 | 国产精品九九 | 一区二区三区视频 | 亚洲劲爆av | 91在线一区二区 | 超碰成人在线观看 | 日韩久久成人 |