Formular Token Problem

Starfox2007

Mitglied
Hi zusammen,

Ich habe ein Problem mit dem generierten Token für ein Formular.

Der Token wird mit dem Formular zusammen in meiner Index.php erzeugt und soll dann aber in einer Includierten Seite überprüft werden.

Problem an der Sache ist das ja wenn ich das Formular per POST übermittle sich der Token in der Session inzwischen ändert und nicht mehr verarbeitet werden kann.

PHP:
<?php
     function generateFormToken($form){ 

          $token = md5(uniqid(microtime(), true)); 
          $_SESSION[$form."_token"] = $token; 
          return $token; 
     } 
	 
$token = generateFormToken("form1");
$key = md5(rand(0,99999));	  
?>
  <form action="./index.php?page=search" method="post">
    <div class="searchbar">
      <input type="text" name="search" class="searchfield input" id="searchfield" maxlength="200" alt="Suche... " value="Suche... " onclick="document.getElementById('searchfield').value=''; this.style.color = '#000';" />
     
       <input type="hidden" name="key" value="<?php echo $key; ?>" />
        <input type="hidden" name="token" value="<?php echo $token; ?>" />
    
      <input type="submit" name="submit" class="search-button" value="" />
    </div>
  </form>

Includierte Seite:

PHP:
function verifyFormToken($form) {
	
	if (!isset($_SESSION[$form."_token"])) {
       return false;
	}

    if (!isset($_GET["token"])) {
	   return false;
    }

    if ($_SESSION[$form."_token"] !== $_GET["token"]) {
	   return false;
	}
 
 return true;
}

if (verifyFormToken("form1")) {
// -->
 
Nein, irgendwie hab ichs blöd beschrieben :)

Ich erzeuge ein Session Token auf der Hauptseite für ein Formular, übermittle ich die Seite per POST wird diese ja nochmal neu aufgerufen und damit auch der Code für den Session Token erneut.

Wenn ich den Session Token in einer Includierten Seite erzeuge und in der anderen Includierten Seite verarbeite geht das ganze ja.

Ich brauch aber dieses Formular auf der Hauptseite das ist das Problem.


Index.php

PHP:
.
.
.
 function generateFormToken($form){ 

          $token = md5(uniqid(microtime(), true)); 
          $_SESSION[$form."_token"] = $token; 
          return $token; 
     } 
     
$token = generateFormToken("form1");
$key = md5(rand(0,99999));      
?>
  <form action="./index.php?page=search" method="post">
    <div class="searchbar">
      <input type="text" name="search" class="searchfield input" id="searchfield" maxlength="200" alt="Suche... " value="Suche... " onclick="document.getElementById('searchfield').value=''; this.style.color = '#000';" />
     
       <input type="hidden" name="key" value="<?php echo $key; ?>" />
        <input type="hidden" name="token" value="<?php echo $token; ?>" />
    
      <input type="submit" name="submit" class="search-button" value="" />
    </div>
  </form>
.
.
.
Hier kommt dann erst der Seiteninclude
.
.
 
Zuletzt bearbeitet:
Aber du musst doch nur prüfen ob der Token bereits existiert oder nicht.
Wenn bereits vorhanden und nicht älter als xx Sekunden/Minuten dann ist er noch gültig, andernfalls muss er erst neu erstellt werden.

Aber warum erstellst du ihn auch auf der "Hauptseite". Du weißt doch dann gar nicht ob das Formular überhaupt aufgerufen wird!?
 
Ah, verstehe. Dann musst du den include() für die Prüfung auf jeden Fall vor dem Code erledigen, der den Token neu erzeugt.
 
Ist eh ein bisschen verwirrend.

- Du rufst mit Hilfe der Variablen $token die Funktion auf.

- Dort wird der gleichnamigen Variablen $token dann mit md5 usw. der Wert übergeben.

- Dann wird dieser Wert an eine SESSION-Variable übergeben.

Wenn du jetzt die SESSION-Variable hast, warum arbeitest du dann im Skript mit $token?

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.
 
Ich hab jetzt den Code ganz unten in die Index Seite gestopft und werde das Suchfeld mittels CSS nach oben verfrachten.

Scheint wohl dann zu funktionieren :)

Vielen Dank euch beiden
 
Leider bin ich immer noch nicht weiter,
wenn ich den Code auf der Index.php unter den Include setze bekomme ich das mit CSS nichtmehr richtig angeordnet, weil auch der Div unter dem Include sitzt, selbst mit position:absolute geht da nix.

Was gehen würde, wäre den Token auf der Index.php mit Formular zu erzeugen und dann auf eine komplett neue Seite per Form Action zu leiten die z.b. Search.php heißt.

Problem dabei wäre dann, wenn einer dann auf der Search.php erneut die Suche betätigt müsste erst wieder irgendwie zurück auf die Index.php geleitet werden, da die Search.php ja keine Tokens erzeugt.

Aber, da muss es doch noch eine schönere Lösung geben, wie ist das hier von Tutorials denn gemacht ? da ist die Suche auch ganz oben und Tokens hab ich auch im Quelltext entdeckt :)

Vielleicht weiß das ja einer :)

Ich hoffe Ihr konntet mir folgen, angestrebt ist also ein Suchfeld auf der Index.php ganz oben im Header sitzend was über Token gegen Hacks geschützt ist. Die Ausgabe der Suche soll dann in einer in der Index.php Includierten Seite erfolgen.
 
Zuletzt bearbeitet:
Zurück