Juiste manier voor controleren sessie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mui ter

Mui ter

30/10/2010 10:41:58
Quote Anchor link
Is onderstaand de juiste manier om te controleren of een sessie niet gehacked is?

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
<?php
// niet ingelogd
if(!isset($_SESSION['user_id']))
{

    // Niet ingelogd
}
    
// controle op sessie
elseif(isset($_SESSION['user_id']) && ($_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'] || $_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']))
{

    // Fout in sessie
}

// ingelogd kantoor
elseif(isset($_SESSION['user_id']) && $_SESSION['user_type'] == 'kantoor')
{

    // User kantoor
}

// ingelogd werkplaats
elseif(isset($_SESSION['user_id']) && $_SESSION['user_type'] == 'werkplaats')
{

    // User werkplaats
}
else
{
    // Sessie niet compleet
}
?>
Gewijzigd op 30/10/2010 10:42:45 door Mui ter
 
PHP hulp

PHP hulp

16/11/2019 22:29:37
 
Pim -

Pim -

30/10/2010 11:28:36
Quote Anchor link
Je kan beter niet controleren op IP, dit kan veranderen tijden de sessie. Als je het echt veilig wil hebben, kan je bij elke request de session id veranderen.
 
- SanThe -

- SanThe -

30/10/2010 14:40:12
Quote Anchor link
Pim - op 30/10/2010 11:28:36:
Je kan beter niet controleren op IP, dit kan veranderen tijden de sessie.


Leg eens uit.
 
Thomas de Roo

Thomas de Roo

30/10/2010 17:07:10
Quote Anchor link
Ik weet niet of het echt van toepassing is,
maar je zou ook een encrypted password mee kunnen geven in de sessie en controleren of het id en het wachtwoord bij elkaar horen.
 
Karl Karl

Karl Karl

30/10/2010 17:10:28
Quote Anchor link
Thomas de Roo op 30/10/2010 17:07:10:
Ik weet niet of het echt van toepassing is,
maar je zou ook een encrypted password mee kunnen geven in de sessie en controleren of het id en het wachtwoord bij elkaar horen.


Nope.
Wachtwoord gebruik je alleen bij inloggen om te kijken of de correcte gebruiker inlogt.
 
Pim -

Pim -

30/10/2010 17:16:30
Quote Anchor link
@SanThe
Precies zoals ik zeg: van gebruikers bij oa grote bedrijven kan tijdens het browsen het IP adres veranderen.
 
- SanThe -

- SanThe -

30/10/2010 17:20:03
Quote Anchor link
Pim - op 30/10/2010 17:16:30:
@SanThe
Precies zoals ik zeg: van gebruikers bij oa grote bedrijven kan tijdens het browsen het IP adres veranderen.


Na uitloggen/inloggen, maar niet zomaar tijdens het internetten.
 
Pim -

Pim -

30/10/2010 18:41:10
 
Brandon Cooper

Brandon Cooper

30/10/2010 20:06:47
Quote Anchor link
Via een proxy met meerdere adressen, kan het bij grote bedrijven zoals Pim al zei, altijd voorkomen dat je bij de volgende pagina die je opvraagt, via een ander IP adress naar buiten gaat, dan gaat dit systeem de fout in.
 
Jasper hoi

jasper hoi

30/10/2010 21:11:35
Quote Anchor link
@pim en @bas,
er zijn meer dan genoeg systemen die de optie hebben om een sessie aan een ip te binden.
Ik zou in z'n geval eerder zo iets gebruiken:
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
<?php

/**
 * @author Jasper
 * @copyright 2010 vanOeffelHaarlem
 */

//alleen voor debugging nooit zo online zetten!

ini_set('display_errors', 'On');
error_reporting(E_ALL);


$user_types = array('kantoor', 'werkplaats');

session_name('cookienaam');//gebruik een andere naam voor de cookie dan de standaard php naam

if(!session_start()){
    exit("Er is een fout opgetreden in het programma");
}


