Wie kann man Formulare mit einem Reverse-Proxy zwischenspeichern und mit veralteten Formular-Token umgehen?

8

Wenn die Formular-API ein Formular generiert, wird auch ein Token generiert, das mit dem Formular in einem ausgeblendeten Feld ausgegeben wird und voraussichtlich zurückgegeben wird. Wenn dies der Fall ist, wird das Formular verarbeitet.

Wenn eine gerenderte Form beispielsweise von Varnish zwischengespeichert werden soll, bricht dieser Mechanismus. Der erste Benutzer, der das Formular sendet, verwendet das Token. Folgende Versuche, das Formular zu verwenden, werden abgelehnt.

Welche Strategien stehen zur Verfügung, um Formulare beim Zwischenspeichern des gerenderten Formulars funktionsfähig zu halten?

Letharion
quelle
Bist du dir da sicher? Ich habe Websites mit Formularen und Reverse-Proxys erstellt und kein Problem festgestellt. Das einzige, was Sie im Allgemeinen beachten müssen, ist sicherzustellen, dass die Ergebnisseiten nicht zwischengespeichert werden.
Alfred Armstrong
Ich würde gerne als falsch erwiesen werden, da dies mein Problem lösen würde, aber ja, ich bin sicher. :) Überprüfen Sie die Funktionen form_ {g, s} et_cache auf Details.
Letharion
Für anonyme Benutzer bin ich sicher, dass eine Seite mit einem Formular sicher zwischengespeichert werden kann. Für nicht anonyme Benutzer sind Reverse-Proxys in jedem Fall problematisch.
Alfred Armstrong
2
(Token werden nur generiert, wenn ein Benutzer eine ID hat.)
Alfred Armstrong
1
Ah, das macht Sinn. Leider sind meine Benutzer in diesem Fall authentifiziert. Vielleicht sollte die Frage umformuliert werden, um dies einzuschließen.
Letharion

Antworten:

5

Ich verwende BOA für meine Websites, aber standardmäßig deaktiviert BOA einfach das Front-End-Caching im laufenden Betrieb für Formularübermittlungen. Über meine tatsächliche Erfahrung hinaus stieß ich auf ein einjähriges künstliches Kreuz, wie die New Zealand Post mit Drupal & Varnish und dem Formular-Token-Problem umgeht. Holy John Wayne, es ist ein Muss für Drupal Caching - wirklich. Konzentrieren Sie sich nur auf das Formularproblem:

Das letzte Teil unseres Puzzles ist das Modul Cookie Cache Bypass Advanced , das automatisch ein spezielles NO_CACHE-Cookie setzt, wenn der Benutzer ein POST-Formular auf der Site sendet, einschließlich des Anmeldeformulars. Unser Lack ist so konfiguriert, dass er den Seiten-Cache (aber nicht den ESI-Cache) umgeht, wenn er dieses Cookie sieht.

Sie können Formular-Token auch deaktivieren, wenn die XSRF-Produktion in form_alter (nicht gesetzt ($ form ['# token']);) oder ($ form ['# token'] = FALSE;) nicht erneut angefordert wird.

Ein Acquia Drupal Performance-Artikel enthält a Drupal-Modul-Authcache vorgestellt. Wenn Sie jedoch das Dokument in Authcache lesen, wird das Caching mit einem Platzhalter für das Formular berechnet ( das Formular wird nicht zwischengespeichert):

Authcache versucht, benutzerdefinierte Inhalte abzufangen und einen Platzhalter im HTML-Code einzurichten. Nach dem Laden der Seite wird ein Ajax-Rückruf verwendet, um benutzerdefinierte Daten abzurufen und die Platzhalter auszufüllen, wodurch der Seiten-HTML-Code dynamisch aktualisiert wird.

Aktuelle Authcache-Platzhalter: Formulartoken (nur angemeldete Benutzer; erforderlich von> Drupal, um Angriffe auf Fälschungen von standortübergreifenden Anforderungen zu verhindern)

