2012-02-09 141 views
7

我繼承了一個symfony2項目,它在活動環境中運行超過2個負載平衡服務器。會話存儲在應用程序因此出現的mysql數據庫中。CSRF令牌在負載均衡symfony2應用程序中無效

我遇到的問題是,在具有CSRF保護的表單上有時令牌回來無效。我猜這是因爲生成令牌的服務器並不總是獲取表單POST的服務器,並且不能匹配正在發送的令牌。

我對symfony非常非常新,並嘗試了幾種不同的解決方案,使用Symfony框架中的會話和SessionCsrfProvider生成令牌。

任何人都可以指向正確的方向或有類似的問題嗎?

+0

會話是否按預期工作? – 2012-02-09 14:21:04

+0

是的,用戶的會話管理工作正常。如果表單被髮回到服務器,並且它不是來源的,那麼這只是csrf標記警告。我已經通過在使用IP地址的負載平衡服務器之一上工作來測試了這一點。 – chrishey 2012-02-09 15:16:54

+0

我正在努力的是理解SessionCsrfProvider是否使用存儲在數據庫中的會話。有關調試的任何提示?由於我們擁有的唯一負載平衡環境是活的,因此測試很困難。謝謝 – chrishey 2012-02-10 10:28:46

回答

2

CsrfProviders將通過連接密鑰(來自parameters.ini)+意圖(默認爲null)+ 會話ID來生成令牌。

默認情況下,symfony被配置爲使用SessionCsrfProvider,它使用會話存儲 id。

如果您使用PDOSessionStorage或NativeSessionStorage對象,它將返回session_id()

這可能意味着您的session_id()是不一樣的取決於什麼機器處理請求。

+3

看來修復是兩個服務器的parameters.ini密鑰是不一樣的,即使我糾正了這個問題,直到我清除了應用緩存並在兩臺服務器上重新啓動apache幾次後才生效。感謝你的幫助。 – chrishey 2012-02-13 09:42:14