Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Cookie-Fehler bei manchen(?) Netzwerken

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Cookie-Fehler bei manchen(?) Netzwerken

    Hey Leute,

    ich habe mir eine eigene Session Klasse geschrieben, die folgendermassen funktioniert:

    Der Nutzer bekommt einen Cookie mit der ID 'ID' erstellt der einen 32stelligen Zufalls-String enthält, diese ID wird dann zusammen mit der Nutzerip und den gewünschten Sessiondaten (Account-ID, aktuelle Seite, etc.) in einer Tabelle gespeichert.

    Funktioniert wunderbar auf meinem XAMPP zu Hause und auf meinem Testwebspace, wenn ich allerdings von meinem Uni-Netzwerk (oder einem Hotelnetzwerk) darauf zugreifen will, wird mit jedem Seitenaufruf eine neue Session generiert.
    Der Browser bekommt den Cookie übermittelt, es scheint an der Rückübermittlung beim Seitenaufruf zu scheitern.

    Woran könnte das liegen?

    Hier der verantwortliche Auszug aus meiner Klasse:

    PHP-Code:
    class Session {

        public 
    $user false;
        public 
    $lang 0;
        public 
    $langKey;
        public 
    $langName;
        public 
    $mail;
        public 
    $time;
        
        function 
    __construct() {
        
            
    $this->time time();
        }

        function 
    start() {
        
            if(isset(
    $_COOKIE['ID'])) {

                
    $session sqQuery('SELECT `user`, `language`, `permanent` FROM `session` WHERE `ID`=\'' sqEsc($_COOKIE['ID']) . '\' AND `IP`=\'' ip2long($_SERVER['REMOTE_ADDR']) . '\' LIMIT 1;');
                if(
    $user $session->fetch_row()) {
                
                    if(
    $user[2]) {
                    
                        
    setcookie('ID'$_COOKIE['ID'], $this->time 259200'/');
                    
                    } else {
                    
                        
    setcookie('ID'$_COOKIE['ID'], $this->time 3600'/');
                    }
                
                    
    sqQuery('UPDATE `session` SET `time`=\'' $this->time '\' WHERE `ID`=\'' sqEsc($_COOKIE['ID']) . '\' AND `IP`=\'' ip2long($_SERVER['REMOTE_ADDR']) . '\';'); 
                    if(
    $user[0] != null) {
                    
                        
    $user sqQuery('SELECT `ID`, `mail`, `language` FROM `user` WHERE `ID`=' $user[0] . ';');
                        if(
    $user $user->fetch_row()) {
                        
                            
    $this->user $user[0];
                            
    $this->mail $user[1];
                            
    $this->lang $user[2];
                            
                        } else {
                        
                            
    $this->renew();
                        }
                        
                    } else {
                    
                        
    $this->lang $user[1];
                    }
                
                } else {

                    
    $this->renew();
                }

            } else {

                
    $this->renew();
            }
            
            
    $language sqQuery('SELECT `name`, `key` FROM `language` WHERE `ID`=\'' $this->lang '\';');
            if(
    $language $language->fetch_row()) {
            
                
    $this->langName $language[0];
                
    $this->langKey $language[1];
            
            } else {
            
                
    $this->setLanguage(LANGUAGE);
            }
        }

    #......

        //create a new, unique session ID
        
    protected function renew() {
        
            
    //set language
            
    if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
            
                
    $language sqQuery('SELECT `ID` FROM `language` WHERE `key`=\'' sqEsc(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 02)) . '\' LIMIT 1;');
                if(
    $language $language->fetch_row()) {

                    
    $language $language[0];
                
                } else {

                    
    $language LANGUAGE;
                }
                
            } else {
            
                
    $language LANGUAGE;
            }

            
    //find open session id
            
    $ID rndString();
            
    $session sqQuery('SELECT `user` FROM `session` WHERE `ID`=\'' $ID '\' AND `IP`=\'' ip2long($_SERVER['REMOTE_ADDR']) . '\' LIMIT 1;');
            while(
    $session->num_rows 0) {
            
                
    $ID rndString();
                
    $session sqQuery('SELECT `user` FROM `session` WHERE `ID`=\'' $ID '\' AND `IP`=\'' ip2long($_SERVER['REMOTE_ADDR']) . '\' LIMIT 1;');
            }
            
            
    sqQuery('INSERT INTO `session` (`ID`, `IP`, `time`, `language`) VALUES (\'' $ID '\', \'' ip2long($_SERVER['REMOTE_ADDR']) . '\', \'' $this->time '\', \'' $language '\');');
            
    setcookie('ID'$ID$this->time 3600'/');
        } 
    Grüße & Danke für die Hilfe!
    ?!? Woot Woot...


  • #2
    Sorry, aber wofür baut man Sessions nach, wenn man dann doch nur Cookies benutzt? Na jedenfalls ist die Frage anhand des Klassencodes wohl kaum zu beantworten.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Zitat von nikosch Beitrag anzeigen
      Sorry, aber wofür baut man Sessions nach, wenn man dann doch nur Cookies benutzt?
      Meine Lösung dafür alles schön bequem in der DB stehen zu haben... geht bestimmt auch anders.

      Btw was genau meinst du mit nur Cookies? Gibt es noch einen anderen Weg Sessions eindeutig zu identifizieren?

      Zitat von nikosch Beitrag anzeigen
      Na jedenfalls ist die Frage anhand des Klassencodes wohl kaum zu beantworten.
      Anhand welcher Informationen wäre sie denn zu beantworten?
      ?!? Woot Woot...

      Kommentar


      • #4
        Liegt vermutlich daran, dass deine Klasse versucht eine Session an eine bestimmte IP festzunageln.


        Gesendet von meinem iPhone mit Tapatalk

        Kommentar


        • #5
          Zitat von Blar Beitrag anzeigen
          Liegt vermutlich daran, dass deine Klasse versucht eine Session an eine bestimmte IP festzunageln.k
          Den Verdacht hatte ich erst auch, aber in der Tabelle für die Session-Infos sieht das dann z.B so aus:
          Code:
          [ID]					[IP]				[user]	[time]
          s1hyoywnhe5ycqw8u2pcjfwv040t0sos 	2147483647 	0 	NULL	0 	1400942414
          6tt6ojmiruiys8o0skot7jxtmga2jlk9 	2147483647 	0 	NULL	0 	1400942414
          s5supa4c2cufj1h0qb8ojyfx7mu1rxqs 	2147483647 	0 	NULL	0 	1400942363
          a6hxrlhj1s63moskgz6rdyugr9kphppx 	2147483647 	0 	NULL	0 	1400942363
          Man sieht genau dass die IP sich nicht ändert aber bei jedem reload ein neue ID vergeben wird (eine neue Spalte erzeugt wird).
          ?!? Woot Woot...

          Kommentar


          • #6
            Bin gerade über den Thread gestolpert und dachte ich poste einfach mal die Lösung des Rätsels (hätte mir eigentlich auch viel früher auffallen können).

            Für ein signed int feld ist 2147483647 der höchste Wert, d.h. sollte ip2long eine größere Nummer ausgegeben haben wurde immer 127.255.255.255 als IP in die Tabelle geschrieben.

            Das ist zufälligerweise für die Deutsche Telekom immer gut geangen, da die IPs relativ "niederwertig" sind, für mein Uni-Netzwerk hats dann eben nicht mehr gereicht!
            ?!? Woot Woot...

            Kommentar


            • #7
              Oder du nimmst das unsigned integer equivalent und speicherst das in die Datenbank.

              PHP-Code:
              $ip sprintf('%u'ip2long('200.0.0.10'));

              echo 
              ip2long($ip); // 200.0.0.10 
              Besser aber du lässt das MySQL oder einer Datenbank deiner Wahl machen ( pgSQL ? ), MySQL 5.5+ kann das auch für IPv6 Adressen. Du solltest nur nicht vergessen das die Speicherung der long-Repräsentation zwingend in einem unsigned integer stattfinden sollte ( IPv4 Adressen ) oder generell in einem VARBINARY(16) da nur diese die binär Repräsentation einer IPv6 Adresse fassen können.

              inet6_aton in den jeweiligen Datenbank-Dokumentationen bringen dich ein Stück weiter, PHP kann das auch, aber den Aufwand kannst du durchaus in die Datenbank auslagern sofern sie das kann. Range checks php seitig solltest du in PHP durchführen.
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar

              Lädt...
              X