2013-10-15 94 views
1

如果我有現有的JSP標記庫。在JSP中,我可以添加:如何將JSP標記庫添加到JSF2 Faclet頁面?

<%@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) 
... 
+0

由於小面,你可以」不要在頁面中使用scriptlet,也不要在頁面中直接使用任何Java代碼,這是一件好事所有服務器端處理**必須**在您的控制器類中。在這種情況下,在你的託管bean,驗證器,轉換器等等中 –

回答

0

的問題是#{csrf:token-name}。這是expression language,並且csrf被解釋爲變量(不存在)。現在,:不能被解釋,因爲它在EL表達式中不是有效的符號。

您將不得不使用name="<csrf:token-name/>",就像在第一個JSP中一樣。不幸的是,在你的JSF2 faclet頁面中,這將導致格式不正確的XML,並且不會再工作。

那麼,現在呢?無法使用<csrf:token-name/>的內容設置變量。我看了一下source of the token tag,它有不支持設置令牌在一個變量。

可能的解決方法:

我找到了第三個解決方法,其有可能解決這個問題!

CSRF Guard 3 documentation

Generate Form with Prevention Token

The OWASP CSRFGuard JSP library implements a tag library designed specifically to generate HTML forms with the CSRF prevention token automatically embedded as a hidden field. [...]

這意味着你可以這樣做:

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

沒有必要使用<input type="hidden" name="<csrf:token-name/>" .../>自己。

+0

不會破壞什麼在做什麼? – JeffJak

+0

@JeffJak使用它來代替表單標籤 – Uooo

0

因爲我有同樣的問題,並沒有在網絡上沒有很好的答案,我會分享我的解決方法問題

因爲你不能用一個faclets頁面中的JSP標籤庫,我想出了以下解決方法:

  1. 配置CSRF保護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 resourceInclude http://showcase.omnifaces.org/components/resourceInclude

+1

當使用''而不是'

'時,JSF2具有內置的CSRF保護。這一切都是不必要的。相關閱讀:http://stackoverflow.com/questions/7722159/csrf-xss-and-sql-injection-attack-prevention-in-jsf – BalusC

+0

是的,我意識到這一點,但不容易遷移遺留代碼來支持 。特別是如果項目內有40多個表格 – ontime