/**
 * sessie tijd instellen
 */

if (!isset($_SESSION['timeout_idle'])) {
    $_SESSION['timeout_idle'] = time() + MAX_IDLE_TIME;
}

else {
    if ($_SESSION['timeout_idle'] < time()) {  
        //destroy session
    } else {
        $_SESSION['timeout_idle'] = time() + MAX_IDLE_TIME;
    }
}

    
if(!isset($_SESSION['user_id']) || !in_array($_SESSION['user_type'], $user_types)){
    session_destroy(); //vernietig alle sessie data
    session_regenerate_id(); //maak een nieuwe session
    exit("Niet ingelogd"); //of verkeerd ingelogd
}
    
/**
 * controleer op user agent van de client en kijk of het SID door de server is aangemaakt.
 */

if (($_SERVER['HTTP_USER_AGENT'] != $_SESSION['PREV_USERAGENT']) || (!isset($_SESSION['SERVER_GENERATED_SID'])) ) {
    session_destroy(); //vernietig alle sessie data
    session_regenerate_id(); //maak een nieuwe session
}

?>
 
Tim Kampherbeek

Tim Kampherbeek

30/10/2010 22:27:32
Quote Anchor link
Ik zet er zelf altijd een 'hash' in.

Zo druk ik bij het inloggen een code genaamt hash in de database en maak een sessie an, ik vergelijk of de sessie overkomt als met die van de gekoppelde user in de database. Komen deze 2 niet overeen dan is een van de sessies veranderd.
 
Mui ter

Mui ter

31/10/2010 12:01:16
Quote Anchor link
Bedankt voor jullie hulp, ik heb het vertaald naar het volgende:

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
<?php

$user_types
= array('kantoor', 'werkplaats');

// start session
if(!session_start())
{

    exit("Er kan geen session worden gestart");
}


//gebruik een andere naam voor de cookie dan de standaard php naam
session_name('what_ever');

// controleer of de user gebruikt maakt van dezelfde user agent als bij voorgaande request en accepteer alleen door server gegenereerde SID's
if ($_SERVER['HTTP_USER_AGENT'] != $_SESSION['PREV_USERAGENT']) || !isset($_SESSION['SERVER_GENERATED_SID'])
{

    session_destroy();
}


if(!isset($_SESSION['user_id']) || !in_array($_SESSION['user_type'], $user_types))
{

    exit("Niet of verkeerd ingelogd");
}


// generate nieuwe sessie id
session_regenerate_id();
$_SESSION['SERVER_GENERATED_SID'] = true;
$_SESSION['PREV_USERAGENT'] = $_SERVER['HTTP_USER_AGENT'];
    
// ingelogd als kantoor
if(isset($_SESSION['user_id']) && $_SESSION['user_type'] == 'kantoor')
{

    // User kantoor
}

// ingelogd als werkplaats
elseif(isset($_SESSION['user_id']) && $_SESSION['user_type'] == 'werkplaats')
{

    // User werkplaats
}
else
{
    exit("Geen informatie beschikbaar");
}

?>


Kan iemand het instellen van de sessie tijd nader uitleggen?
 
Joren de Wit

Joren de Wit

31/10/2010 12:32:44
Quote Anchor link
Let erop dat session_destroy() niet de inhoud van de superglobal $_SESSION beïnvloedt. Deze zul je zelf nog handmatig moeten unsetten aangezien ze anders gewoon nog beschikbaar zijn in dit script.

Wat betreft de levensduur van een sessie, daar heb je geen invloed op aangezien dat in php.ini bepaald wordt. Je kunt dus niet zoals met een cookie een expiration time aangeven...
 
Jasper hoi

jasper hoi

31/10/2010 12:44:58
Quote Anchor link
Waarom zou je altijd dit doen in het script?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
// generate nieuwe sessie id
session_regenerate_id();
$_SESSION['SERVER_GENERATED_SID'] = true;
$_SESSION['PREV_USERAGENT'] = $_SERVER['HTTP_USER_AGENT'];
?>

