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

  • StealthXy
    hat ein Thema erstellt [Erledigt] Cookie-Fehler bei manchen(?) Netzwerken.

    [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!

  • tr0y
    antwortet
    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.

    Einen Kommentar schreiben:


  • StealthXy
    antwortet
    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!

    Einen Kommentar schreiben:


  • StealthXy
    antwortet
    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).

    Einen Kommentar schreiben:


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


    Gesendet von meinem iPhone mit Tapatalk

    Einen Kommentar schreiben:


  • StealthXy
    antwortet
    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?

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X