2013-11-19 8 views
0

내 HTML에서 모든 입력 태그의 내용을 필터링하고 싶습니다. 지금 안티 스팸 필터를 사용하고 있습니다. 필터는 입력 값 대신에 완전한 HTML 컨텐트를 필터링합니다. 나는 여기서 제공되는 구현을 사용하고Spring MVS에서 AntiSamy를 사용한 XSS 보안

: 내가 내용을 스캔이 코드 조각을 사용하고있는 doFilter 방법 내부

Github

내가 원하는 것은 약 반면
HttpServletResponseInvocationHandler invocationHandler = httpResponseInvocationHandlerFactory.build((HttpServletResponse) response); 

CleanResults cleanResults = antiSamy.scan(invocationHandler.getContents(), policy); 

:

CleanResults cleanResults = antiSamy.scan(request.getParameter("input"), policy); 

입력 필드가 필터링됩니다. 나는 기본적으로 AntiSamy가 제공하는 모든 정책 파일에 그것을 시도

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    if (response instanceof HttpServletResponse) { 
     HttpServletResponseInvocationHandler invocationHandler = httpResponseInvocationHandlerFactory.build((HttpServletResponse) response); 
     HttpServletResponse proxiedResponse = httpResponseProxyFactory.build(invocationHandler); 
     chain.doFilter(request, proxiedResponse); 

     if ("text/html;charset=UTF-8".equals(proxiedResponse.getContentType())) { 
      try { 
       Policy policy = policyFileLoader.load(policyFile); 
       antiSamy.setInputEncoding(inputEncoding); 
       antiSamy.setOutputEncoding(outputEncoding); 

       CleanResults cleanResults = antiSamy.scan(invocationHandler.getContents(), policy); 
       log.info("Number of Errors: " + cleanResults.getNumberOfErrors()); 
       if (log.isDebugEnabled()) { 
        log.debug("Errors found: "); 
        List errors = cleanResults.getErrorMessages(); 
        for (int i = 0; i < errors.size(); i++) { 
         log.debug("\t" + (i + 1) + ". " + errors.get(i)); 
        } 
       } 
       log.info("Scan time (in seconds): " + cleanResults.getScanTime()); 
       response.getOutputStream().write(cleanResults.getCleanHTML().getBytes()); 
      } catch (ScanException e) { 
       log.error(GENERIC_ERROR, e); 
      } catch (PolicyException e) { 
       log.error(GENERIC_ERROR, e); 
      } 
     } else { 

      response.getOutputStream().write(invocationHandler.getBytes()); 
     } 
    } else { 
     chain.doFilter(request, response); 
    } 
} 

: 여기

전체 doFilter 방법이다.

이것에 대해 도움이 될 수 있다면 좋을 것입니다.

답변

0

해결책을 찾았는데 오류는 잘못된 정규 표현식을 사용하여 발생했습니다. 이제 잘 작동합니다.