1

如果我有现有的 JSP 标记库。在 JSP 中,我可以添加:

<%@taglib uri="http://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project/Owasp.CsrfGuard.tld" prefix="csrf" %>

<form>
    ...
    <input type="hidden" name="<csrf:token-name/>" value="<csrf:token-value/>"/>
</form>

这是我尝试添加到 JSF2 分面页面的内容。它不喜欢这样。

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:csrf="http://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project/Owasp.CsrfGuard.tld">   
...

<h:form  ...>
....
    <input type="hidden" name="#{csrf:token-name}" value="#{csrf:token-value}"/>

    </h:form>

甚至有可能做我认为我能做的事情吗?

现在我收到此错误:

javax.servlet.ServletException: Encountered ":" at line 1, column 7.
Was expecting one of:
    "}" ...
    "." ...
    "[" ...
    ">" ...
    "gt" ...
    "<" ...
    "lt" ...
    ">=" ...
    "ge" ...
    "<=" ...
    "le" ...
    "==" ...
    "eq" ...
    "!=" ...
    "ne" ...
    "&&" ...
    "and" ...
    "||" ...
    "or" ...
    "*" ...
    "+" ...
    "-" ...
    "/" ...
    "div" ...
    "%" ...
    "mod" ...

    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
...
4

2 回答 2

0

问题是#{csrf:token-name}. 这是表达式语言,并且csrf被解释为变量(不存在)。现在,:无法解释,因为它在 EL 表达式中没有有效符号。

您必须使用name="<csrf:token-name/>",就像在您的第一个 JSP 中一样。不幸的是,在您的 JSF2 faclet 页面中,这将导致 XML 格式错误,并且无法再次工作。

所以现在怎么办?无法使用 的内容设置变量<csrf:token-name/>。我查看了令牌标签的来源,它不支持在变量中设置令牌。

可能的解决方法:

我找到了可能解决问题的第三种解决方法!

来自CSRF Guard 3 文档

使用预防令牌生成表单

OWASP CSRFGuard JSP 库实现了一个标签库,专门用于生成 HTML 表单,其中 CSRF 预防令牌自动嵌入为隐藏字段。[...]

这意味着您可以执行以下操作:

<csrf:form ...>
    ...
</csrf:form>

无需使用<input type="hidden" name="<csrf:token-name/>" .../>自己。

于 2013-10-16T11:47:39.323 回答
0

由于我遇到了同样的问题并且网上没有好的答案,我将分享我的解决方法

因为您不能在 faclets 页面中使用 JSP taglib,所以我想出了以下解决方法:

  1. 配置 CSRF Guard https://www.owasp.org/index.php/CSRFGuard_3_User_Manual

  2. 创建一个简单的 CSRF jsp 页面(称为“csrfGuard.jsp”)

    <%@ taglib uri="http://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project/Owasp.CsrfGuard.tld" prefix="csrf" %> <input type="hidden" name="<csrf:tokenname/>" value="<csrf:tokenvalue/>" />

  3. 以您需要保护的所有形式插入该页面:

    <form action="someAction" method="post"> <o:resourceInclude path="/csrfGuard.jsp" /> ... Your Code ... </form>

关于 Omnifaces 资源的链接http://showcase.omnifaces.org/components/resourceInclude

于 2015-08-03T14:32:29.513 回答