2013-06-06 3 views
0

Struts 1 프레임 워크에 새로운 문제가 있습니다. 페이지에서 일부 입력 값을 필터링해야하므로 맞춤 필터를 작성했습니다.매핑하기 전에 원시 매개 변수를 얻는 방법

어떤 형식에도 매핑되지 않은 단일 매개 변수에 유용합니다. 그러나 그것은 일부 struts 양식 필드에 매핑되었을 때 매개 변수를 얻지 못합니다.

누구나 어떻게 대처할 생각이 있습니까? 여기

내 필터의 코드

public class XSSFillter implements Filter { 


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

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

@Override 
public void destroy() { 
} 
    } 

내가 web.xml에 그것을 정의한 물론

public class XSSRequest extends MultipartRequestWrapper{ 

public XSSRequest(HttpServletRequest request) { 
    super(request); 
} 

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

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

    String[] newValues = new String[values.length]; 

    for(int index = 0; index < values.length; index++){ 
     newValues[index] = XSSFilterUtil.removeXSSTokens(values[index]); 
    } 

    return newValues; 
} 

@Override 
public String getParameter(String name) { 
    String value = super.getParameter(name); 
    return XSSFilterUtil.removeXSSTokens(value); 
} 

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

여기

이 가장 중요한 부분 중 하나입니다, 내 생각 .

if (isMultipart) { 
      parameterValue = multipartParameters.get(name); 
     } else { 
      parameterValue = request.getParameterValues(name); 
     } 

그래서 한 경우 parameterValuemultipartParameters에서 촬영되고, 결과적으로 그들은 어떤 임시 파일에 정의되어 있습니다. 가장 좋은 방법은 모든 요청 매개 변수를 수정 한 다음 Struts 1.3.8 라이브러리를 던져 보겠습니다.

+0

정확히 무엇을하고 있는지 알지 못하면 도움을 받기가 어렵습니다. "일부 입력 값 필터링"이란 무엇을 의미합니까? –

+0

XSS 콘텐츠에서 입력 값을 필터링해야합니다. – Sergii

+0

그리고 어떻게 지내니? XSS 필터링 게시물이 아니라 매개 변수 값을 수정하는 메커니즘을 의미합니다. 코드가 필요합니다. –

답변

0

연구 및 experementations 이틀 후에 나는 몇 가지 해결책을 찾았습니다. 나는

public class XSSMultipartRequestHandler extends CommonsMultipartRequestHandler { 

    @Override 
    public Hashtable getAllElements() { 
     Hashtable table = super.getAllElements(); 
     for (Object key : table.keySet()) { 
      Object value = table.get(key); 
      if (value instanceof String[]) { 
       String[] arr = (String[]) value; 
       String[] newValue = { XSSFilterUtil.removeXSSTokens(arr[0]) }; 
       table.put(key, newValue); 
      } 
     } 
     return table; 
    } 

} 

는 또한 유 유효성 검사가 에 랩 요청을 스트럿 전에하기 때문에, 사용자 정의

public class XSSRequestProcessor extends TilesRequestProcessor { 

    @Override 
    protected boolean processValidate(HttpServletRequest request, 
      HttpServletResponse response, ActionForm form, ActionMapping mapping) 
      throws IOException, ServletException, InvalidCancelException { 
     return super.processValidate(new XSSFilteredRequest(request), response, form, mapping); 
    } 

} 

및 스트럿 - 설정에서 MultipartRequestWrapper을의 RequestProcessor를 작성해야합니다 사용자 정의 MultipartRequestHandler

<controller processorClass="com.package.filter.XSSRequestProcessor" multipartClass="com.package.filter.XSSMultipartRequestHandler" contentType="text/html; charset=UTF-8"/> 

그게 다야. :)

0

나는 이것에 녹슬지 만, 방법 ActionForm.reset(ActionMapping, HttpServletRequest)은 당신이 원하는 것을 줄 수 있습니다.

몇 년 전에 이것을 속성에서 매핑하기 전에 계산해야했기 때문에이 시점에서 모든 요청 매개 변수에 액세스해야합니다.

관련 문제