wake-up-neo.com

Das CSRF-Token ist ungültig. Bitte versuchen Sie das Formular erneut zu senden

Diese Fehlermeldung wird jedes Mal angezeigt, wenn ich versuche, das Formular zu senden:

Das CSRF-Token ist ungültig. Bitte versuchen Sie das Formular erneut zu senden

Mein Formularcode lautet:

<form novalidate action="{{path('signup_index')}}" method="post" {{form_enctype(form)}} role="form" class="form-horizontal">
    <div class="form-group">
        {{ form_label(form.email, 'Email', {'label_attr': {'class': 'col-md-1 control-label'}}) }}
        {{ form_widget(form.email, {'attr': {'class': 'col-md-2'}}) }}
        {{ form_errors(form.email) }}
    </div>

    <div class="form-group">
        {{ form_label(form.nickname, 'Nickname', {'label_attr': {'class': 'col-md-1 control-label'}}) }}
        {{ form_widget(form.nickname, {'attr':{'class': 'col-md-2'}}) }}
        {{ form_errors(form.nickname, {'attr': {'class': 'col-md-3'}}) }}
    </div>
    <div class="form-group">
        {{ form_label(form.password, 'password', {'label_attr': {'class': 'col-md-1 control-label'}}) }}
        {{ form_widget(form.password, {'attr': {'class': 'col-md-2'}}) }}
        {{ form_errors(form.password, {'attr': {'class': 'col-md-3'}}) }}
    </div>

    <div class="form-group">
        {{ form_label(form.password_repeat, 'Repeat password', {'label_attr': {'class': 'col-md-1 control-label'}}) }}
        {{ form_widget(form.password_repeat, {'attr':{'class': 'col-md-2'}}) }}
        {{ form_errors(form.password_repeat, {'attr': {'class': 'col-md-3'}}) }}
    </div>
    <div class="form-group">
        <div class="col-md-1 control-label">
        <input type="submit" value="submit">
    </div>

    </div>
</form>

Irgendwelche Ideen?

29

Sie müssen den _token in Ihrem Formular hinzufügen, d. H

{{ form_row(form._token) }}

Ab sofort fehlt in Ihrem Formular das Feld CSRF-Token. Wenn Sie die Zweigformfunktionen verwenden, um Ihr Formular wie form(form) zu rendern, wird das CSRF-Tokenfeld automatisch für Sie gerendert. Ihr Code zeigt jedoch, dass Sie Ihr Formular mit Roh-HTML wie <form></form> rendern, sodass Sie das Feld manuell rendern müssen.

Oder fügen Sie einfach {{ form_rest(form) }} vor dem schließenden Tag des Formulars hinzu.

Nach den Dokumenten

Dies rendert alle Felder, die noch nicht für das gegebene gerendert wurden bilden. Es ist eine gute Idee, dies immer irgendwo in Ihrem Formular zu haben da es verborgene Felder für Sie rendert und alle Felder macht, die Sie vergessen haben offensichtlicher zu machen (da das Feld für Sie gerendert wird).

form_rest (view, variables)

79
M Khalid Junaid

Diese Fehlermeldung wird auch angezeigt, wenn Ihr Formular viele Elemente enthält.

Diese Option in php.ini ist ein Problem

; How many GET/POST/COOKIE input variables may be accepted
 max_input_vars = 1000

Das Problem ist, dass _token die PUT (GET) -Anforderung nicht erfüllt.

Es handelt sich auch um große Dateien. Erhöhung der

upload_max_filesize

option löst Problem

22
zalex

Dies geschieht, weil Formulare standardmäßig einen CSRF-Schutz enthalten, der in einigen Fällen nicht erforderlich ist.

Sie können diesen CSRF-Schutz in Ihrer Formularklasse in der Methode getDefaultOptions wie folgt deaktivieren:

// Other methods omitted

public function getDefaultOptions(array $options)
{
    return array(
        'csrf_protection' => false,
        // Rest of options omitted
    );
}

Wenn Sie den CSRF-Schutz nicht deaktivieren möchten, müssen Sie das CSRF-Schutzfeld in Ihrem Formular rendern. Dies kann durch Verwendung von {{ form_rest(form) }} in Ihrer Ansichtsdatei wie folgt durchgeführt werden:

<form novalidate action="{{path('signup_index')}}" method="post" {{form_enctype(form)}} role="form" class="form-horizontal">
    <!-- Code omitted -->

    <div class="form-group">
        <div class="col-md-1 control-label">
            <input type="submit" value="submit">
        </div>

    </div>
    {{ form_rest(form) }}
</form>

{{ form_rest(form) }} gibt alle Felder wieder, die Sie nicht manuell eingegeben haben.

9
user3577953

Bevor Sie Ihren </form>-Tag eingeben:

{{ form_rest(form) }}

Andere wichtige (verborgene) Eingaben werden automatisch eingefügt.

5
Bc. Poklop

Ich hatte dieses Problem mit einem seltsamen Verhalten: Das Löschen des Browser-Cache wurde nicht behoben, aber das Löschen der Cookies (d. H. Des PHP Session-ID-Cookies) hat das Problem gelöst.

Dies ist zu tun nachdem Sie alle anderen Antworten geprüft haben, einschließlich der Bestätigung, dass do das Token in einem Eingabefeld für ein ausgeblendetes Formular hat.