Die Strategie ist, alles außer dem Formular zwischenzuspeichern . Also alles andere ansprechen: Vielleicht wird Lack überhaupt nicht verwendet, Memcache & Redis? Meine Strategie wäre es, das zu verwenden, was BOA bietet, weil ich BOA und die dahinter stehenden Assistenten verwende ( omega8.cc ) eine Tonne mehr wissen als ich. Ich glaube nicht, dass es einen externen Cache gibt, der das Problem löst. Sie scheinen alle für die Form zu umgehen.

Führen Sie ein teilweises Caching mit dem oben genannten Authcache und mit fein abgestimmten Ansichten und Bedienfeldern durch, wie im Artikel und in der NZ Post erwähnt vom Brain Trust bei Wunderkraut beschrieben - es ist alt, aber es behebt das Problem.

Verwendung Drupal ESI - Modul und Varnish ist teilweise ESI - konform):

ESI - oder Edge Side Includes - ist eine leistungsstarke Caching-Lösung für authentifizierte Benutzer, kann aber auch für anonyme Benutzer hilfreich sein.

In der Regel verhindern Seiten, die für authentifizierte Benutzer personalisiert sind (selbst geringfügige Personalisierungen, z. B. ein Block mit der Aufschrift "Als Manarth angemeldet"), dass Reverse-Proxys (die problemlos 100-mal schneller als Drupal ausgeführt werden können) die Seite aufgrund von Nachrichten zwischenspeichern für einen Benutzer bestimmt könnte dann von einem anderen gesehen werden.

Hoffe das ist hilfreicher.

Tom
quelle
Ein kurzer Blick auf den Code legt nahe, dass das ESI-Modul in Bezug auf die Formularvalidierung überhaupt nichts unternimmt. Keine Erwähnung der Token-Handhabung oder interessante Formänderungen. Ist es möglich, dass Sie einfach keine Formulare zwischengespeichert haben, für die eine Authentifizierung in Lack erforderlich ist, und deshalb haben Sie dieses Problem nie gesehen?
Letharion
Es stellt sich heraus, dass genau das passiert. BOA umgeht den Front-End-Cache im laufenden Betrieb für Formulare (Entschuldigung für meine zuvor unvollständige / falsche Antwort). ESI ist immer noch ein wichtiger Teil der Strategie "Alles außer Cache" in meiner Antwort, auch wenn es nicht direkt gelöst werden kann.
Tom
Dieser Artikel in Neuseeland war in der Tat wirklich interessant. Soweit ich das beurteilen kann, wird das Token-Problem jedoch nur mit folgenden Punkten behandelt: "In Fällen, in denen Sie sicher sind, dass der XSRF-Schutz nicht wichtig ist ... Drupal bietet einen Mechanismus zum Deaktivieren von Formular-Token", der in nicht hilfreich ist mein Fall.
Letharion
Viele nützliche Informationen, und definitiv andere werden sie auf ihre Probleme anwenden können. +1, und da es nur noch eine Stunde ist, kann ich mir das Kopfgeld genauso gut bewusst machen. :)
Letharion
0

Eine mögliche Lösung wäre, das Token zusammen mit zu deaktivieren $form[‘#token’] = FALSE; und dann den Rückruf zum Senden zu überschreiben, anstatt den Kommentar tatsächlich zu veröffentlichen, das ursprüngliche Formular mit einem Token neu zu generieren und den Benutzer zu bitten, den Beitrag zu bestätigen.

Wenn der Benutzer ECMAScript unterstützt , kann die Benutzererfahrung verbessert werden, indem eine Serviceressource vorhanden ist, die die Formulargenerierung neuer Formulartoken verfügbar macht und das entsprechende Formular in das Formular einfügt form_cache. Sobald sich der Benutzer auf das Formular konzentriert und es wahrscheinlich senden möchte, deaktivieren Sie die Schaltfläche "Senden", rufen Sie ein neues Token ab, fügen Sie es in das bereits gerenderte Formular ein und aktivieren Sie die Schaltfläche "Senden" erneut.

Letharion
quelle