qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          Java防止SQL注入的幾個(gè)途徑

           JavaSQL注入,最簡(jiǎn)單的辦法是杜絕SQL拼接,SQL注入攻擊能得逞是因?yàn)樵谠蠸QL語(yǔ)句中加入了新的邏輯,如果使用PreparedStatement來(lái)代替Statement來(lái)執(zhí)行SQL語(yǔ)句,其后只是輸入?yún)?shù),SQL注入攻擊手段將無(wú)效,這是因?yàn)镻reparedStatement不允許在不同的插入時(shí)間改變查詢的邏輯結(jié)構(gòu),大部分的SQL注入已經(jīng)擋住了,在WEB層我們可以過(guò)濾用戶的輸入來(lái)防止SQL注入比如用Filter來(lái)過(guò)濾全局的表單參數(shù)。

        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. * 通過(guò)Filter過(guò)濾器來(lái)防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();//獲取所有的表單參數(shù) 
        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這里發(fā)現(xiàn)sql注入代碼的業(yè)務(wù)邏輯代碼 
        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.   也可以單獨(dú)在需要防范SQL注入的JavaBean的字段上過(guò)濾:

        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) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2012年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 五台县| 蒙阴县| 文成县| 绥德县| 瑞丽市| 东至县| 高尔夫| 乐安县| 福泉市| 辽中县| 三门峡市| 阳泉市| 榕江县| 洱源县| 方山县| 滨州市| 桂东县| 酉阳| 道真| 伊金霍洛旗| 玉树县| 中超| 昌吉市| 蓬莱市| 云梦县| 隆昌县| 咸丰县| 武安市| 准格尔旗| 昌乐县| 静宁县| 凌云县| 应城市| 桐城市| 天津市| 康定县| 双城市| 巴南区| 和静县| 遂昌县| 确山县|