2012-05-04 63 views
21

好吧,今天我用我們的'實時'數據庫中的新信息更新了我的數據庫......從那以後,我一直在我的一個表單上遇到問題。如果你需要任何代碼讓我知道,我會編輯這個併發布所需的代碼...symfony2 CSRF無效

我有一個報表窗體,其中包含日期範圍字段和代理部門的下拉菜單。當我第一次訪問該網頁我看到這個在窗體的開頭:

The CSRF token is invalid. Please try to resubmit the form

於是我去到我的其他形式具有相同類型的信息之一,並檢查_token出來,這是什麼出來:

<input type="hidden" id="ecs_crmbundle_TimeClockReportType__token" name="ecs_crmbundle_TimeClockReportType[_token]" value="87e358fbc4d6d3e83601216b907a02170f7bcd92" /> 
<input type="hidden" id="ecs_crmbundle_SimpleSalesReportType__token" name="ecs_crmbundle_SimpleSalesReportType[_token]" value="87e358fbc4d6d3e83601216b907a02170f7bcd92" /> 

第一個是一個,顯示錯誤,SimpleSalesReport不...任何想法,這是爲什麼這樣做,或者我該如何解決?

謝謝..

回答

25

你是不是在其中產生CSRF錯誤的操作使用$形式 - > bindRequest()機會呢?我有這個問題。您不應該約束新表單的請求。如果您發佈的形式相同的動作,包裹bindRequest一個條件,檢查如果方法是POST:

if ($this->getRequest()->getMethod() == 'POST') { 
    $form->bindRequest($this->getRequest()); 
    if ($form->isValid()) { 
    ... 
    } 
} 
+3

這個人是一個怪胎天才!這完全是我在做的事情......但是你已經來拯救了一天! – Justin

+22

另外,請記住在底部添加form_rest(表單),作爲表單中的最後一個字段。 Symfony負責爲您使用該語句插入CSRF令牌。 http://symfony.com/doc/current/book/forms.html#rendering-a-form-in-a-template – krishna

+0

@krishna這正是我想念的;草率複製/粘貼在我的部分! – OrganicPanda

18

這個錯誤讓我瘋了天! 謝謝奎師那! 如果在你的表單模板中你選擇不使用默認表單行爲{{ form_widget(form) }}你應該把{{ form_rest(form) }} 希望這可以幫助其他人!

+0

form_rest更加嬌貴 –

+1

form_rest也是我錯誤的地方。謝謝! –

22

使用{{ form_widget(form) }}構建自定義表單沒有任何問題。 所有你需要做的就是添加_token像這樣: {{ form_widget(form._token) }}