2012-05-04 60 views
21

OK, więc dzisiaj zaktualizowałem bazę danych o nowe informacje z naszej "żywej" bazy danych ... I od tego czasu mam problemy z jedną z moich formularzy. Jeśli potrzebujesz jakiegoś kodu, daj mi znać, a ja to edytuję i opublikuję potrzebny kod ...symfony2 CSRF nieważny

Mam formularz raportu z polem zakresu dat i rozwijanym dla działu agenta. Kiedy po raz pierwszy odwiedzić stronę widzę to na początku w postaci:

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

Więc idę do jednego z moich innych form, które ma ten sam rodzaj informacji, i sprawdzić _token się i to jest to, co wychodzi:

<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" /> 

pierwszy z nich to taka, która pokazuje błąd, a SimpleSalesReport nie ... jakiś pomysł, dlaczego to robi to i jak mogę to naprawić?

Dzięki ..

Odpowiedz

25

Czy jesteś przez przypadek przy użyciu $ form-> bindRequest() w akcji, która produkuje błąd CSRF? Miałem ten problem. Nie powinieneś wiązać wniosku o nowy formularz. Jeśli Piszesz formularz do tego samego działania, owinąć bindRequest w warunkowa, która sprawdza, czy jest metoda POST:

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

ten człowiek jest głupim geniuszem! Dokładnie to, co robiłem ... Ale przybyłeś i uratowałeś ten dzień! – Justin

+22

Pamiętaj też, aby dodać form_rest (formularz) na dole, jako ostatnie pole w formularzu. Symfony wymaga troski o wstawienie tokenu CSRF za pomocą tej instrukcji. http://symfony.com/doc/current/book/forms.html#rendering-a-form-in-a-template – krishna

+0

@krishna Dokładnie tego mi brakowało; niechlujny kopiuj/wklej z mojej strony! – OrganicPanda

18

Błąd ten miał mnie szalone dni! Dzięki krishna! Jeśli w szablonie formularza zdecydujesz się nie używać domyślnego zachowania formularza {{ form_widget(form) }} powinieneś umieścić {{ form_rest(form) }} Mam nadzieję, że pomoże to każdemu innemu!

+0

Form_rest jest sprytniejszy –

+1

to było również miejsce, w którym źle się spisałem. Dziękuję Ci! –

22

Nie ma problemu z wykorzystaniem {{ form_widget(form) }} do zbudowania niestandardowego formularza. Wszystko, co musisz zrobić, to dodać _token w ten sposób: {{ form_widget(form._token) }}