qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java防止SQL注入的幾個途徑

           JavaSQL注入,最簡單的辦法是杜絕SQL拼接,SQL注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯,如果使用PreparedStatement來代替Statement來執行SQL語句,其后只是輸入參數,SQL注入攻擊手段將無效,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結構,大部分的SQL注入已經擋住了,在WEB層我們可以過濾用戶的輸入來防止SQL注入比如用Filter來過濾全局的表單參數。

        1. import java.io.IOException;  
        2. import java.util.Iterator;  
        3. import javax.servlet.Filter;  
        4. import javax.servlet.FilterChain;  
        5. import javax.servlet.FilterConfig;  
        6. import javax.servlet.ServletException;  
        7. import javax.servlet.ServletRequest;  
        8. import javax.servlet.ServletResponse;  
        9. import javax.servlet.http.HttpServletRequest;  
        10. import javax.servlet.http.HttpServletResponse;  
        11. /** 
        12. * 通過Filter過濾器來防SQL注入攻擊 
        13. * 
        14. */ 
        15. public class SQLFilter implements Filter {  
        16. private String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|; |or|-|+|,";  
        17. protected FilterConfig filterConfig = null;  
        18. /** 
        19. * Should a character encoding specified by the client be ignored? 
        20. */ 
        21. protected boolean ignore = true;  
        22. public void init(FilterConfig config) throws ServletException {  
        23. this.filterConfig = config;  
        24. this.inj_str = filterConfig.getInitParameter("keywords");  
        25. }  
        26. public void doFilter(ServletRequest request, ServletResponse response,  
        27. FilterChain chain) throws IOException, ServletException {  
        28. HttpServletRequest req = (HttpServletRequest)request;  
        29. HttpServletResponse res = (HttpServletResponse)response;  
        30. Iterator values = req.getParameterMap().values().iterator();//獲取所有的表單參數 
        31. while(values.hasNext()){  
        32. String[] value = (String[])values.next();  
        33. for(int i = 0;i < value.length;i++){  
        34. if(sql_inj(value[i])){  
        35. //TODO這里發現sql注入代碼的業務邏輯代碼 
        36. return;  
        37. }  
        38. }  
        39. }  
        40. chain.doFilter(request, response);  
        41. }  
        42. public boolean sql_inj(String str)  
        43. {  
        44. String[] inj_stra=inj_str.split("\\|");  
        45. for (int i=0 ; i < inj_stra.length ; i++ )  
        46. {  
        47. if (str.indexOf(" "+inj_stra[i]+" ")>=0)  
        48. {  
        49. return true;  
        50. }  
        51. }  
        52. return false;  
        53. }  
        54. }
        55.   也可以單獨在需要防范SQL注入的JavaBean的字段上過濾:

        56. /** 
        57. * 防止sql注入 
        58. * 
        59. * @param sql 
        60. * @return 
        61. */ 
        62. public static String TransactSQLInjection(String sql) {  
        63. return sql.replaceAll(".*([';]+|(--)+).*"" ");  
        64. }
        65. posted on 2012-01-04 10:46 順其自然EVO 閱讀(235) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2012年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 孟连| 武平县| 红安县| 宜黄县| 镇宁| 象山县| 建瓯市| 绥宁县| 台北县| 志丹县| 石嘴山市| 塘沽区| 新和县| 丹阳市| 固原市| 封开县| 睢宁县| 桃园县| 赣榆县| 海丰县| 调兵山市| 卢龙县| 昂仁县| 凌云县| 徐汇区| 景泰县| 永城市| 合阳县| 锡林浩特市| 淄博市| 石阡县| 太谷县| 桐柏县| 遂宁市| 克山县| 衡南县| 宁河县| 鄂尔多斯市| 陆丰市| 祁门县| 新干县|