Probleme mit session

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme mit session

    Hi!
    Ich bin gerade auf ein Problem mit meinen Session-Daten gestoßen. Und zwar benutze ich folgende Funktion um meine Session-Daten in meine Db zu schreiben:
    PHP-Code:
    function session_handle() {
        if (!
    session_id()) {
            
    session_start();
        }
        
    $query "SELECT * FROM `session` WHERE `sess_id` = '" session_id() . "'";
        
    $result mysql_query($query) or die(mysql_error());
        
    $row mysql_fetch_array($result);
        if (!empty(
    $row)) {
            if (isset(
    $_SESSION['user'])) {
                
    $user $_SESSION['user'];
            }else {
                
    $user "";
            }
            if (
    $row['sess_ip'] != $_SERVER['REMOTE_ADDR']) {    // wenn SESSID vorhanden, aber IP nicht übereinstimmend
                
    return "Sie wurden aus Sicherheitsgründen ausgeloggt";
                
    session_destroy();
                
    session_start();
            }
            
    $query "UPDATE `session` SET `sess_lastactive` = NOW(), 
    `sess_user` = '" 
    $user "', 
    `sess_query_string` = '" 
    $_SERVER['QUERY_STRING'] . "' WHERE `sess_id` = '" session_id() . "'";
            
    mysql_query($query) or die(mysql_error());
        } else {
            if (isset(
    $_SERVER['HTTP_ACCEPT_CHARSET'])) {
                
    $charset $_SERVER['HTTP_ACCEPT_CHARSET'];
            }else {
                
    $charset "";
            }
            echo 
    session_id();
            
    $query "INSERT INTO `session` 
            (`sess_id`, `sess_date`, `sess_lastactive`, `sess_ip`, 
    `sess_http_host` , 
    `sess_http_user_agent` , 
    `sess_http_accept` , 
    `sess_accept_charset` , 
    `sess_accept_language` , 
    `sess_query_string`) VALUES 
            ('" 
    session_id() . "', NOW(), NOW(), 
    '" 
    .$_SERVER['REMOTE_ADDR'] . "', 
    '" 
    $_SERVER['HTTP_HOST'] . "', 
    '" 
    $_SERVER['HTTP_USER_AGENT'] . "', 
    '" 
    $_SERVER['HTTP_ACCEPT'] . "', 
    '" 
    $charset "', '" $_SERVER['HTTP_ACCEPT_LANGUAGE'] . "', 
    '" 
    $_SERVER['QUERY_STRING'] . "')";
            
    mysql_query($query) or die(mysql_error());
        }    
        
    $query "DELETE FROM `session` WHERE DATE_SUB(NOW(), INTERVAL 1 DAY) > `sess_lastactive`";
        
    mysql_query($query) or die(mysql_error());

    Soweit so gut, jedoch wenn ich meine Page online teste, dann schreibt er mir jedesmal 2 Datensätze mit 2 unterschiedlichen Session_id's in die DB. Beide aber mit der gleichen IP und nur 1s versetzt.
    Benutzt wird auch nur die 2., die später erzeugt wurde. Ich versteh jetzt leider nicht, waurm er das nur online macht.
    PHP version: 4.4.2
    MySQL version: 4.0.irgendwas

    EDIT:
    Das Skript wird direkt in der index datei aufgerufen, welche auch für jeden link startpunkt ist.
    D.h. Das Skript wird jedesmal wenn jemand irgendwas auf der page macht durchlaufen.


    EDIT:
    Noch ne neue Erkenntnis: Wenn ich - während ich auf der page bin und bereits eine sess_id habe - den Table leere, dann schreibt er auch nur noch eine Spalte und nimmt nur die aktuelle sess_id
    Zuletzt geändert von Michi1g; 22.06.2006, 17:36.
    DAS Forum für PHP & ähnliches

  • #2
    Hier nochmal der Anfang meiner index datei. Danach werden nur noch ein paar variablen definiert.
    PHP-Code:
    ini_set("session.use_cookies""0");
    ini_set("session.use_trans_sid""0");
    error_reporting(E_ALL);
    include(
    "config/connect.inc.php");
    include(
    "config/functions.php");
    session_handle();
    session_register('login');
    session_register('ip');
    session_register('datetime');
    include(
    "config/constants.php");
    include(
    "sites/content.php");
    include(
    "sites/menu_login.php");
    include(
    "sites/menu_text.php");
    include(
    "sites/menu_pict.php"); 
    DAS Forum für PHP & ähnliches

    Kommentar


    • #3
      Kann mir keiner helfen? Bin langsam echt am verzweifeln!!! Hab jetzt schon alles mögliche probiert... Eigentlich kann er ja gar keine 2. Session anfangen, da session_start() wenn bereits eine Session existiert diese ja nur fortführt, oder?
      Keiner mehr ne Idee wie ich überprüfen könnte wo diese mysteriöse 1. session_id herkommt? Kann es sein, dass er die page irgendwie 2 mal öffnet? Ich merk zwar nichts davon, aber...
      Meine "template" Funktion:
      PHP-Code:
      function gettemplate($template$dir)
      {
      return 
      str_replace("\"","\\\"",implode("",file($dir "/" $template)));
      }
      function 
      dooutput($template) {
      echo 
      $template;

      Ein Link sieht bei mir immer folgendermaßen aus:
      PHP-Code:
      <a href="index.php?dest=irgendwas&PHPSESSID=sess_id...>link</a> 
      Bitte helft mir. Für Fragen stehe ich natürlich gern zur Verfügung.

      Mfg

      Michi
      DAS Forum für PHP & ähnliches

      Kommentar


      • #4
        Ich habe schon gehört, dass Firefox eine Seite 2x aufruft. Sind im Log 2 Aufrufe?

        Kommentar


        • #5
          Hi!
          Welchen Browser man benutzt ist egal... Ich z.B. benutz Opera und da funktionierts genauso wenig wie mit Firefox, oder IE. Den Log kann ich leider nicht einsehen.
          DAS Forum für PHP & ähnliches

          Kommentar


          • #6
            Dein Sessionhandler ist buggy.

            PHP-Code:
            function session_handle() {
                
            // ... zur SID passenden DS lesen
                
            $query "SELECT ... WHERE `sess_id` = '".session_id()."'";
                
            // ... wenns einen gibt
                
            if (!empty($row)) {
                    
            // aber die IP nicht paßt
                    
            if ($row['sess_ip'] != $_SERVER['REMOTE_ADDR']) {
                        
            // so löscht man eine Session nicht vollständig
                        
            session_destroy();
                        
            // neue Session/SID erzeugen
                        
            session_start();
                    }
                    
            // überleg mal, welcher DS hier verändert wird, wenn der User gerade einen
                    // 24h-Disconnect hatte!
                    
            $query "UPDATE `session` SET ... WHERE `sess_id` = '".session_id()."'"
            Zuletzt geändert von onemorenerd; 23.06.2006, 17:34.

            Kommentar


            • #7
              Ich sehe hier trotzdem keine zwei INSERT Befehle und nur entweder UPDATE oder INSERT.. Könnte es sein, dass "gleichzeitig" zwei php-skripte auf die gleiche session id ablaufen, zB durch frames, oder bilder, oder dergleichen? Würde es sich verbessern, wenn output buffering gemacht würde? Ich gehe davon aus, dass die Einträge in der session-tabelle 2 verschiedene autoincrement-ids haben (Frager hat dies überprüft..).

              Ich habe noch nie das Thema race-condition mit sessions gesehen.

              Ich werde das skript noch ausprobieren, aber dies mal theoretisch vorweg.

              Kommentar


              • #8
                Original geschrieben von tcpip
                Ich sehe hier trotzdem keine zwei INSERT Befehle ...
                Ich auch nicht. Wollte nur darauf hinweisen, dass der Sessionhandler "unlogisch" programmiert ist. Das eigentliche Problem der doppelten Einträge verschwindet ja vielleicht von selbst, wenn er den Handler nochmal von Grund auf überdenkt.

                Kommentar


                • #9
                  erstens bekommt man das mit einer race-condition problemlos hin.

                  Beispiel:

                  Code:
                  <iframe src="index.php?q=0&id=A"></iframe>
                  <iframe src="index.php?q=0&id=B"></iframe>
                  Der Parameter q würde noch ein q-sekundiges sleep bewirken. id ist zur Unterscheidung im querystring.
                  Server: Aprelium Abyss X1 (vielfach multithreaded)

                  Wenn man das ein paarmal refreshed, wird alles in die zweite sessionid geschrieben, genau, wie es der Frager gefragt hat.

                  zweitens könnte es im Rest des Codes noch 'wilde' sessionrelevante-Befehle haben, aber das wäre eine kompliziertere Erklärung.

                  Kommentar


                  • #10
                    Ist aber durchaus bekannt, dass es zu Race-Conditions kommen kann (http://de3.php.net/session_set_save_handler (in den Comments), http://bugs.php.net/bug.php?id=12267) bzw. sogar unbedingt kommen muß - diesbezüglich ist PHP einfach ... naja Mist.
                    Unter bestimmten Bedingungen braucht es noch nicht einmal zwei Requests.

                    Kommentar


                    • #11
                      naja, der bug report 12267 ist als "bogus" erledigt. Im set_session_handler habe ich nichts derartiges gefunden.

                      Ich bin gespannt, was der ursprüngliche Poster mitteilt, wie er in die Situation kommt.

                      Kommentar


                      • #12
                        Hi!
                        Danke erst mal für die vielen Antworten, jedoch bin ich bei den "race-conditions" irgendwie ausgestiegen... Kann mir jemand das ganze mal erklären?
                        @onemorenerd:
                        Wie löscht man eine Session vollständig? Was ist denn alles "unlogisch" an meinem Skript? Das mit dem 24h disconnect ist mir auch schon in den Sinn gekommen, hab aber momentan leider nicht die Zeit mir da großartig den Kopf zu zerbrechen...
                        DAS Forum für PHP & ähnliches

                        Kommentar


                        • #13
                          Original geschrieben von Michi1g
                          Hi!
                          Danke erst mal für die vielen Antworten, jedoch bin ich bei den "race-conditions" irgendwie ausgestiegen...
                          Das bedeutet, dass deine index.php gleichzeitig zweimal aufgerufen wird, analog dem Beispiel, wo durch <iframe> meine index.php zweimal, mit verschiedenen Parametern, abläuft.

                          Kommentar


                          • #14
                            Achso... Jetzt hab ichs. Danke.

                            Wüsste aber nicht wie er das machen sollte... Er lädt bei mir am Anfang eigentlich nur die index. php mit ein paar includes, auf denen aber mit sessions gar nichts gemacht wird...
                            Gibt es irgendeine (einfache) Möglichkeit mit der ich die Theorie "race-conditions" prüfen könnte?
                            Logs hab ich so leider keine Einsicht...
                            DAS Forum für PHP & ähnliches

                            Kommentar


                            • #15
                              Multipack zur Auswahl:
                              (1) schau dir die query strings an, und die useragents und die anderen Felder der doppelten Aufrufe.

                              (3) Etwas vague ist ausserdem noch, dass du die $_SERVER['REQUEST_METHOD'] mit speichern sollst und updatest. Kannst Du gerade ins Feld Querystrings machen. Vielleicht bekommst Du einen HEAD request.

                              dh. $_SERVER['REQUEST_METHOD] .' XX '. $_SERVER['QUERY_STRING'] an beiden stellen hinschreiben.

                              (3) Ich verstehe deinen Ausdruck "er lädt mir am Anfang nur die index.php" nicht. Wenn es nicht die extreme Möglichkeit "zweitens" von weiter oben ist, dann wird die index.php zweimal parallel, VOELLIG UNABHAENGIG, von irgendetwas aufgerufen, entweder von deiner webseitengestaltung selber wegen frames, oder um ein Menü anzuzeigen, oder sowas, oder von javascript aus (sollte sich anhand von query string unterscheiden lassen). Oder dann vom Browser, einem Proxy aber da kenn ich mich auch schlecht aus.
                              Zuletzt geändert von tcpip; 24.06.2006, 12:26.

                              Kommentar

                              Lädt...
                              X