2
Benoit Duffez

Ich hatte kürzlich diesen Fehler. Es stellt sich heraus, dass meine Cookie-Einstellungen in config.yml nicht korrekt waren. Das Hinzufügen der Einstellungen cookie_path und cookie_domain zu framework.session wurde behoben.

2
Michael

Zusätzlich zu den Vorschlägen anderer Benutzer können Sie CSRF-Token-Fehler erhalten, wenn der Sitzungsspeicher nicht funktioniert.

In einem kürzlichen Fall hat ein Kollege von mir 'session_prefix' in einen Wert geändert, der ein Leerzeichen enthielt.

session_prefix: 'My Website'

Dadurch wurde der Sitzungsspeicher unterbrochen, was wiederum bedeutete, dass mein Formular das CSRF-Token nicht von der Sitzung abrufen konnte.

2
Henry

Ich hatte vor kurzem das gleiche Problem und mein Fall wurde hier noch nicht erwähnt:

Das Problem war, dass ich es auf der Domain localhost getestet habe. Ich bin mir nicht sicher, warum genau dies ein Problem war, aber es begann zu funktionieren, nachdem ich einen Hostnamen-Alias ​​für localhost in /etc/hosts Wie folgt eingefügt hatte:

127.0.0.1        foobar

Wahrscheinlich stimmt etwas nicht mit der Sitzung, wenn Apache und localhost als Domain verwendet werden. Wenn jemand in den Kommentaren näher darauf eingehen kann, bearbeite ich diese Antwort gerne mit weiteren Details.

1
Teo.sk

Ich war mit einem ähnlichen Problem konfrontiert. Nachdem sichergestellt wurde, dass das Tokenfeld tatsächlich gerendert wurde (siehe akzeptierte Antwort), habe ich meine Cookies geprüft. Es gab 2 (!) Cookies für die Domain in meinem Chrome-Browser, anscheinend, weil ich die Anwendung in derselben Domain wie eine andere App ausgeführt habe , aber mit einem anderen Port (dh mydomain.com hat den ursprünglichen Cookie gesetzt, während die fehlerhafte App auf mydomain.com:123) lief Jetzt hat Chrome offenbar das falsche Cookie gesendet, sodass der CSRF-Schutz das Token nicht mit dem verknüpfen konnte richtige Sitzung.

Korrektur: Löschen Sie alle Cookies für die betreffende Domäne. Stellen Sie sicher, dass Sie nicht mehrere Anwendungen in derselben Domäne mit unterschiedlichen Ports ausführen.

0
lkoell

In meinem Fall hatte ich Probleme mit der maxSize-Annotation in der Entität. Daher habe ich sie von 2048 auf 20048 erhöht.

 /**
 * @Assert\File(
 *     maxSize = "20048k",
 *     mimeTypes = {"application/pdf", "application/x-pdf"},
 *     mimeTypesMessage = "Please upload a valid PDF"
 * )
 */
private $file;

hoffe diese Antwort hilft!

0
Jorgeeadan

Wenn Sie Ihr Formular von einfachem HTML in Twig konvertiert haben, verpassen Sie nicht, ein schließendes </form> - Tag zu löschen. Dummer Fehler, aber wie ich herausgefunden habe, ist es eine mögliche Ursache für dieses Problem.

Als ich diesen Fehler bekam, konnte ich es zuerst nicht herausfinden. Ich benutze form_start() und form_end(), um das Formular zu generieren, daher sollte ich das Token nicht explizit hinzufügen müssen mit form_row(form._token), oder verwenden Sie form_rest(), um es abzurufen. Es sollte bereits automatisch von form_end() hinzugefügt worden sein.

Das Problem war, dass ich die Ansicht, mit der ich arbeitete, von einfachem HTML in twig konvertiert und das schließende </form> - Tag nicht gelöscht hatte.

{{ form_end(form) }}

Ich hatte:

</form>
{{ form_end(form) }}

Das scheint tatsächlich etwas zu sein, das einen Fehler auslösen könnte, aber anscheinend nicht. Wenn also form_end()form_rest() ausgibt, ist das Formular bereits geschlossen. Die tatsächlich generierte Seitenquelle des Formulars sah folgendermaßen aus:

<form>
    <!-- all my form fields... -->
</form>
<input type="hidden" id="item__token" name="item[_token]" value="SQAOs1xIAL8REI0evGMjOsatLbo6uDzqBjVFfyD0PE4" />
</form>

Offensichtlich besteht die Lösung darin, das zusätzliche schließende Tag zu löschen und vielleicht noch etwas Kaffee zu trinken.

0
Don't Panic

Ich hatte den gleichen Fehler, aber in meinem Fall bestand das Problem darin, dass meine Anwendung mehrere First-Level-Domänen verwendete, während der Cookie eine verwendete. Durch das Entfernen von cookie_domain: ".%domain%" aus framework.session im config.yml wurden Cookies standardmäßig auf die Domäne des Formulars gesetzt, wodurch das Problem behoben wurde.

0
ACJ

Falls Sie nicht form_row oder form_rest verwenden möchten und einfach auf den Wert des _token in Ihrer Zweigvorlage zugreifen möchten. Verwenden Sie folgendes:

<input type="hidden" name="form[_token]" value="{{ form._token.vars.value }}" />
0
Imran Zahoor