程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java防止SQL注入的幾個途徑

Java防止SQL注入的幾個途徑

編輯:關於JAVA

Java防SQL注入,最簡單的辦法是杜絕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. }

也可以單獨在需要防范SQL注入的JavaBean的字段上過濾:

  1. /**
  2. * 防止sql注入
  3. *
  4. * @param sql
  5. * @return
  6. */
  7. public static String TransactSQLInjection(String sql) {
  8. return sql.replaceAll(".*([';]+|(--)+).*", " ");
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved