tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
21
ZUGRIFFE
703
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    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-Code:
    <?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-Code:
    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")) {
    // --> 
     

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Warum sollte sich die Session-ID plötzlich ändern? Das kann nur passieren, wenn die Session abgelaufen ist. Die Dauer der Session kannst du beeinflussen:

    http://www.php.net/manual/de/functio...kie-params.php

    http://www.php.net/manual/de/session...ookie-lifetime
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    Avatar von tombe
    tombe tombe ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2004
    Ort
    Möglingen (BaWü)
    Beiträge
    3.109
    Die Frage ist auch wo "includet" wird bzw. wann die Funktion zum Prüfen aufgerufen wird.
     
    Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.

    Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.

  4. #4
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    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-Code:
    .
    .
    .
     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
    .
    .
    Geändert von Starfox2007 (10.01.12 um 15:35 Uhr)
     

  5. #5
    Avatar von tombe
    tombe tombe ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2004
    Ort
    Möglingen (BaWü)
    Beiträge
    3.109
    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!?
     
    Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.

    Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.

  6. #6
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    Das Formular ist ein Suchfeld auf der Hauptseite das immer da ist egal welche Seite includiert ist.

    Ein Suchfeld wie hier:

    http://eu.battle.net/d3/de/
    Geändert von Starfox2007 (10.01.12 um 15:50 Uhr)
     

  7. #7
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Ah, verstehe. Dann musst du den include() für die Prüfung auf jeden Fall vor dem Code erledigen, der den Token neu erzeugt.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  8. #8
    Avatar von tombe
    tombe tombe ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2004
    Ort
    Möglingen (BaWü)
    Beiträge
    3.109
    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.
     
    Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.

    Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.

  9. #9
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    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
     

  10. #10
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    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.
    Geändert von Starfox2007 (11.01.12 um 12:38 Uhr)
     

  11. #11
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    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-Code:

    if(isset($_SESSION['token']) && $_SESSION['token'] != ''){
       
    // token existiert
    }else{
       
    // token existiert nicht und muss erstellt werden

     
    Die Schweine von heute sind unsere Schnitzel von morgen!

  12. #12
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    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.
     

  13. #13
    Avatar von tombe
    tombe tombe ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2004
    Ort
    Möglingen (BaWü)
    Beiträge
    3.109
    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.
     
    Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.

    Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.

  14. #14
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    @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-Code:
    <?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-Code:
    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.
    Geändert von Starfox2007 (11.01.12 um 22:21 Uhr)
     

  15. #15
    Avatar von tombe
    tombe tombe ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2004
    Ort
    Möglingen (BaWü)
    Beiträge
    3.109
    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.
     
    Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.

    Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.

Ähnliche Themen

  1. Formular Token Problem
    Von starfoxfs im Forum PHP
    Antworten: 5
    Letzter Beitrag: 20.09.09, 12:33
  2. session token
    Von inspector_71 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 28.10.07, 11:01
  3. Antworten: 4
    Letzter Beitrag: 03.10.07, 02:37
  4. token
    Von benni miles im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 01.04.07, 21:25
  5. ungültiger Token
    Von 123arne im Forum .NET Windows Forms
    Antworten: 3
    Letzter Beitrag: 12.10.05, 13:58