我们使用OWASP CSRF后卫保护了我们的网站,并配置了TokenPerPage = true . 我们使用JSF 2.0(myfaces)进行前端开发 .

除非我们使用JSF ajax(),否则每个东西都可以正常工作 . 当我们从页面提交ajax请求时,ajax请求成功但是 subsequent Http Request fails with a message

(“潜在的跨站点请求伪造(CSRF)攻击被挫败(用户:%,ip:x.x.x.x,uri:/ppr/secured/xxxx.faces,错误:请求令牌与页面令牌不匹配)”) .

Below is my speculation :

  • 在JSF中,浏览器地址栏中显示的URL始终是上一页/请求URL(因为JSF 'POST'将请求提交给同一视图并使用前向调度程序) . 来自页面的任何ajax请求都使用当前页面的URL . 可能是ajax请求会覆盖令牌 .

对于故障排除 - 我使用fiddler捕获了请求/响应并导出到文件 . 你可以用fiddler打开它 .

owasp-Jsf-Ajax-issue-1.saz

此图像将有助于描述fiddler文件中的请求 .

Fiddler_OWASP_CSRF_JSF_Ajax_issue.jpg

JSF代码-FYR:

<t:dataTable id="xyzTableId" value="#{varObject.additionalNotes}" var="additionalNote"><t:column>
       <h:inputText id="additionalNoteMsg" value="# {additionalNote.message}">
          <f:ajax event="blur" render="noteForm:xyzTableId:#{rowIndex}:displayId" onerror="printAjaxError" />
       </h:inputText></t:column>
</t:dataTable>
<t:commandButton type="button" value="Add Notes" id="button1"/>