<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

        SQL注入和SCRIPT注入,是一個煩人的東西,那么這個問題該怎么解決呢?下面就說一說如何解決這個問題。
        在項目一開始,如果就考慮到這個問題的話,那是可以完全避免的。
        反script注入:在jsp頁面中解決,增刪查修審都用struts標簽 ,是沒有任何問題的。如果是html標簽的話,用jstl標簽也可以完全解決。
        那么如果用到文本編輯器的時候,又該怎么解決啊?我的反SCRIPT注入就可以解決這個問題了。
        反sql注入:如果是jdbc的話,不要用Statement,用PreparedStatement就可以避免。如果用hibernate的話,用 Criteria查詢就可以解決這個問題。

        如何是在項目快完結(jié)的時候才發(fā)現(xiàn)這個問題,那該怎么解決啊?
        apache提供了工具類:org.apache.commons.lang.StringEscapeUtils,它里面有對應的方法解決這個問題。
        下面是我自己提供一種方法。

        為了實現(xiàn)反SQL注入和反SCRIPT注入,本例應用反射技術(shù)和責任鏈模式實現(xiàn)了這個功能。它對于系統(tǒng)來說是可插撥的,這樣就實現(xiàn)了與系統(tǒng)的松散耦合。
        它的主要思想是:把Form對象,PO對象以及VO等對象中的String型屬性的值或者String類型的參數(shù)進行過濾后重新封裝為原有類型的對象。在獲取對象的時候應用了 java反映技術(shù),
    在進行過濾的時候,實現(xiàn)了鏈式過濾。這樣做,就是為了達到可維護性,可擴展性,可重用性以及靈活性的目的。
        以下是源代碼:


    package net.better_best.www.utils.filter;
    public class Request {
        // 存儲需要過濾的字符串
        private String requestStr;
        public String getRequestStr() {
            return requestStr;
        }
        public void setRequestStr(String requestStr) {
            this.requestStr = requestStr;
        }
    }


    package net.better_best.www.utils.filter;

    public class FilterConstant {
     //定義sql過濾的內(nèi)容
     public static String[][] SQL_FILTER = {
      {";",""},
      {"'","''"},
      {"--",""},
      {"%",""}
      };
      //定義script過濾的內(nèi)容
     public static String[][] SCRIPT_FILTER = {
      {"(<[i|I][n|N][p|P][u|U][t|T])([^>]*)(/>)",""},
      {"(<[i|I][n|N][p|P][u|U][t|T])([\\s\\S]*)(</[i|I][n|N][p|P][u|U][t|T]>)",""},
      {"(<[t|T][a|A][b|B][l|L][e|E])([^>]*)(/>)",""},
      {"(<[t|T][a|A][b|B][l|L][e|E])([\\s\\S]*)(</[t|T][a|A][b|B][l|L][e|E]>)",""},
      {"(<[d|D][i|I][v|V])([^>]*)(/>)",""},
      {"(<[d|D][i|I][v|V])([\\s\\S]*)(</[d|D][i|I][v|V]>)",""},
      {"(<[b|B][u|U][t|T][t|T][o|O][n|N])([^>]*)(/>)",""},
      {"(<[b|B][u|U][t|T][t|T][o|O][n|N])([\\s\\S]*)(</[b|B][u|U][t|T][t|T][o|O][n|N]>)",""},
      {"(<[s|S][c|C][r|R][i|I][p|P][t|T])([^>]*)(/>)",""},
      {"(<[s|S][c|C][r|R][i|I][p|P][t|T])([\\s\\S]*)(</[s|S][c|C][r|R][i|I][p|P][t|T])(>)",""},
      };
    }



    package net.better_best.www.utils.filter;

    public interface IFilter {
        void doFilter(Request request, FilterChain chain);
    }



     

    package net.better_best.www.utils.filter;

    public class SqlFilter implements IFilter {
        @Override
        //進行sql過濾
        public void doFilter(Request request, FilterChain chain) {
            if (request != null) {
             String strRequest = request.getRequestStr();
             String[][] sqlFilter = FilterConstant.SQL_FILTER;
             for (String[] strings : sqlFilter) {
              strRequest = strRequest.replace(strings[0], strings[1]);
       }
             request.setRequestStr(strRequest);
            }
            chain.doFilter(request, chain);
         
        }
    }




    package net.better_best.www.utils.filter;

    public class ScriptFilter implements IFilter {
     @Override
     //進行script過濾
     public void doFilter(Request request, FilterChain chain) {
      if (request != null) {
       String strRequest = request.getRequestStr();
       String[][] scriptFilter = FilterConstant.SCRIPT_FILTER;
             for (String[] strings : scriptFilter) {
              strRequest = strRequest.replaceAll(strings[0], strings[1]);
       }
       request.setRequestStr(strRequest);
      }
      chain.doFilter(request, chain);

     }
    }




    package net.better_best.www.utils.filter;

    public enum FilterType {
     SQL_TYPE,SCRIPT_TYPE ;
    }


    package net.better_best.www.utils.filter;


    public class FilterHelper {
     /*
      * 生成過濾鏈條 參數(shù):String type:過濾類型 返回:FilterChain; 根據(jù)過濾類型產(chǎn)生過濾鏈條
      */
     public static FilterChain createFilterChain(FilterType type,FilterChain fChain) throws Exception {
      if (type == null)
       return null;
      else if (type.equals(FilterType.SQL_TYPE))
       return fChain.addFilter(new SqlFilter());
      else if (type.equals(FilterType.SCRIPT_TYPE))
       return fChain.addFilter(new ScriptFilter());
      else
       return null;
     }

     /*
      * 把要過濾的字符串封裝成Request對象
      */
     public static Request init(String str) throws Exception {
      if (str == null || str == "")
       return null;
      Request request = new Request();
      request.setRequestStr(str);
      return request;
     }

     /*
      * 對Request對象進行循環(huán)過濾
      */
     public static String result(Request request, FilterChain fChain)
       throws Exception {
      if (request == null || fChain == null || fChain.size() == 0)
       return null;
      fChain.doFilter(request, fChain);
      return request.getRequestStr();
     }
    }


    package net.better_best.www.utils.filter;
    import java.util.ArrayList;
    import java.util.List;

    public class FilterChain implements IFilter {
        // 使用 List 保存過濾器
        private List<IFilter> filters = new ArrayList<IFilter>();
        private int index = 0;
        // 用于添加過濾器,可以添加實現(xiàn)了IFilter接口的FilterChain
        public FilterChain addFilter(IFilter f) {
            this.filters.add(f);
            return this;
        }
        @Override
        public void doFilter(Request request,  FilterChain chain) {
            // 判斷是否是否遍歷到 List 的最大值,如果是 return
            if (index == filters.size())
                return;
            // 逐一獲取過濾器
            IFilter f = filters.get(index);
            // 此過濾器鏈的下標,是遍歷過濾器的索引
            index++;
            // 使用列表中的第index個過濾器,將更改后的 request ,chain 傳進去,
            f.doFilter(request,chain);
            index = 0;
        }
        public int size(){
         return filters.size();
        }
    }


    package net.better_best.www.utils;

    import java.lang.reflect.Field;

    import net.better_best.www.utils.filter.FilterChain;
    import net.better_best.www.utils.filter.FilterHelper;
    import net.better_best.www.utils.filter.FilterType;

    public class Filter {
     /*
      * 參數(shù):Object,接收ActionForm,Plain Object,View.Object的屬性值應為單值類型,不能為復合類型或數(shù)組類型;
      * 參數(shù):FilterType,定義需要過濾的類型; 返回值:Object; 作用:根據(jù)已定義的過濾規(guī)則,過濾所傳入Object值;
      */
     public static Object objectFilter(Object obj, FilterType... types) {
      if (obj == null)return obj;
      Class clazz = obj.getClass();
      if (clazz.isArray() || clazz.isInterface() || clazz.isPrimitive())return obj;
      Field[] fds = clazz.getDeclaredFields();
      for (Field field : fds) {
       if (field.getType().getName().equals("java.lang.String")) {
        field.setAccessible(true);
        Object before = null;
        try {
         before = field.get(obj);
        } catch (IllegalArgumentException e) {
         e.printStackTrace();
        } catch (IllegalAccessException e) {
         e.printStackTrace();
        }
        if (before != null)
         try {
          field.set(obj, doFilter(before.toString(), types));
         } catch (IllegalArgumentException e) {
          e.printStackTrace();
         } catch (IllegalAccessException e) {
          e.printStackTrace();
         }
       }
      }
      return obj;
     }

     /*
      * 按照定義好的過濾規(guī)則,進行過濾; 參數(shù):String str ,待過濾字符串 返回:String; 已過濾字符串
      */
     public static String doFilter(String str, FilterType... types) {
      if (str == null || str == "")
       return null;
      FilterChain fChain = new FilterChain();
      String result = "";
      try {
       if (types.length == 0) {
        FilterType[] filterTypes = FilterType.values();
        for (FilterType filterType : filterTypes) {
         fChain = FilterHelper.createFilterChain(filterType, fChain);
        }
       } else {
        for (FilterType type : types) {
         fChain = FilterHelper.createFilterChain(type, fChain);
        }
       }
       if (fChain == null) {
        result = str;
       } else {
        result = FilterHelper.result(FilterHelper.init(str), fChain);
       }

      } catch (Exception e) {
       e.printStackTrace();
      }
      return result;
     }
    }



         使用方法:調(diào)用Filter的兩個方法,就可以了。

        以上內(nèi)容為全部代碼;


          歡迎對本文的內(nèi)容提出不同見解和質(zhì)疑,不勝感激。
          如果疑問,可發(fā)郵件聯(lián)系我。可發(fā)郵件索取源代碼。
          



       

    Feedback

    # re: 反SQL注入和SCRIPT注入-------------責任鏈模式的應用  回復  更多評論   

    2010-01-13 16:43 by 超級笨笨
    可以,對我有幫助

    # re: 反SQL注入和SCRIPT注入-------------責任鏈模式的應用  回復  更多評論   

    2010-01-14 15:41 by Lancelot
    為什么要做這些無用功???

    正解應該是表單提交時,允許用戶提交各種數(shù)據(jù),通過“SET PARAMETER”方式傳入sql中(不管是自己,還是通過ORM都可以很容易實現(xiàn)),這樣來解決sql注入。

    至于script注入,只需要再在上面的基礎上,根據(jù)需要顯示出相應的格式就可以了,比如:“jstl”的“out” 可以設置 “escapeXml”、“struts”的“write”可以設置“flter”。

    # re: 反SQL注入和SCRIPT注入-------------責任鏈模式的應用  回復  更多評論   

    2010-01-15 11:19 by java小爬蟲
    @Lancelot
    你好,你說的東西,我都試過了,都是可以的。

    但是有一個問題:

    就是AJAX方式,查詢結(jié)果是用字符串拼接起來的,這種情況怎么解決啊?我目前還沒有找到結(jié)果辦法。謝謝...

    # re: 反SQL注入和SCRIPT注入-------------責任鏈模式的應用  回復  更多評論   

    2010-01-15 11:20 by java小爬蟲
    @超級笨笨
    歡迎對以上代碼挑刺...

    呵呵呵

    # re: 反SQL注入和SCRIPT注入-------------責任鏈模式的應用  回復  更多評論   

    2010-01-15 11:53 by Lancelot
    以struts為例,只要調(diào)用org.apache.struts.util.ResponseUtils.filter(String value),方法就是了,有什么問題???

    # re: 反SQL注入和SCRIPT注入-------------責任鏈模式的應用  回復  更多評論   

    2010-01-15 13:00 by java小爬蟲
    @Lancelot

    舉個例子:

    public ActionForward getNewsList(
    ActionMapping mapping, ActionForm form, HttpServletRequest request,
    HttpServletResponse response) {

    try {
    PrintWriter out = init(request, response);
    PageInfo pageinfo = newsService.getNewsPerPage(
    ParameterCode.curpage_first, ParameterCode.pageSize_10, "");
    List<NewsTable> newsList = pageinfo.getPagedata();
    if (newsList != null && newsList.size() > 0) {
    out.print("<UL>");
    for (NewsTable news : newsList) {

    out.print("<li>.<a href='aa.html' title='"
    + news.getNewsTitle() + "' >"
    + news.getNewsTitle() + "</a></li>");

    }
    out.print("</UL>");
    out.close();
    }
    }
    catch (Exception e) {

    e.printStackTrace();
    }
    return null;
    }


    ajax會調(diào)用這個方法,那么org.apache.struts.util.ResponseUtils.filter(news.getNewsTitle())就這樣過濾嗎?

    # re: 反SQL注入和SCRIPT注入-------------責任鏈模式的應用  回復  更多評論   

    2010-01-15 13:57 by Lancelot
    雖然不贊成你這種寫法,不過在你這中應用場景里就是這么用,這總比你費盡周折的造出那么個東西來的要好。

    # re: 反SQL注入和SCRIPT注入-------------責任鏈模式的應用  回復  更多評論   

    2010-01-15 18:05 by java小爬蟲
    @Lancelot
    其實,在項目開始的時候,就考慮script和sql注入,是可以完全避免這個問題的。


    但是如果到了項目后期的話,我這個東西還是可是用的,自我感覺良好,還可以用于系統(tǒng)定義的非法字符的過濾,呵呵呵,


    不過,你的建議讓我學到了不少東西,謝謝你...

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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 一级特黄录像免费播放中文版| 日本免费一区二区三区最新| 亚洲午夜国产精品无卡| 免费大黄网站在线观| 91成人免费观看网站| 四虎国产精品永久免费网址 | 日韩成全视频观看免费观看高清 | 亚洲中文无韩国r级电影| 日本免费人成视频播放| 成年性午夜免费视频网站不卡| 日本免费一区二区三区四区五六区 | 十八禁在线观看视频播放免费| 永久免费无码网站在线观看个| 亚洲人成人无码.www石榴| 亚洲精品视频专区| 久久亚洲最大成人网4438| 精品国产日韩久久亚洲| 国产成人亚洲精品电影| 亚洲成_人网站图片| 亚洲国产人成在线观看| 亚洲成人免费网站| 亚洲熟女www一区二区三区| 精品亚洲成a人在线观看| 人人爽人人爽人人片av免费 | 亚洲一卡一卡二新区无人区 | 波多野结衣免费在线观看| 国产在线精品观看免费观看| 久久国产精品免费专区| 97碰公开在线观看免费视频| 韩国日本好看电影免费看| 免费精品国产自产拍观看| 亚洲情a成黄在线观看动漫尤物| 亚洲最大黄色网站| 老子影院午夜伦不卡亚洲| 久久久高清日本道免费观看| 好吊妞998视频免费观看在线| 亚洲图片一区二区| 亚洲av无码专区国产乱码在线观看| 亚洲AV无码一区二区乱子伦| 香港经典a毛片免费观看看| 免费看又黄又无码的网站|