Dat wil je hoog uit doen als je denkt dat iemand fout is ingelogd?

En je bent op regel 15 twee haakjes vergeten.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
//fout
if ($_SERVER['HTTP_USER_AGENT'] != $_SESSION['PREV_USERAGENT']) || !isset($_SESSION['SERVER_GENERATED_SID']){}
//moet dit zijn:
if (($_SERVER['HTTP_USER_AGENT'] != $_SESSION['PREV_USERAGENT']) || (!isset($_SESSION['SERVER_GENERATED_SID'])) ) {}

?>
Gewijzigd op 31/10/2010 12:46:06 door jasper hoi
 
Mui ter

Mui ter

31/10/2010 15:14:17
Quote Anchor link
Blanche PHP op 31/10/2010 12:32:44:
Let erop dat session_destroy() niet de inhoud van de superglobal $_SESSION beïnvloedt. Deze zul je zelf nog handmatig moeten unsetten aangezien ze anders gewoon nog beschikbaar zijn in dit script.

Ok, thx. Dus session_unset(); toevoegen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
// generate nieuwe sessie id
session_regenerate_id();
$_SESSION['SERVER_GENERATED_SID'] = true;
$_SESSION['PREV_USERAGENT'] = $_SERVER['HTTP_USER_AGENT'];
?>

Heb ik uit de wiki http://en.wikipedia.org/wiki/Session_fixation
Gewijzigd op 31/10/2010 15:15:25 door Mui ter
 
Joren de Wit

Joren de Wit

31/10/2010 21:04:55
Quote Anchor link
Mui ter op 31/10/2010 15:14:17:
Ok, thx. Dus session_unset(); toevoegen.

Nee, juist niet. Zie php.net:

Quote:
If $_SESSION (or $HTTP_SESSION_VARS for PHP 4.0.6 or less) is used, use unset() to unregister a session variable, i.e. unset ($_SESSION['varname']);.

Gebruik dus gewoon iets als:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$_SESSION
= array();
?>
 
Mui ter

Mui ter

27/01/2011 20:59:33
Quote Anchor link
Even een wat ouder topic ophalen. Ik ben eindelijk weer verder gegaan met de code echter ik wordt niet ingelogd lijkt het wel. Mijn code is als volgt opgebouwd:

index.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
require('includes/sessions.php');
require('includes/language.php');
require('includes/header.php');
?>


<div id="page">
<div>
<div id="content">
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

                if(!isset($_SESSION['user_id']) || !in_array($_SESSION['user_type'], $user_types))
                {

                    include('includes/user_login.php');
                }

                
                ?>

</div>
</div>
<div style="clear: both;">&nbsp;</div>
</div>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
require('includes/footer.php');
?>


sessions.php
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
<?php
//gebruik een andere naam voor de sessie dan de standaard php naam
session_name('what_ever');

// start session
if(!session_start())
{

    exit("Er kan geen sessie worden gestart");
}


// generate nieuwe sessie id
session_regenerate_id();

$user_types = array('beheerder', 'kantoor', 'werkplaats');

// controleer of de user gebruikt maakt van dezelfde user agent als bij voorgaande request en accepteer alleen door server gegenereerde SID's
if (($_SERVER['REMOTE_ADDR'] != $_SESSION['USER_IP']) || !isset($_SESSION['SERVER_GENERATED_SID']))
{

    session_destroy();
}


// sla variabelen op
$_SESSION['SERVER_GENERATED_SID'] = true;
$_SESSION['USER_IP'] = $_SERVER['REMOTE_ADDR'];

?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

                // gegevens sessie
                        $_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
                        $_SESSION['user_id'] = $row['user_id'];
                        $_SESSION['user_user'] = $row['user'];
                        $_SESSION['user_name'] = $row['naam'];
                        $_SESSION['user_mail'] = $row['email'];
                        $_SESSION['user_type'] = $row['type'];
                        $_SESSION['user_lang'] = $row['language'];?>
 



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.