如何将JSP标记库添加到JSF2 Faclet页面?

时间:2013-10-15 21:26:26

标签: jsp jsf jsf-2 owasp

如果我有现有的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 faclet页面的内容。它不喜欢这个。

<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)
...

2 个答案:

答案 0 :(得分:0)

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

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

那么,现在呢?无法使用<csrf:token-name/>的内容设置变量。我查看了source of the token tag,并且不支持用于在变量中设置令牌。

可能的解决方法:

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

来自CSRF Guard 3 documentation

  

使用预防令牌生成表单

     

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

这意味着你可以做到:

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

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

答案 1 :(得分: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>

  4. 关于Omnifaces resourceInclude http://showcase.omnifaces.org/components/resourceInclude

    的链接