<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      防范SQL注入的5種完成方式

      [摘要]一、SQL注入簡介SQL注入是比較常見的網絡攻擊方式之一,它不是利用操作系統的BUG來實現攻擊,而是針對程序員編程時的疏忽,通過SQL語句,實現無帳號登錄,甚至篡改數據庫。二、SQL注入攻擊的總體思...
      一、SQL注入簡介

      SQL注入是比較常見的網絡攻擊方式之一,它不是利用操作系統的BUG來實現攻擊,而是針對程序員編程時的疏忽,通過SQL語句,實現無帳號登錄,甚至篡改數據庫。

      二、SQL注入攻擊的總體思路

      1.尋找到SQL注入的位置

      2.判斷服務器類型和后臺數據庫類型

      3.針對不通的服務器和數據庫特點進行SQL注入攻擊

      三、SQL注入攻擊實例

      比如在一個登錄界面,要求輸入用戶名和密碼:

      可以這樣輸入實現免帳號登錄:

      用戶名: ‘or 1 = 1 –

      密 碼:

      點登陸,如若沒有做特殊處理,那么這個非法用戶就很得意的登陸進去了.(當然現在的有些語言的數據庫API已經處理了這些問題)

      這是為什么呢? 下面我們分析一下:

      從理論上說,后臺認證程序中會有如下的SQL語句:

      String sql = "select * from user_table where username=
      ' "+userName+" ' and password=' "+password+" '";

      當輸入了上面的用戶名和密碼,上面的SQL語句變成:

      SELECT * FROM user_table WHERE username=
      '’or 1 = 1 -- and password='’

      分析SQL語句:

      條件后面username=”or 1=1 用戶名等于 ” 或1=1 那么這個條件一定會成功;

      然后后面加兩個-,這意味著注釋,它將后面的語句注釋,讓他們不起作用,這樣語句永遠都能正確執行,用戶輕易騙過系統,獲取合法身份。

      這還是比較溫柔的,如果是執行

      SELECT * FROM user_table WHERE
      username='' ;DROP DATABASE (DB Name) --' and password=''

      ….其后果可想而知…

      四、應對方法

      下面我針對JSP,說一下應對方法:

      1.(簡單又有效的方法)PreparedStatement

      采用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的setXXX方法傳值即可。

      使用好處:

      (1).代碼的可讀性和可維護性.

      (2).PreparedStatement盡最大可能提高性能.

      (3).最重要的一點是極大地提高了安全性.

      原理:

      sql注入只對sql語句的準備(編譯)過程有破壞作用

      而PreparedStatement已經準備好了,執行階段只是把輸入串作為數據處理,

      而不再對sql語句進行解析,準備,因此也就避免了sql注入問題.

      2.使用正則表達式過濾傳入的參數

      要引入的包:

      import java.util.regex.*;

      正則表達式:

      private String CHECKSQL = “^(.+)\\sand\\s(.+) (.+)\\sor(.+)\\s$”;

      判斷是否匹配:

      Pattern.matches(CHECKSQL,targerStr);

      下面是具體的正則表達式:

      檢測SQL meta-characters的正則表達式 :

      /(\%27) (\’) (\-\-) (\%23) (#)/ix

      修正檢測SQL meta-characters的正則表達式 :/((\%3D) (=))[^\n]*((\%27) (\’) (\-\-) (\%3B) (:))/i

      典型的SQL 注入攻擊的正則表達式 :/\w*((\%27) (\’))((\%6F) o (\%4F))((\%72) r (\%52))/ix

      檢測SQL注入,UNION查詢關鍵字的正則表達式 :/((\%27) (\’))union/ix(\%27) (\’)

      檢測MS SQL Server SQL注入攻擊的正則表達式:

      /exec(\s \+)+(s x)p\w+/ix

      等等…..

      3.字符串過濾

      比較通用的一個方法:

      ( 之間的參數可以根據自己程序的需要添加)

      public static boolean sql_inj(String str){
      String inj_str = "' and exec insert select delete update 
      count * % chr mid master truncate char declare ; or - + ,";
      String inj_stra[] = split(inj_str," ");
      for (int i=0 ; i < inj_stra.length ; i++ ){
      if (str.indexOf(inj_stra[i])>=0){
      return true;
      }
      }
      return false;
      }

      4.jsp中調用該函數檢查是否包函非法字符

      防止SQL從URL注入:

      sql_inj.java代碼:
      package sql_inj;
      import java.net.*;
      import java.io.*;
      import java.sql.*;
      import java.text.*;
      import java.lang.String;
      public class sql_inj{
      public static boolean sql_inj(String str){
      String inj_str = "' and exec insert select delete update 
      count * % chr mid master truncate char declare ; or - + ,";
      //這里的東西還可以自己添加
      String[] inj_stra=inj_str.split("\\ ");
      for (int i=0 ; i < inj_stra.length ; i++ ){
      if (str.indexOf(inj_stra[i])>=0){
      return true;
      }
      }
      return false;
      }
      }

      5.JSP頁面判斷代碼:

      使用javascript在客戶端進行不安全字符屏蔽

      功能介紹:檢查是否含有”‘”,”\\”,”/”

      參數說明:要檢查的字符串

      返回值:0:是1:不是

      函數名是

      function check(a){
      return 1;
      fibdn = new Array (”‘” ,”\\”,”/”);
      i=fibdn.length;
      j=a.length;
      for (ii=0; ii<i; ii++)
      { for (jj=0; jj<j; jj++)
      { temp1=a.charAt(jj);
      temp2=fibdn[ii];
      if (tem’; p1==temp2)
      { return 0; }
      }
      }
      return 1;
      }

      總的說來,防范一般的SQL注入只要在代碼規范上下點功夫就可以了。

      凡涉及到執行的SQL中有變量時,用JDBC(或者其他數據持久層)提供的如:PreparedStatement就可以 ,切記不要用拼接字符串的方法就可以了。

      本文主要講了五種實現防止sql注入的方法,更多相關內容請關注php中文網。

      相關推薦:

      關于MySQL 的高可用性:Keepalived 雙主熱備

      使用php寫出幾種常見的排序算法程序

      PHP如何判斷是否為AJAX請求?

      以上就是防止SQL注入的五種實現方式的詳細內容,更多請關注php中文網其它相關文章!


      學習教程快速掌握從入門到精通的SQL知識。




      日韩精品一区二区三区高清