typo3 formhandler CSRF-Token
Der Formhandler hat (zumindest soweite ich feststellen konnte in seiner aktuellen Version) keinen funktionierenden Schutz gegen XSS-Angriffe. Das heißt natürlich dass ein User der angemeldet ist auf böse Dinge klicken kann die über JS die Formhandler-Forms antriggern können. Und je nachdem was das für Formulare sind kann das schon blöd sein wenn zum Beispiel sämtliche Userdaten des Users mit Blödsinn überschrieben wird.
Ich hab mir dafür jetzt eine kleine Lösung verfasst die wie folgt aufgebaut ist:
1. Klasse PreProzessor Klasse zur Tokengenerierung
2. Templateanpassung mit hidden field für den Token
3. ErrorCheck für den Token
Zuvor muss man sich entscheiden ob man die Sourcen als Extension einbindet oder via Typoscript nachläd.
Ich hab mich für das nachladen entschieden:
1. Tx_Formhandler_PreProcessor_CSRFPreProcessor.php
2. Tx_Formhandler_ErrorCheck_CSRF.php
Tx_Formhandler_PreProcessor_CSRFPreProcessor.php:
Ich hab mir dafür jetzt eine kleine Lösung verfasst die wie folgt aufgebaut ist:
1. Klasse PreProzessor Klasse zur Tokengenerierung
2. Templateanpassung mit hidden field für den Token
3. ErrorCheck für den Token
Zuvor muss man sich entscheiden ob man die Sourcen als Extension einbindet oder via Typoscript nachläd.
Ich hab mich für das nachladen entschieden:
plugin.Tx_Formhandler.settings.additionalIncludePaths.1=pfad/zum/codeIn diesem Ordner liegen 2 Dateien:
1. Tx_Formhandler_PreProcessor_CSRFPreProcessor.php
2. Tx_Formhandler_ErrorCheck_CSRF.php
Tx_Formhandler_PreProcessor_CSRFPreProcessor.php:
<?php class Tx_Formhandler_PreProcessor_CSRFPreProcessor extends Tx_Formhandler_AbstractPreProcessor { /** * The main method called by the controller * * @return array The probably modified GET/POST parameters */ public function process() { $min=pow(10,7); $this->gp['csrf_token'] = rand($min,$min*10-1); $this->globals->getSession()->set('csrf_token', $this->gp['csrf_token'] ); return $this->gp; } } ?>Tx_Formhandler_ErrorCheck_CSRF.php:
<?php class Tx_Formhandler_ErrorCheck_CSRF extends Tx_Formhandler_AbstractErrorCheck { public function check() { $checkFailed=''; $csrftoken = $this->globals->getSession()->get('csrf_token'); if($csrftoken != $this->gp['csrf_token']) $checkFailed = 'CSRF-Token invalid!'; return $checkFailed; } } ?>Im TS den PreProcessor als solchen einbinden.
plugin.Tx_Formhandler{ settings.predef.myForm { preProcessors.1.class = Tx_Formhandler_PreProcessor_CSRFPreProcessor }Im TS die Validierung machen (im multiStepFall für alle Steps einbinden):
plugin.Tx_Formhandler{ settings.predef.myForm { 1 { validators.1.class = Validator_Default validators.1.config.fieldConf { first_name.errorCheck.1 = required #beispiel feld csrf_token.errorCheck.1 = required csrf_token.errorCheck.2 = CSRF #das CSRF ergibt sich automatisch durch den Klassennamen } } }Im Templatefile muss jetzt noch gleich nach dem hidden fields marker ein input element für den Token eingefügt werden:
###HIDDEN_FIELDS### <input type="hidden" value="###value_csrf_token###" name="###formValuesPrefix###[csrf_token]" ></input >
rothi - 22. Jul, 16:18