【问题标题】:How do I add JSP Tag Library to JSF2 Faclet Page?如何将 JSP 标记库添加到 JSF2 Faclet 页面?
【发布时间】:2013-10-15 21:26:26
【问题描述】:

如果我有现有的 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)
...

【问题讨论】:

  • 由于facelets,您不能在页面中使用scriptlet,也不能直接在页面中使用任何Java代码。这是一件好事。请注意,所有服务器端处理必须在您的控制器类中。在这种情况下,在您的托管 bean、验证器、转换器等中。

标签: jsp jsf jsf-2 owasp


【解决方案1】:

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

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

那么,现在呢?不能使用&lt;csrf:token-name/&gt; 的内容设置变量。我查看了source of the token tag,它不支持在变量中设置令牌。

可能的解决方法:

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

来自CSRF Guard 3 documentation

使用预防令牌生成表单

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

这意味着你可以做到:

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

无需自己使用&lt;input type="hidden" name="&lt;csrf:token-name/&gt;" .../&gt;

【讨论】:

  • 这不会破坏
    的工作吗?
  • @JeffJak 用它代替表单标签
【解决方案2】:

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

因为您不能在 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

【讨论】:

  • JSF2 在使用 &lt;h:form&gt; 而不是 &lt;form&gt; 时具有内置的 CSRF 保护。这一切都是不必要的。相关阅读:stackoverflow.com/questions/7722159/…
  • 是的,我意识到这一点,但是迁移遗留代码以支持
    并不容易。特别是如果项目中有 40 多个表单
猜你喜欢
  • 2016-04-13
  • 1970-01-01
  • 2015-07-01
  • 2011-09-06
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2016-04-30
  • 2018-08-04
相关资源
最近更新 更多