2017-10-06 162 views
0

我瘋了,試圖找出如何爲我的Web應用實現CSRF保護。我已經閱讀了大量的頁面,但仍不能決定在我的特定環境中的解決方案。從服務器到AngularJS客戶端的CSRF令牌交換

因此,首先我的Web應用程序是用Angular編寫的,靜態部署在Apache服務器上。它調用我的服務器上的一些服務,Java類型,部署在應用程序服務器上的一場戰爭中。他們都部署在同一個域中。認證後,通常的會話cookie(secure + HttpOnly)在響應中設置。

現在,我想實現一個基於同步令牌或雙提交cookie模式(但從我看到的第一個更好的解決方案,因爲我可以處理服務器端的狀態)的CSRF保護。

我看到的大多數解決方案都建議生成令牌服務器端並將其存儲在cookie中,以便可以在客戶端訪問它。這個工作的約束,我認爲它是一個很大的問題,就是這個cookie不能是HttpOnly,因爲Javascript不能訪問它。此外,我有這樣的感覺,即在非完全保護的cookie中共享令牌不是一個好主意。但它似乎是從AngularJS推薦的解決方案...

所以,如果我放棄這個解決方案我留下了什麼? 將令牌不放在cookie中,而是放在響應頭中?它安全嗎? 公開服務來獲取令牌?看起來很實用但不確定它是否是一個好主意? 公開一個servlet來構建一個Javascript來提供令牌,就像在OWASP Guard中一樣? 還有什麼?

編輯:它似乎是Spring的注入的HTTP響應中的令牌名稱和值作爲解決方案。

感謝您的幫助!

回答

0
  1. CSRF令牌應該在每個用戶會話中生成一次。
  2. 它應該存儲在服務器端會話中(HttpSession用於Java的情況下)
  3. 客戶端應將令牌存儲爲隱藏參數,而不是存儲在瀏覽器的Cookie中。
  4. 服務器應驗證每個請求的CSRF令牌的存在並與存儲在會話中的令牌進行比較。

更多細節:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

+0

是,所有這一切都清楚了。我錯過了如何以安全和乾淨的方式將在服務器端生成的cookie傳輸到客戶端 – Xendar

+0

Java EE應用程序將令牌作爲請求屬性傳遞迴客戶端。在AngularJS客戶端的情況下,我假設您可以使用JSON傳遞令牌 – Vel

+0

您的意思是,作爲登錄響應的一部分? – Xendar

相關問題