Hallo,
kann es sein, dass sich die Unterstützung des Inserttag {{REQUEST_TOKEN}} zwischen 4.4 und 4.8 verändert hat?
Folgendes Problem:
Ich habe hier ein einezwei Erweiterungen, die bisher unter Contao 4.4 eingesetzt wurden und nun unter 4.8 laufen sollen. Beide Erweiterungen haben eines gemeinsam - sie haben im Template (mod_ouisearch) ein Formular eingebaut habe. Das Modul verbietet dann die Eingabe und spuckt entsprechend ein Ergebnis aus. Um das ganze sicher zu gestalten, sollte natürlich der REQUEST_TOKEN entsprechend übergeben werden (Hinweis: aktuell wird er allerdings von mir noch nicht geprüft).
Das Problem ist nun folgendes. Rufe ich die Seite das erste mal überhaupt auf (also während noch keine Cookies etc. gesetzt wurden) wird kein REQUEST_TOKEN hinterlegt. Das Formular-Feld bleibt leer. Entsprechend ist auch der Cookie "csrf_https-contao_csrf_token" nicht im Browser gesetzt. Erst wenn ich z.B. auf der Seite z.B. das normale Kontaktformular aufrufe wird der Cookie gesetzt und im Anschluss (solange der Cookie noch existiert) wird auch der REQUEST_TOKEN in meiner Erweiterung gesetzt. Lösche ich den Cookie - dann ist wieder aus.
Das Template und Modul sieht aktuell wie folgt aus. Das Modul ist ziemlich leergeräumt aktuell um alle Fehlerquellen auszuschließen:
HTML-Code:
{...}
<form action="<?php echo \Contao\Environment::get('requestUri') ?>" id="testForm" method="get" enctype="application/x-www-form-urlencoded">
<div class="formbody">
<input type="hidden" name="FORM_SUBMIT" value="testForm">
<input type="hidden" name="REQUEST_TOKEN" value="{{REQUEST_TOKEN}}">
{...}
</div>
</form>
{...}
PHP-Code:
<?php
namespace xyz\zyx\Module;
use BackendTemplate;
use Contao\Config;
use Contao\Controller;
use Contao\FrontendTemplate;
use Contao\Input;
use Contao\PageError404;
use Contao\Pagination;
use Module;
class OuiSearchModule extends Module {
/** @var string Template-Variable */
protected $strTemplate = 'mod_ouisearch';
/**
* Displays a wildcard in the back end.
*
* @return string
*/
public function generate():string {
self::loadLanguageFile('tl_ouisearch');
if (TL_MODE === 'BE') {
$template = new BackendTemplate('be_wildcard');
$template->{'wildcard'} = "*** DUMMY TEXT *** ";
$template->{'title'} = $this->headline;
$template->{'id'} = $this->id;
$template->{'link'} = $this->name;
$template->{'href'} = 'contao/main.php?do=themes&table=tl_module&act=edit&id=' . $this->id;
return $template->parse();
}
return parent::generate();
}
/**
* Generates the module.
*/
protected function compile():void {
self::loadLanguageFile('tl_ouisearch');
//Request-Token Init
//$this->Template->{'REQUEST_TOKEN'} = "test:" . \RequestToken::get();
//var_dump($this->Template->{'testtoken'});
}
}
Das interessante dabei ist noch folgendes. Wie man am Programmcode sieht, hab ich einmal geschaut ob ich ein Request-Token selber ermitteln kann. Der Request-Token wird auch erzeugt und var_dump gibt ihn auch entsprechend aus. Sobald ich dann aber im Template mittels <?=$this->Template->{'testtoken'}?> einfügen möchte, bekommt das Template wiederum nur "test:" ... ohne Token, während var_dump wiederum "Test:"+Token ausgibt.
Daher meine Frage - wo könnte der Fehler liegen? Ich weiß, dass \RequestToken mit Contao 5.x eingestampft wird. Allerdings mit 4.8 sollte das ganze doch eigentlich wie gehabt funktionieren, oder?
Gruß,
Jens
Nachtrag:
Nach etwas experimentieren ist mir noch etwas aufgefallen. Nehmen wir an der Nutzer ist noch nie auf der Seite gewesen und hat auch keine gesetzten Cookies. Nehmen wir jetzt folgende Klick-Pfade auf der Seite an:
1.) Nutzer sucht nach der Seite über $suchmaschinen -> Nutzer klickt auf den Suchtreffer und kommt direkt auf die Seite mit der Erweiterung ... ==> Kein REQUEST_TOKEN wird gesetzt.
2.) Nutzer kommt auf die Startseite (oder eine beliebige andere Unterseite) und klickt danach auf die Seite mit der Weiterung ... ==> REQUEST_TOKEN ist gesetzt
Es scheint also, dass prinzipiell der REQUEST_TOKEN bzw. der der dazugehörige Cookie "csrf_https-contao_csrf_token" immer erst beim zweiten Aufruf der Seite gesetzt zu werden. Warum allerdings, ist mir aktuell ein Rätsel.
Lesezeichen