2016-04-20 43 views
2

我讀了很多關於Spring Securitys CSRF保護的內容,但我仍然苦苦掙扎。現在的文檔與往常一樣好,但它完全基於您在服務器上呈現html代碼並能夠爲每個表單添加隱藏字段的想法。現在,因爲我使用AngularJS和JavaScript來調用後端,所以這不是一個真正的選擇。REST後端的Spring Security CSRF保護 - 同步器令牌模式傳輸到客戶端

那麼在這種情況下實際獲取Token給客戶端的最佳方式是什麼(Rest Backend/AngularJS前端)? AngularJS似乎已經在$ resource中構建了對CSRF的支持,並期望一個名爲「XSRF-TOKEN」的Cookie來檢索令牌,並在進一步請求中將其作爲http頭「X-XSRF-TOKEN」發送。所以每個請求都會包含http頭以及cookie。現在在服務器端,我可以讀取標題並將其與我存儲在會話中的令牌進行比較。

我有這個問題,它似乎有點複雜。由於登錄本身必須受到保護,因此需要創建一個臨時會話,僅用於CSRF令牌。這真的有必要嗎?

也許這只是一個愚蠢的問題,但爲什麼我不能在客戶端創建一個隨機標記並將其設置爲客戶端的HTTP標頭和Cookie。這與「OWASP double submit cookie」類似,但在客戶端生成令牌。這樣服務器在登錄前不需要進行會話,因爲他可以比較兩個提交的令牌。現在,雖然攻擊者可以發送HTTP標頭,但是根據同源策略,無法讀取或設置cookie,只要數字幾乎不可測,就無法獲得匹配。

現在本能地在客戶端生成一個安全的令牌對我來說似乎很危險,我想我會避免它..但爲什麼?我覺得我錯過了一些東西,當然,SpringSecurity爲什麼在會話中存儲令牌有一個很好的理由,對吧?

請賜教:)

+0

[如何訪問Spring CSRF restful web服務](http://stackoverflow.com/questions/33125598/how-to-access-spring-csrf-restful-web-service)可能有幫助嗎? – holmis83

+0

2周前我已經解決了這個問題,但忘了在這裏提到它。我現在發佈了答案。雖然謝謝! –

回答

1

我結束了使用spring-security-csrf-token-interceptor-extended,從HTTP頭 「X-CSRF-TOKEN」(名稱配置)讀取CSRF令牌並且將其作爲HTTP標頭的進一步要求。

現在我唯一需要做的就是讓Spring-Security發送Token作爲HTTP Header(因爲我不在服務器端渲染html代碼,因此無法將其添加爲隱藏字段)。

<security:http .... 
    <security:custom-filter ref="csrfTokenResponseHeaderBindingFilter" after="CSRF_FILTER"/> 
.... 
</security:http> 

濾波器正常CSRF_FILTER後基本上運行,並讀取 「_csrf」 請求屬性(其由CSRF_FILTER放在那裏),並把它設定爲標題 「X-CSRF-TOKEN」

public class CsrfTokenResponseHeaderBindingFilter extends OncePerRequestFilter { 
    protected static final String REQUEST_ATTRIBUTE_NAME = "_csrf"; 
    protected static final String RESPONSE_TOKEN_NAME = "X-CSRF-TOKEN"; 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, javax.servlet.FilterChain filterChain) throws ServletException, IOException { 
     CsrfToken token = (CsrfToken) request.getAttribute(REQUEST_ATTRIBUTE_NAME); 

     if (token != null) { 
      response.setHeader(RESPONSE_TOKEN_NAME, token.getToken()); 
     } 

     filterChain.doFilter(request, response); 
    } 
}