Verhindern, dass form_token in Drupal "GET" -Formularen gerendert wird

7

Drupal fügt ein form_token als verborgenes Feld ein, wenn es Formulare rendert. Das form_token wird dann bei der Formularübermittlung geprüft, um Cross-Site-Request-Forgery-Angriffe zu verhindern. Die gesendeten Formulardaten stammen garantiert aus dem Originalformular, das von Drupal gerendert wurde.

Formulare, die die Methode "GET" verwenden, sollten dieses Token jedoch nicht benötigen. Alles was es tut, ist die resultierende URL zu verlängern und zu glätten.

Gibt es irgendeine Möglichkeit, es zu unterdrücken?

    
ctford 30.09.2009, 10:36
quelle

4 Antworten

12

Ja, es gibt einen Weg, aber benutze es bewusst (siehe Warnung unten):

Wenn Sie das Formular selbst erstellen, fügen Sie

hinzu %Vor%

für das Formulardefinitionsfeld sollte verhindern, dass ein Token überhaupt generiert wird.

Wenn Sie mit einem vorhandenen Formular arbeiten, können Sie den Token-Validierungsprozess umgehen, indem Sie das Element #token auf hook_form_alter :

deaktivieren %Vor%

Warnung: Angesichts Ihrer Frage, glaube ich, gibt es ein geringes Missverständnis bezüglich des Unterschieds (besser, das Fehlen eines Unterschieds) zwischen GET- und POST-Anfragen.

  

... in Formularen mit der Methode "GET"   sollte dieses Token nicht benötigen. Alles was es tut   ist länger und hebelt das Ergebnis   URL.

Das ist falsch! GET und POST sind nur zwei verschiedene, aber meist äquivalente Methoden zur Übertragung von Daten vom Client zum Server. Da POST für die Übertragung großer Datenmengen (oder schwierig formatierter Daten) besser geeignet ist, ist es der etablierte Standard zum Einreichen von Formularen, aber in keiner Weise sicherer / unsicherer oder mehr / weniger sicher als GET-Anfragen . Beide Arten von Anforderungen können auf dieselbe Weise von böswilligen Benutzern manipuliert werden. Daher sollten beide Typen die gleichen Schutzmechanismen verwenden.

.

Bei einer GET-Anfrage macht das Token genau das gleiche wie bei einer POST-Anfrage - es beweist dem Server, dass die übermittelten Daten vom selben Browser auf dem gleichen Rechner kommen wie die Anfrage, die er erstellt hat das Formular für! Sie sollten es also nur entfernen, wenn Sie sicher sind, dass die Anfrage nicht über XSRF missbraucht werden kann.

    
Henrik Opel 30.09.2009, 20:40
quelle
9

Das hat für mich funktioniert. Ich musste alle Form-API-Elemente aufheben und die Eigenschaft #token auf false setzen. Beachten Sie die Funktion after_build zum Deaktivieren der anderen Eigenschaften.

%Vor%     
Trevor McKeown 31.08.2011 19:00
quelle
4

Die Site, an der ich arbeite, verwendet die Drupal 6-Formular-API für benutzerdefinierte Suchformulare. Durch Entfernen des Tokens und der Build-ID konnten wir die Ergebnisse in Memcache zwischenspeichern. Jetzt sind wir zu Acquia Hosting gegangen, es wird mit Varnish zwischengespeichert.

Verwenden Sie die folgende Methode, um form_token und form_build_id aus Ihrem Formular zu entfernen und als GET-Anforderung zu senden:

%Vor%     
Christopher 20.04.2011 06:55
quelle
3

Ich finde, dass das einfache Wegwerfen des CSRF-Tokens nicht eine Option ist. Wir lösten es mit hook_theme_registry_alter () , um den Drupal-Kern zu überschreiben a href="http://api.drupal.org/api/drupal/includes--form.inc/function/theme_hidden/6"> theme_hidden () Funktion, so dass das versteckte Formularelement 'form_token' ist gerendert als <esi /> -Tag. Das Tag wird dazu führen, dass Varnish eine PHP-Datei aufruft, die wir den Cache passieren lassen. Diese Datei berechnet das richtige Form-Token für den aktuellen Benutzer und gibt dann den HTML-Code für das verborgene Feld aus. Sie können dieses Token ohne einen Drupal-Bootstrap berechnen, aber Sie benötigen eine einzelne DB-Abfrage, um den * drupal_private_key * für Ihre Site zu holen, der in gespeichert ist Variable Tabelle.

    
malc0mn 04.09.2011 20:45
quelle

Tags und Links