2017-07-19 6 views
1

クロスサイトスクリプティングの問題を修正するためのリクエストラッパークラスを1つ作成しています。私が問題に直面しているのは、getParameterValues()メソッドは、私がchain.dofilter(wrapperclass)を呼び出すときに呼び出されないということです。誰もplieはなぜ私の方法はトリガーになっていない私を助けることができますか?HttpServletResponseWrapperのgetParamertervalues()が呼び出されていません

import java.util.regex.Pattern; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletRequestWrapper; 

    public class XSSRequestWrapper extends HttpServletRequestWrapper { 

     private static Pattern[] patterns = new Pattern[]{ 
      // Script fragments 
      Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE), 
      // src='...' 
      Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL), 
      Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL), 
      // lonely script tags 
      Pattern.compile("</script>", Pattern.CASE_INSENSITIVE), 
      Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL), 
      // eval(...) 
      Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL), 
      // expression(...) 
      Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL), 
      // javascript:... 
      Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE), 
      // vbscript:... 
      Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE), 
      // onload(...)=... 
      Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL) 
     }; 

     public XSSRequestWrapper(HttpServletRequest servletRequest) { 
      super(servletRequest); 
     } 

     @Override 
     public String[] getParameterValues(String parameter) { 
      String[] values = super.getParameterValues(parameter); 

      if (values == null) { 
       return null; 
      } 

      int count = values.length; 
      String[] encodedValues = new String[count]; 
      for (int i = 0; i < count; i++) { 
       encodedValues[i] = stripXSS(values[i]); 
      } 

      return encodedValues; 
     } 

     @Override 
     public String getParameter(String parameter) { 
      String value = super.getParameter(parameter); 

      return stripXSS(value); 
     } 

     @Override 
     public String getHeader(String name) { 
      String value = super.getHeader(name); 
      return stripXSS(value); 
     } 

     private String stripXSS(String value) { 
      if (value != null) { 
       // NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to 
       // avoid encoded attacks. 
       // value = ESAPI.encoder().canonicalize(value); 

       // Avoid null characters 
       value = value.replaceAll("\0", ""); 

       // Remove all sections that match a pattern 
       for (Pattern scriptPattern : patterns){ 
        value = scriptPattern.matcher(value).replaceAll(""); 
       } 
      } 
      return value; 
     } 
    } 



import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 

public final class XSSFilter implements Filter { 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     XSSRequestWrapper requestWrapper = new XSSRequestWrapper((HttpServletRequest) request); 
     chain.doFilter(requestWrapper, response); 
    } 

    @Override 
    public void destroy() { 
    } 
} 

答えて

0

サーブレットAPIは、ServletRequestからパラメータをプルする複数の方法を提供します。特定のServlet実装では、これらのメソッドのいずれかを使用してパラメータをプルすることができます。 ServletRequest#getParameterValues(String)の呼び出しが表示されない場合は、単純にフィルターにかけられた基礎となるサーブレットがそのメソッドを呼び出していない可能性があります。おそらくそれは他の方法を呼んでいるでしょう。上記の

+0

なし:完了のために、私はあなたの要求ラッパーは、これらすべてのメソッドをオーバーライドすること

をお勧めします上記の方法は呼び出されていない – user2160534

関連する問題