2014-07-24 2 views
1

Java 웹 응용 프로그램에 CSRF 보호 기능을 추가하려고합니다. web.xml에는 서블릿에 대한 CSRF 필터 및 필터 매핑이 구성되어 있습니다. 그러나이 다음 부분을 수행하는 방법을 모르겠습니다. 문서에 따르면 클라이언트에게 반환 된 모든 URL은 HttpServletResponse # encodeRedirectURL (String) 또는 HttpServletResponse # encodeURL (String)에 대한 호출을 통해 인코딩됩니다. 또는 요청할 수있는 요청 매개 변수는 nonce를 name org.apache.catalina.filters.CSRF_NONCE는 상수 org.apache.catalina.filters.Constants.CSRF_NONCE_REQUEST_PARAM의 값입니다.Tomcat 7 및 CSRF 필터

업데이트 아직 403이 금지되어 있습니다. 누구든지 어떤 제안이 있습니까?

다음
<filter> 
    <filter-name>CSRF</filter-name> 
    <filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class> 
    <init-param> 
     <param-name>entryPoints</param-name> 
     <param-value>/html,/html/</param-value> 
    </init-param> 
    </filter> 

    <filter-mapping> 
    <filter-name>CSRF</filter-name> 
    <servlet-name>exampleservlet</servlet-name> 
    </filter-mapping> 

가 JSP 페이지 코드 내가 잘못 뭐하는 거지

<FORM METHOD="POST" ACTION="<%=response.encodeURL("/exampleservlet")%>"> 
     <INPUT TYPE="HIDDEN" NAME="org.apache.catalina.filters.CSRF_NONCE" VALUE="<%=session.getAttribute("org.apache.catalina.filters.CSRF_NONCE")%>"> 
     <INPUT TYPE="HIDDEN" NAME="id" VALUE="0"> 

입니다 : 여기 은 web.xml의 설정인가?

+0

같은 문제가 있습니다. 누구나 솔루션을 얻을 수 있습니까? –

답변

1

질문이 몇 년 전에 제기되었으므로 이제 더 이상 중요하지 않다고 생각하지만, 가끔 org.apache.catalina.filters.CsrfPreventionFilter의 사용에 대한 힌트를 구하기 위해이 안내서를 방문합니다. 바람둥이 공식을 "/ *"매핑 할 가정이 CsrfPreventionFilter 사이트 CSRF_Prevention_Filter, 그리고 다시 탐색 할 수있는 방법을 제공

의 URL를 개최 init-param 명 "진입 점"을 사용하는 문서에 설명 된 바와 같이 이

나는 간단하게 CsrfPreventionFilter에 의해 수행 된 작업을 설명하려고합니다 멀리 탐색 한 후 응용 프로그램을 보호 :

  1. 첫 번째 경우 다 요청한 URL은 필터로 매핑되고 entryPoints 중 하나와 일치해야합니다. (403 반환하여) 요청을 차단하지 않으면 서 CsrfPreventionFilter세션에 새로운 넌스저장소를 생성 할 수 있도록하는 것은, 응답을 최우선 HttpServletResponse#encodeRedirectURL(String)HttpServletResponse#encodeURL(String) 랩합니다.
  2. 양식 작업에서 수행 한 것처럼 페이지의 URL은 HttpServletResponse#encodeRedirectURL(String) or HttpServletResponse#encodeURL(String)으로 인코딩되어야합니다. 사실 "인코딩"은 요청 매개 변수 이름 "org.apache.catalina.filters.CSRF_NONCE"에 첫 번째 단계에서 필터가 생성 한 nonce 값을 추가하는 것입니다.
  3. 클라이언트가 인코딩 된 페이지의 URL에 액세스하면 CsrfPreventionFilter은 요청이 유효한지 확인합니다. 현재 세션에 저장된 것과 일치하는지 여부 (기본값 인 5 크기의 LRUCache를 사용하며, init-param nonceCacheSize).

그래서, 서블릿 exampleservlet하지 않는 한 당신은 또한 "/ *"또는 "/html,/html/"폼을 잡고 페이지로 이어질 수/HTML, 코드가 작동하지 않을 매핑 선언했다.

당신이

<FORM METHOD="POST" ACTION="<%=response.encodeURL("/exampleservlet")%>">

에서 사용하는 응답이 CsrfPreventionFilter 래핑되지 않고 비표를 추가 할 마법을하지 않을 것 때문에.

세션 속성 "org.apache.catalina.filters.CSRF_NONCE는"필터에 의해 설정되지 않았었기 때문에 어느 쪽도 아니

<INPUT TYPE="HIDDEN" NAME="org.apache.catalina.filters.CSRF_NONCE" VALUE="<%=session.getAttribute("org.apache.catalina.filters.CSRF_NONCE")%>">

성공하지 않을 것이다. 심지어 하나는 LRUCache 인스턴스를 보유하지만 nonce 문자열은 보유하지 않습니다.