-
REQUEST_TOKEN
Servus,
ich habe folgendes Problem und vielleicht kann mir jemand helfen. Aktuell versuche ich aus einen externen Formular (App) via POST an meine REST-Schnittstelle anzudocken.
Dafür habe ich mir ein einfaches Modul zum testen geschrieben:
PHP-Code:
class FileUploadRest extends \Module
{
protected $strTemplate = 'ce_html';
public function generate()
{
if (TL_MODE == 'BE')
{
$objTemplate = new \BackendTemplate('be_wildcard');
$objTemplate->wildcard = '### MODULE FILEUPLOAD REST ###';
$objTemplate->title = $this->headline;
$objTemplate->id = $this->id;
$objTemplate->link = $this->name;
$objTemplate->href = 'contao/main.php?do=themes&table=tl_module&act=edit&id=' . $this->id;
return $objTemplate->parse();
}
return parent::generate();
}
protected function compile()
{
;
$this->echoOutput($_POST);
}
protected function echoOutput($arrTable)
{
$arrOutput['response'] = $arrTable;
header('Content-type: application/json; charset=utf-8'):
echo json_encode($arrOutput);
die();
}
Daraus erstelle ich mir ein Modul und binde das ganze als Artikel in die entsprechende Seite ein. Bei GET-Parametern funktioniert soetwas wunderbar.
Nun ist es aber so, dass wenn Contao etwas per POST empfängt ein valides Request_Token verlangt wird:
PHP-Code:
// initialize.php
// 258
/**
* Check the request token upon POST requests
*/
if ($_POST && !RequestToken::validate(Input::post('REQUEST_TOKEN')))
{
// Force a JavaScript redirect upon Ajax requests (IE requires absolute link)
if (Environment::get('isAjaxRequest'))
{
header('HTTP/1.1 204 No Content');
header('X-Ajax-Location: ' . Environment::get('base') . 'contao/');
}
else
{
header('HTTP/1.1 400 Bad Request');
die_nicely('be_referer', 'Invalid request token. Please <a href="javascript:window.location.href=window.location.href">go back</a> and try again.');
}
exit;
}
und daher wird mein Modul schon garnicht ausgeführt. Ich muss irgendwie an einer Stelle vorher ran.
Hat jemand eine gute Idee wie das möglichst update-sicher hinbekomme? Ich kann auch damit leben, wenn z.B. auf der einen bestimmten Seiten das REQUEST_TOKEN einfach deaktivert wird.
Liebe Grüße,
Marq
-
Mir fallen hier drei Möglichkeiten ein:
- Du holst dir vor dem POST Request ein gültiges Request Token per GET Request (keine Ahnung ob das tatäschlich so funktionieren kann), und sendest dieses Request Token dann beim POST Request mit.
- Du fügst in deinem Einstiegspunkt
PHP-Code:
define('BYPASS_TOKEN_CHECK', true);
ein (vor der initialize.php) - Du schaltest die Anfrage Token generell aus
-
Ich würde mir mit curl den aktuellen CSRF Token von einer Seite mit Formular holen und den dann mitschicken.
-
Ein Blick in die Klasse RequestToken macht schlauer. Hier gibt es drei Möglichkeiten die RequestToken-Validierung zu umgehen:
- disableRefererCheck über TL_CONFIG
- BYPASS_TOKEN_CHECK Konstante setzen
- requestTokenWhitelist nutzen
Da die Validierung erst nach dem initializeSystem Hook ausgeführt wird, ist es dann dadurch möglich die den einen Fall die Validierung auszuhebeln.