java 防止sql注入的方法(非原創)

 
1、SQL注入簡介       SQL注入是比較常見的網絡攻擊方式之一,它不是利用操做系統的BUG來實現攻擊,而是針對程序員編程時的疏忽,經過SQL語句,實現無賬號登陸,甚至篡改數據庫。 2、SQL注入攻擊的整體思路

1、SQL注入簡介javascript

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

 

2、SQL注入攻擊的整體思路程序員

 1.尋找到SQL注入的位置正則表達式

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

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

 

 3、SQL注入攻擊實例編程

 好比在一個登陸界面,要求輸入用戶名和密碼:安全

 能夠這樣輸入實現免賬號登陸:服務器

 用戶名: ‘or 1 = 1 –網絡

密 碼:

 點登錄,如若沒有作特殊處理,那麼這個非法用戶就很得意的登錄進去了.(固然如今的有些語言的數據庫API已經處理了這些問題)

 這是爲何呢? 下面咱們分析一下:

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

 String sql = "select * from user_table where username=

  1. ' "+userName+" ' and password=' "+password+" '";
複製

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

 SELECT * FROM user_table WHERE username=

  1. '’or 1 = 1 -- and password='
複製

 分析SQL語句:

條件後面username=」or 1=1 用戶名等於 」 或1=1 那麼這個條件必定會成功;

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

 

這仍是比較溫柔的,若是是執行 

  1. SELECT * FROM user_table WHERE
  2. username='' ;DROP DATABASE (DB Name) --' and password=''
複製

 ….其後果可想而知… 

 

4、應對方法

 

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

 

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

 

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

 

使用好處:

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

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

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

 

原理:

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

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

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

  

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

要引入的包:

  1. import java.util.regex.*;
複製

 正則表達式:

  1. private String CHECKSQL = 「^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$」;
複製

 判斷是否匹配:

  1. Pattern.matches(CHECKSQL,targerStr);
複製

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

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

  1. /(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix
複製

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

  1. /((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i
複製

典型的SQL 注入攻擊的正則表達式 :

  1. /\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
複製

檢測SQL注入,UNION查詢關鍵字的正則表達式 :

  1. /((\%27)|(\’))union/ix(\%27)|(\’)
複製

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

  1. /exec(\s|\+)+(s|x)p\w+/ix
複製

等等…..

  

3.字符串過濾

 

比較通用的一個方法:

(||之間的參數能夠根據本身程序的須要添加) 

  1. public static boolean sql_inj(String str)
  2. {
  3. String inj_str = "'|and|exec|insert|select|delete|update|
  4. count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
  5. String inj_stra[] = split(inj_str,"|");
  6. for (int i=0 ; i < inj_stra.length ; i++ )
  7. {
  8. if (str.indexOf(inj_stra[i])>=0)
  9. {
  10. return true;
  11. }
  12. }
  13. return false;
  14. }
複製

  

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

 

防止SQL從URL注入:

 sql_inj.java代碼: 

  1. package sql_inj;
  2.  
  3. import java.net.*;
  4. import java.io.*;
  5. import java.sql.*;
  6. import java.text.*;
  7. import java.lang.String;
  8.  
  9. public class sql_inj{
  10. public static boolean sql_inj(String str)
  11. {
  12. String inj_str = "'|and|exec|insert|select|delete|update|
  13. count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
  14. //這裏的東西還能夠本身添加
  15. String[] inj_stra=inj_str.split("\\|");
  16. for (int i=0 ; i < inj_stra.length ; i++ )
  17. {
  18. if (str.indexOf(inj_stra[i])>=0)
  19. {
  20. return true;
  21. }
  22. }
  23. return false;
  24. }
  25. }
複製

 

5.JSP頁面判斷代碼:

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

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

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

返回值:0:是1:不是

函數名是

  1. function check(a)
  2. {
  3. return 1;
  4. fibdn = new Array (」‘」 ,」\\」,」/」);
  5. i=fibdn.length;
  6. j=a.length;
  7. for (ii=0; iii; ii++)
  8. { for (jj=0; jjj; jj++)
  9. { temp1=a.charAt(jj);
  10. temp2=fibdn[ii];
  11. if (tem’; p1==temp2)
  12. { return 0; }
  13. }
  14. }
  15. return 1;
  16.  
  17. }
複製

===================================

 

總的說來,防範通常的SQL注入只要在代碼規範上下點功夫就能夠了。

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

相關文章
相關標籤/搜索