2017-08-30 35 views
0

目前我正在嘗試構建一個網站,它的後端和angularJS一樣纖細。因此我看了幾個教程和演示項目。這是最有趣的一個:https://github.com/alexdebril/slim-angularPHP Slim框架在每個連接上生成CSRF令牌

開箱,我有一個CSRF實施的問題。在這個項目中,CSRF保護在中間件中實現,以便應用於每個連接。好與不好無關。
但是,當我使用composer和npm安裝所有依賴關係時,該項目運行不正常,因爲每個服務器連接都會獲取將存儲在PHP會話中的新CSRF標記。

所以在這個項目的主頁面上有一個角度表單,它將用csrf標記將安全字符串發送到服務器。服務器然後只回答與相同的字符串和角度控制器打印出來。當我第一次觸發表單提交時,一切都會好起來的,但是在第二次提交時,服務器將響應錯誤400,因爲他有一個角度還沒有的新csrf標記。

但是這個示例項目的創建者不可能犯這樣的錯誤,他可以嗎?爲什麼我的apache爲同一用戶的每個連接創建一個新的csrf標記?我該如何解決這個問題?

我的依賴關係:
苗條\苗條v3.8.1
苗條\ CSRF v0.7.0
角v1.6.4(路線,詠歎調,材質,UI的自舉,餅乾,HTTP-AUTH-攔截器)

那麼我怎麼能爲每個用戶只有一個CSRF令牌?
或者我如何在angular中更新tokenizer服務以便始終使用最新的CSRF令牌?或者我需要一個觀察者?檢測這個?

+0

slim-angular的文檔解釋瞭如何標記每個請求。參見[slim-angular Tokenizer Example](https://github.com/alexdebril/slim-angular#tokenizer)。 – georgeawg

回答

0

我刪除了Slim自己的CSRF包(slim/csrf),因爲除了角度外還有幾個問題。
相反,我現在使用XSRF令牌將在頭部傳輸。 Angular可以很好地處理這個問題,並且完全開箱即用。

2

看來他們使用的是slim-csrf,幸運的是,該設置禁止在每個請求上重新生成CSRF令牌。根據GitHub readme

默認情況下,Slim\Csrf\Guard將在每次請求後生成一個新的名稱/值對。這是certain situations的重要安全措施。但是,在很多情況下這是不必要的,並且a single token throughout the user's session will suffice。通過使用每會話請求,例如,處理AJAX請求變得更容易,而無需在每次請求後檢索新的CSRF令牌(通過重新加載頁面或發出單獨的請求)。

所以,在/php/middleware.php,只是第6個參數設置爲true,並保留其餘部分null。有關其他5個選項的列表,您可以查看source

+0

我已經試過了。然後'$ name = $ request-> getAttribute($ container-> csrf-> getTokenNameKey()); $ value = $ request-> getAttribute($ container-> csrf-> getTokenValueKey());'不輸出任何CSRF密鑰(只有'null')。還有一個問題是,如果服務器由於連接錯誤而生成新的令牌,則角度不會檢測到它。所以主要問題應該是:我如何檢測角度上的CSRF令牌更改? (那麼每個連接是否會有新的令牌,或者攻擊或錯誤認證中可能只有新的令牌都無關緊要。) – christopher2007