Sessies, Cookies en Subdomeinen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bas Matthee

Bas Matthee

07/09/2009 12:06:00
Quote Anchor link
Beste mensen, ik heb even een vraag. Ik ben bezig met een website en gebruik daar dynamische subdomeinen (via htaccess en wildcards). Het gaat hier om een profielen-achtige site. Als ik inlog op het ene subdomein (subdomeinnaam = profielnaam zoals hyves) en vervolgens naar een ander subdomein (profiel) ga, dan blijf ik netjes ingelogd. Echter als ik op deze pagina vervolgens uitlog en inlog met andere logingegevens, logt ie me op de juiste manier in, maar wanneer ik dan terugga naar het vorige subdomein, ben ik weer als de vorige user ingelogd. Ga ik weer terug, is het weer andersom. Hoe kan ik zorgen dat bij het uitloggen alle cookies, en dus ook die van de andere subdomeinen, ongeldig worden?

Stukje code loginscript:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
session_start();

ini_set("session.cookie_domain", ".domeinnaam.nl");

include '../../includes/connection.php';
include '../../includes/functions.php';

if (isset($_POST)) {
    
    $profielnaam = mysql_prep($_POST['profielnaam']);
    $wachtwoord = mysql_prep($_POST['wachtwoord']);
    $enc_wachtwoord = sha1($wachtwoord);
    
    if ($profielnaam != 'admin') {
    
        if (!stristr($profielnaam, '@')) { // @ check
        
            $query = "SELECT id FROM profielen WHERE profielnaam = '{$profielnaam}' AND wachtwoord = '{$enc_wachtwoord}' AND actief = 1 LIMIT 1";
            $result_set = mysql_query($query);
            
            if (mysql_num_rows($result_set)) {
            
                $result = mysql_fetch_assoc($result_set);
                
                $_SESSION['profielnaam'] = $profielnaam;
                $_SESSION['wachtwoord'] = $enc_wachtwoord;
                $_SESSION['user_id'] = $result['id'];
                
                setcookie("Login[profielnaam]", $profielnaam, time()+31536000, "/",".domeinnaam.nl");
                setcookie("Login[wachtwoord]", $enc_wachtwoord, time()+31536000, "/",".domeinnaam.nl");
                setcookie("Login[user_id]", $result['id'], time()+31536000, "/",".domeinnaam.nl");
                
                $query = "UPDATE profielen SET laatst_aangemeld = NOW() WHERE id = ".$result['id'];
                mysql_query($query);
                
                $query = "DELETE FROM module_guests_online WHERE ip = '".$_SERVER['HTTP_REFERER']."'";
                mysql_query($query);
                
            
            }
else {
            
                header('Location: ../../info.php?p=fout_login');
                exit;
                
            }

        
            if (isset($_GET['redirect'])) {
                
                header('Location: '.$_SERVER['HTTP_REFERER']);
                
            }
else {
                
                header('Location: http://'.$profielnaam.'. domeinnaam.nl/');
                
            }
            
        
        }
else { // @ check
            
            $query = "SELECT id FROM profielen WHERE profielnaam = '{$profielnaam}' AND wachtwoord = '{$enc_wachtwoord}' AND actief = 1 LIMIT 1";
            $result_set = mysql_query($query);
            
            if (mysql_num_rows($result_set)) {
            
                $result = mysql_fetch_assoc($result_set);
                
                $_SESSION['profielnaam'] = $profielnaam;
                $_SESSION['wachtwoord'] = $enc_wachtwoord;
                $_SESSION['user_id'] = $result['id'];
                
                setcookie("Login[profielnaam]", $profielnaam, time()+31536000, "/",".domeinnaam.nl");
                setcookie("Login[wachtwoord]", $enc_wachtwoord, time()+31536000, "/",".domeinnaam.nl");
                setcookie("Login[user_id]", $result['id'], time()+31536000, "/",".domeinnaam.nl");
                
                $query = "UPDATE profielen SET laatst_aangemeld = NOW() WHERE id = ".$result['id'];
                mysql_query($query);
                
                header('Location: http://'.$profielnaam.'. domeinnaam.nl/');
                
            }
else {
            
                header('Location: ../../info.php?p=fout_login');
                exit;
                
            }
            
        }
        
    }
else {
    
        if ($enc_wachtwoord == sha1('fotosh!!t_123')) {

            $_SESSION['profielnaam'] = $profielnaam;
            $_SESSION['wachtwoord'] = $enc_wachtwoord;
            $_SESSION['user_id'] = 'admin';
                
            setcookie("Login[profielnaam]", $profielnaam, time()+31536000, "/",".domeinnaam.nl");
            setcookie("Login[wachtwoord]", $enc_wachtwoord, time()+31536000, "/",".domeinnaam.nl");
            setcookie("Login[user_id]", 'admin', time()+31536000, "/",".domeinnaam.nl");

            header('Location: ../../stats.php');
            
        }
else {
            
            header('Location: ../../info.php?p=fout_login');
            exit;
                
        }
        
        
    
    }

}

?>


Stukje code logoff script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
    session_start();
    
    ini_set("session.cookie_domain", ".domeinnaam.nl");

    $_SESSION = array();

    session_destroy();
    
    //setcookie("Login", '', time()-3600);
    setcookie("Login[profielnaam]", '', time()-3600, "/",".domeinnaam.nl");
    setcookie("Login[wachtwoord]", '', time()-3600, "/",".domeinnaam.nl");
    setcookie("Login[user_id]", '', time()-3600, "/",".domeinnaam.nl");
        
    header("Location: ".$_SERVER['HTTP_REFERER']);
