Formular Token Problem

Warum machst du es so kompliziert?
In deiner index erstellst du deinen Token und den schreibst du in eine Session-Variable. Diese Variable kannst du dann überall abfragen.
Und beim erstellen des Token prüfst du einfach ob er schon in der Session existiert:
PHP:
if(isset($_SESSION['token']) && $_SESSION['token'] != ''){
   // token existiert
}else{
   // token existiert nicht und muss erstellt werden
}
 
Ja das ist ne Möglichkeit die ich noch gar nicht in betracht gezogen habe.

Wenn ich dann das Formular geschickt habe kann ich ja den Token dann mit Unset zerstören und es wird wieder ein neuer generiert weil er ja dann nicht mehr gesetzt ist.

Werd ich heute Abend mal probieren, big Thx Maniac.
 
Das wäre dann im Grunde auch das was ich dir in meinem Beitrag "8" geschrieben habe!

Innerhalb der Funktion kannst du doch auch einfach prüfen ob $_POST['submit'] vorhanden ist, also die Seite durc h anklicken des Buttons aufgerufen wurde. In diesem Fall darf der Wert nicht neu erstellt werden.
 
@Tombe, Ja irgendwie hab ichs erst jetzt so richtig realisiert.

Es funktioniert jetzt soweit, was mich jetzt nur noch ein bisschen stutzig gemacht hat das ein Formular Reload in diesem Fall doch möglich ist.

Index.php
PHP:
<?php
session_start();

function generateToken() {
    return md5(md5(uniqid().uniqid().mt_rand()));
}

if(isset($_SESSION["token"]) && !empty($_SESSION["token"])) {

// Token existiert

}else{

$_SESSION["token"] = generateToken();

}  

$token = $_SESSION["token"];
?>
<form action="./index.php?page=search" method="post">
    <div class="searchbar">
      <input type="text" name="search" />
        <input type="hidden" name="token" value="<?php echo $token; ?>" />
       <input type="submit" name="submit" />
    </div>
  </form>

So Token ist in der Session und im Input Feld

search.php <-- die ja in die Index Includiert wird.

PHP:
if (!isset($_SESSION["token"]) && !isset($_POST["token"]) && ($_SESSION["token"] !== $_POST["token"])) {

// Externer Aufruf
        // Token ungültig machen
        unset($_SESSION["token"]);
        // Script beenden
    exit;

}

// Token ungültig machen
unset($_SESSION["token"]);

// Formular verarbeiten

Wenn ich jetzt Reload mache übermittelt er einen neuen Token in Session und in Input Feld, was wenn ich 2 separate Seiten hätte so nicht der Fall wäre sondern hier würde dann das Script beendet.
 
Zuletzt bearbeitet:
Du arbeitest immer noch mit der zusätzlichen Variable $token. Diese ist meiner Meinung nach überflüssig weil du doch den Token in der Variablen $_SESSION["token"] hast.

Die Prüfung mit dem IF-Block dürfte (so wie ich es verstehe) auch falsch sein. Du prüfst auf den Wert $_POST["token"] aber du solltest prüfen ob der Submit-Button angeklickt wurde -> $_POST["submit"].

Wobei ich irgendwo im Hinterkopf eine Erinnerung daran habe das es manchmal Probleme gibt wenn der Submit-Button den Namen "submit" hat!?

Wenn ich da jetzt was falsche verstehe, dann erkläre bitte nochmal was jetzt klappt und was nicht.
 
Du arbeitest immer noch mit der zusätzlichen Variable $token. Diese ist meiner Meinung nach überflüssig weil du doch den Token in der Variablen $_SESSION["token"] hast.

Die Prüfung mit dem IF-Block dürfte (so wie ich es verstehe) auch falsch sein. Du prüfst auf den Wert $_POST["token"] aber du solltest prüfen ob der Submit-Button angeklickt wurde -> $_POST["submit"].

Wobei ich irgendwo im Hinterkopf eine Erinnerung daran habe das es manchmal Probleme gibt wenn der Submit-Button den Namen "submit" hat!?

Wenn ich da jetzt was falsche verstehe, dann erkläre bitte nochmal was jetzt klappt und was nicht.

Die zusätzliche Variable ist in dem Fall trivial, den ob er nun das Input-Feld direkt durch die Session-Variable befüllt oder mit einer nirmalen Variablen is "gehupft wie gehechtelt..."

Die Prüfung ist in Ordnung so, da er ja in seinem Formular den Token explizit in einem Hidden-Filed übergibt. Also wird dieser auch per POST übergeben. Klar wäre es besser auf ein bestimmtes Element im Formular zu prüfen, aber dieses ist so gesehen auch egal, solange es ein eindeutiges Feld ist und nirgendwo anders auch übergeben wird.

Mit Problemen duch den Namen des Submit-Button hab ich noch nicht gehört, auch nicht selber feststellen können.
 
Die zusätzliche Variable ist in dem Fall trivial, den ob er nun das Input-Feld direkt durch die Session-Variable befüllt oder mit einer nirmalen Variablen is "gehupft wie gehechtelt..."

Von der Funktion her ist es natürlich egal ob man eine zusätzliche Variable einbaut oder nicht.

Generell kann man sich aber leichter verschreiben oder Variablen vertauschen je mehr es davon gibt. Deshalb mein "Einwand".
 
Ja, die Variable $token ist nicht wirklich notwendig das stimmt, man kann genauso gut $_SESSION["token"]; direkt ins Input Feld setzen.

Aber was mich immer noch stört ist, das wenn ich 2 php Seiten habe in der einen das Formular mit Token Generierung in der anderen Seite die Verarbeitung von Token und Formular, dann verhindert das ein erneutes Senden des Formulars weil der Token beim erneuten Senden nichtmehr übereinstimmt.

Wenn ich das aber hier bei meiner Index.php mit Includierter Seite mache dann funktioniert ein erneutes Senden ohne Probleme weil das Formular immer mitübermittelt (weils ja im Prinzip ein und diesselbe Seite ist für Generierung des Tokens und Verarbeitung).

Ist das Sicherheitstechnisch gesehen schlimm oder kann ich so auch CSRF / XSRF Attacken erschweren ?
 
Dann mache doch eine separate Datei die "nur" die Token-Funktion enthält.

Diese Datei/Funktion includierst du dann überall da wo die sie brauchst.
 
Hmm also ich hab gestern mal die Token Funktion per Include und Include_once includiert, am eigentlichen Problem ändert sich aber leider nichts.

Das Formular ist über dem Seiteninclude im Quellcode. Includiere ich die Tokenfunktion über dem Formular ändert sich nichts, includiere ich darunter geht die Übermittlung nicht weil noch kein Token erzeugt ist.

Ich weiß jetzt nicht wie du das meinst mit dem Include. @ Tombe
 
Zurück