我最近在我的Web應用程序中啓用了CSRF保護。有大約100多個包含FORM提交的JSP頁面。什麼是添加CSRF令牌的最佳方式:向所有FORM提交添加CSRF令牌
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
,使得所有的表單提交纔會有這種形式的數據。我不想將此參數添加到每個單獨的FORM提交。
我最近在我的Web應用程序中啓用了CSRF保護。有大約100多個包含FORM提交的JSP頁面。什麼是添加CSRF令牌的最佳方式:向所有FORM提交添加CSRF令牌
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
,使得所有的表單提交纔會有這種形式的數據。我不想將此參數添加到每個單獨的FORM提交。
所以我終於找到了一個可行的解決方案。基本上我創建一個自定義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:
<?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>
我試圖創建一個組件,然後將其添加爲孩子,但它不會讓我正確設置輸入的名稱,所以我直接寫它。
也許你想使用ajax? – FreezY
我正要問同樣的問題,我也試圖創建自己的表單標籤,但屬性有點複雜,包括/傳遞給內部表單。接下來是在渲染時重寫表單行爲。將讓你張貼 – TecHunter
最簡單的方法是使用JavaScript將此元素添加到每個表單 – TecHunter