2016-11-04 10:18:35
通過攔截請求修復SQL注入、XSS等注入類弱點漏洞
先對什么是注入類攻擊做一個簡單的介紹。
當你在輸入框中輸入一個查詢時,返回的請求是類似於
SELECT * from tablename WHERE XXX="String"(String是你輸入的內容)
而所謂的注入類就是:
SELECT * from tablename WHERE XXX="String" or 1=1 DELETE * from * WHERE "*"
因為1=1 是成立的,所以后面的刪除語句也會執行,結果就是清空了數據庫,當然作為搞灰產的人來說一般不會去做清空,只是返回出所有的數據庫內的信息,通過這些信息去做些工作。
這里有兩個重點需要說明:
1.在頁面上通過js或者樣式來限制輸入長度是沒有用的,因為可以直接從URL當中執行。
比如http://
middle.jsp?userid=String" or 1=1 DELETE * from * WHERE "*
一樣可以實現注入,並不是一定要從輸入框中操作。所以一般不會對輸入框的輸入長度做限制,除了為了好看,並不會起到實際性的作用。
2.要明確,我們是通過對請求內輸入的內容做驗證,來完成攔截注入的目標。所以,我們不是攔截整個請求。怎么做到這樣呢?通過將輸入的內容參數化,對參數進行驗證。所以不能采用SQL拼接的方式來構建請求,實際上就現在而言,什么情況下都應該采用預編譯的模式而不是SQL拼接的方式。至於為什么,雖然是顯而易見的但是還是明確下。不管是SQL拼接的方式或者沒有對輸入內容參數化,那么都只能對請求本身做驗證,但是請求本身就是個SQL語句,那么所有請求就都過去了呀。對於XSS也是同樣的。
通用類:
1 //使用到的包,用來做正則驗證 2 import java.util.regex.Matcher; 3 import java.util.regex.Pattern; 4 5 /* 6 * request check 7 * @author keep 8 * @since JDK1.6 9 * @history 2016-10-17 keep set 10 */ 11 12 public class SqlRequestCheck{ 13 public static boolean check(String getit){ 14 //返回為布爾類型,方便引用時使用,getit即請求中用戶輸入的內容 15 String pattern = "^[|]+[&]+[;]+[:]+[%]+[+]+[CR]+[LF]+[SELECT]+[FROM]+[UPDATE]+[UNION]+[DELETE]+[WHERE]+[or]$";//正則表達式 16 // 創建 Pattern 對象,即reg 17 Pattern r = Pattern.compile(pattern); 18 // 現在創建 matcher 對象 19 Matcher m = r.matcher(getit); 20 boolean rs = m.find(); 21 if (rs == true){ 22 //如果結果為true則輸入的內容中包含這些非法字符 23 // System.out.println(m.replaceAll("輸入中存在非法字符!!!!"));看情況使用 24 return false; 25 } 26 return true; 27 } 28 }
引用的方式:
方式一 對於返回值為空的函數
1 SqlRequestCheck sqlr=new SqlRequestCheck(); 2 //input是代表輸入內容的參數,如果驗證非真則不執行之后的程序 3 if(!sqlr.check(input)){ 4 System.out.println("輸入非法字符!"); 5 return; 6 } 7 }
方式二 對於返回值為不能空的函數
1 SqlRequestCheck sqlr=new SqlRequestCheck(); 2 //input是代表輸入內容的參數,如果驗證非真則不執行之后的程序 3 if(!sqlr.check(input)){ 4 System.out.println("輸入非法字符!"); 5 return null;//此時有些事限制不能出現布爾類型的,故直接返回null就好了 6 } 7 }
轉載請注明出處:
http://www.cnblogs.com/stefankeep/