2017-01-30 51 views
0

雖然用的Symfony /索納塔的工作,我們所面臨CSRF令牌無效錯誤索納塔CSRF令牌無效雖然形式正確

之前,同樣的代碼工作完美。我們放心,令牌是由形式正確公佈。奇怪的是,這個錯誤只出現在選定的實體上。

這裏瀏覽所有其他的Q/A不能解決問題。

還有什麼可以讓CSRF令牌無效,如果客戶端和服務器之間的一般通信效果很好?

回答

1

解決方案: 增加max_input_varsphp.ini中,至少超過默認1000:

max_input_vars=2000 

原因: 我們在nginx的發現記錄什麼導致了CSRF令牌失敗。事實上,令牌失效只是一個普遍問題的症狀。

以下三個錯誤日誌條目讓該解決方案:

  1. 實體的請求的大小是非常大的。這就是爲什麼第一個錯誤happend:「這意味着,上傳文件的大小比爲上傳保留在內存中的緩衝區大。」(見https://serverfault.com/a/511790)事實上,索納塔是在創造了很多子對象。 。實體對象

* 357395的客戶機請求體被緩衝到一個臨時文件/ var /緩存/ nginx的/ client_temp/0000000742,客戶端:192.168.10.152, 服務器:XXX請求:「POST /管理/實體/ 1234 /編輯uniqid = s588b2b142c3d2 HTTP/1.1" ,主機: 「XXXX」, 引薦: 「http://xxx/admin/entity/1234/edit

  • 這是決定性的信息。 max_input_vars定義,除其他外,有多少投入乏將在$ _ POST請求接受。如果(缺省)限制超過1000,PHP將截斷「來自請求的其他輸入變量」。所以,CSRF標記被PHP截斷了$ _POST var。
  • error_admin:2017年1月27日12點19分19秒[錯誤] 51723#51723:* 357395的FastCGI 在標準錯誤發送:「PHP消息:PHP的警告:未知: 超過1000個輸入變量爲了增加限制變化max_input_vars在php.ini 在未知線0" ,而讀取來自上游, 客戶端響應標頭:192.168.10.152,服務器:XXX,請求:「POST /管理/實體/ 1234 /編輯?uniqid = s588b2b142c3d2 HTTP/1.1「,上行: 」fastcgi://127.0.0.1:9000「,主機:」xxx「,引用者: 」xxx/admin/entity/1234 /編輯「

  • 這就是爲什麼第三誤差發生。「發送到客戶端時由對等方重置連接」,因爲$ _POST請求中的標記顯然不存在(不再存在),因爲它完全或在兩者之間被切斷。對等體找不到有效的令牌並因此拒絕該請求。在發送到客戶端,客戶端:(由對等 重置連接104): 192.168:
  • 2017年1月27日十二時19分19秒[信息] 51723#51723 * 357395的recv()失敗。 10.152,server:xxx,請求:「POST/admin/entity/1234/edit?uniqid = s588b2b142c3d2 HTTP/1.1」,上游: 「fastcgi://127.0.0.1:9000」,主機:「xxx」,referrer: 「xxx/admin/entity/1234/edit?uniqid = s588b2b142c3d2」