2016-08-13 2 views
1

최근 웹 응용 프로그램에서 CSRF 보호가 활성화되었습니다. FORM 제출을 포함하는 약 100 개 이상의 JSP 페이지가 있습니다. 모든 양식 제출이 양식 데이터를해야합니다모든 FORM 제출에 CSRF 토큰 추가

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> 

있도록 : 무슨 일이 CSRF 토큰을 추가하는 가장 좋은 방법입니다. 모든 개별 FORM 제출에이 매개 변수를 추가하고 싶지 않습니다.

+0

아마 아약스를 사용하고 싶습니까? – FreezY

+0

나는 같은 질문을하려고했는데, 나 또한 내 양식 태그를 만들려고했지만 속성은 내부 양식에 포함 시키거나 통과시키기에 약간 복잡하다. 다음은 렌더링 될 때 양식 동작을 재정의하는 것입니다. – TecHunter

+0

가장 쉬운 방법은 모든 요소에이 요소를 추가하는 것입니다. – TecHunter

답변

0

그래서 마침내 작동하는 해결책을 찾았습니다. 기본적으로 나는이 같은 사용자 정의 FormRenderer를 만듭니다

import com.sun.faces.renderkit.html_basic.FormRenderer; 

import javax.el.ELContext; 
import javax.el.ExpressionFactory; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.context.ResponseWriter; 
import java.io.IOException; 

public class FormWithCSRFRenderer extends FormRenderer { 

    @Override 
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException { 
     log.debug("FormWithCSRFRenderer - Adding CSRF Token to form element"); 
     ELContext elContext = context.getELContext(); 
     ExpressionFactory expFactory = context.getApplication().getExpressionFactory(); 

     ResponseWriter writer = context.getResponseWriter(); 
     writer.startElement("input", component); 
     writer.writeAttribute("type", "hidden", null); 
     writer.writeAttribute("name", expFactory.createValueExpression(elContext, "${_csrf.parameterName}", String.class).getValue(elContext), null); 
     writer.writeAttribute("value", expFactory.createValueExpression(elContext, "${_csrf.token}", String.class).getValue(elContext), null); 
     writer.endElement("input"); 
     writer.write("\n"); 
     super.encodeEnd(context, component); 
    } 
} 

그런 다음 faces-config.xml에 설정하여 FormRenderer를 오버라이드 (override)에 등록 :

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd" 
       version="2.2"> 
    <render-kit> 
     <renderer> 
      <component-family>javax.faces.Form</component-family> 
      <renderer-type>javax.faces.Form</renderer-type> 
      <renderer-class>com.acme.FormWithCSRFRenderer</renderer-class> 
     </renderer> 
    </render-kit> 
</faces-config> 

나는 다음 구성 요소를 만들 자녀로 추가하려했지만 입력의 이름을 올바르게 설정하지 않아서 직접 작성했습니다.

+0

왜 이것을 필요로합니까? PrimeFaces가 아직 해결하지 못한 문제는 무엇입니까? – Kukeltje

+0

원래 질문과 전혀 관련이없는 태그 (예 : jsf)를 추가 한 이후에 태그 수정 내용을 되돌 렸습니다. – Kukeltje