?>


Stukje Cookie login welke op iedere pagina terugkomt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
if (isset($_COOKIE['Login']) && !isset($_SESSION['user_id'])) {
    
    if ($_COOKIE['Login']['profielnaam'] != 'admin') {
    
        $query = "SELECT id FROM profielen WHERE actief = 1 AND id = ".$_COOKIE['Login']['user_id'];
        $result = mysql_query($query);
        
        if (mysql_num_rows($result)) {
        
            $_SESSION['user_id'] = $_COOKIE['Login']['user_id'];
            $_SESSION['wachtwoord'] = $_COOKIE['Login']['wachtwoord'];
            $_SESSION['profielnaam'] = $_COOKIE['Login']['profielnaam'];
            
            $query = "UPDATE profielen SET laatst_aangemeld = NOW() WHERE id = ".$_SESSION['user_id'];
            mysql_query($query);
            
            $query = "DELETE FROM module_guests_online WHERE ip = '".$_SERVER['REMOTE_ADDR']."'";
            mysql_query($query);
        
        }
    
    }
else {
    
        $_SESSION['user_id'] = $_COOKIE['Login']['user_id'];
        $_SESSION['wachtwoord'] = $_COOKIE['Login']['wachtwoord'];
        $_SESSION['profielnaam'] = $_COOKIE['Login']['profielnaam'];
        
    }
    
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Bas Matthee
 
PHP hulp

PHP hulp

22/12/2024 21:32:32
 
Kitty N

kitty N

07/09/2009 13:16:00
Quote Anchor link
Misschien moet je in je uitlog scipt nog session_unset() gebruiken?
 
Bas Matthee

Bas Matthee

07/09/2009 13:25:00
Quote Anchor link
Ik denk persoonlijk dat het met de cookies te maken heeft, want als ik uitlog, ben ik wel uigelogd op dat ene domein, maar zodra ik een eerder bekeken subdomein bezoek ben ik weer ingelogd. Heb het idee dat ie voor ieder subdomein een cookie aanmaakt..
 
Bas Matthee

Bas Matthee

08/09/2009 09:04:00
Quote Anchor link
bump?
 
Hipska BE

Hipska BE

08/09/2009 09:13:00
Quote Anchor link
bij het inloggen geef je aan setcookie dit als domein mee: ". domein.nl"

Vanwaar die spatie? Ik denk dat dit de reden is dat hij het niet neemt en daardoor vastbijt op die ene subdomein..
 
- Ariën  -
Beheerder

- Ariën -

08/09/2009 09:43:00
Quote Anchor link
Even ene kristische vraag:

Waarom sla je het pasword op in een cookie en in een sessie? Lijkt me echt nergens voor nodig.
 
Bas Matthee

Bas Matthee

08/09/2009 09:47:00
Quote Anchor link
Over de hele site gebruik ik session variabelen voor m'n loginchecks. De cookies gebruik ik alleen om de user in te loggen wanneer deze op de site komt.

btw, de spatie komt doordat ik mijn domeinnaam ff heb gereplaced alvorens het hier te posten. In het script dat ik gebruik komen die spaties niet voor. (foutje dus tijdens posten hier) - Scherp
 
- Ariën  -
Beheerder

- Ariën -

08/09/2009 09:51:00
Quote Anchor link
Dan heb je een wachtwoord echt niet in je cookies/sessies nodig hoor.
Of je doet iets extreems fout ;)
Gewijzigd op 01/01/1970 01:00:00 door - Ariën -
 
Bas Matthee

Bas Matthee

08/09/2009 10:03:00
Quote Anchor link
OK, ga ik daar ff naar kijken, maar dan is mijn eigenlijke probleem nog niet mee opgelost. ;)
 
Bas Matthee

Bas Matthee

14/09/2009 11:41:00
Quote Anchor link
bump?
 
Bas Matthee

Bas Matthee

16/09/2009 13:50:00
Quote Anchor link
Ok, ik ben na wat debuggen tot de ontsdekking gekomen dat het niet aan de cookies ligt, maar aan de sessies. De cookie wordt netjes ongeldig gemaakt voor alle subdomeinen, maar de sessie blijven wel per subdomein bestaan. Gekgenoeg zou na $_SESSION = array(); alles weg moeten zijn, maar dat geldt alleen voor het subdomein waar ik op dat moment ben. Iemand enig idee hoe ik kan zorgen dat de sessions op overige subdomeinen ook afgesloten/onbruikbaar kunnen worden gemaakt?
 
Bas Matthee

Bas Matthee

01/10/2009 14:46:00
Quote Anchor link
Ok, aangezien niemand hier de oplossing weet, en ik uiteindelijk toch een oplossing heb gevonden, wil ik die graag met jullie delen. Hopelijk heeft iemand hier wat aan!

Om dit te realiseren doe je als volgt:

- maak een tabel met sessies en daarin een veld met random code en een verwijzing naar de usertable
- als iemand is ingelogd maak je een nieuwe sessie met (unieke!) code en die sla je op in een cookie die op t hele domein bereikbaar is (.domeinnaam.nl)
- tijdens het laden van de pagina check je of er een cookie is met de code, probeer die code te matchen en je weet of iemand ingelogd is, en zoja..als wie.
- als iemand uitlogt verwijder je de code uit de database en ben je klaar
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.