Veilig login script, op zoek naar cookie protectie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pong Zor

Pong Zor

24/10/2012 09:24:06
Quote Anchor link
Ik heb ooit eens een login script gemaakt, dat ziet er zo uit:

index.php?actie=verifieren

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
    # Kijken of er al een sessie bestaat
    if(!isSet($_SESSION)){
        session_start();
        session_regenerate_id(true);
    }


Dan kom je uit bij de volgende code:
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
    # Verifieren van inloggegevens
    if(isSet($_GET['actie']) && $_GET['actie'] == 'verifieren'){
            
        # Controleren of de gegevens uit een formulier komen
        if($_SERVER['REQUEST_METHOD'] != 'POST'){
            $error_no_form = true;
        
        # Kijken of alle waarden gevuld zijn
        }else if(isSet($_POST['email']) && $_POST['email'] == '' || isSet($_POST['wachtwoord']) && $_POST['wachtwoord'] == ''){
            $error_gebruiker_wachtwoord = true;            
        }
        # Kijken of er een "geldig" e-mailadres opgegeven is
        else if(!preg_match("/^[A-Za-z0-9._\-]+\@[A-Za-z0-9._\-]+\.[A-Za-z]{2,4}$/", $_POST['email'])){
            $error_email = true;
        }
        # Begin met afhandeling
        else{
        
            # Wachtwoord encrypten
            $wachtwoord = crypt($_POST['wachtwoord'], '$6$rounds=5909$wootsaltforthesecretpassword$');
                
            # Gegevens uit database ophalen.
            $query = sprintf("SELECT * FROM gebruikers WHERE email='%s' AND wachtwoord='%s'",
                mysql_real_escape_string($_POST['email']),
                mysql_real_escape_string($_POST['wachtwoord'])
            );                    
            $resultaat = mysql_query($query, $verbindDatabase) or die("A MySQL error has occurred.<br />Query: " . $query . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());
            $aantalRijen_resultaat = mysql_num_rows($resultaat);     
            $rij = mysql_fetch_assoc($resultaat);    
                
            # Als er geen resultaat is, dan kloppen de gegevens dus niet
            if($aantalRijen_resultaat == 0){        
                $error_verkeerde_gegevens = true;
            }
            
            # Anders kloppen de gegevens wel
            else{
                # Inlog hash genereren, combinatie van browser + ip adres
                $hash = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']);

                # Gebruiker_id en de hash in een sessie knallen
                $_SESSION['gebruiker_id'] = $rij['gebruiker_id'];
                $_SESSION['hash'] = $hash;
                
                # Als de hash niet leeg is en ook niet overeenkomt met de gegeneerde hash, dan kan het zijn dat je vanaf een andere locatie ingelogd bent, b.v. PC thuis/ PC werk
                if($rij['secret_hash'] != '' && $rij['secret_hash'] != $hash){
                    $error_loggedin = true;
                }
                # Anders log je op dit moment van de plek in waar je eerder ook ingelogd bent geweest
                else{
                    # Nieuwe hash in de database zetten om te zorgen dat deze goed staat
                    $query_update_sorteervolgorde = sprintf("UPDATE gebruikers SET secret_hash='%s' WHERE gebruiker_id='%s'",
                        mysql_real_escape_string($hash),
                        mysql_real_escape_string($rij['gebruiker_id'])
                    );
                    mysql_query($query_update_sorteervolgorde, $verbindDatabase) or die("A MySQL error has occurred.<br />Query: " . $query_update_sorteervolgorde . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());        
                    
                    $succes_login = true;
                }                
            }
        }
    }


Uiteindelijk haalt hij dan op deze manier de gebruiker op:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
    # Gebruiker selecteren aan de hand van sessie gebruiker id en sessie hash
    if(isSet($_SESSION['gebruiker_id']) && isSet($_SESSION['hash'])){
        $query = "SELECT * FROM gebruikers WHERE gebruiker_id = '" . $_SESSION['gebruiker_id'] . "' AND secret_hash='" . $_SESSION['hash'] . "'";
        $resultaat = mysql_query($query, $verbindDatabase) or die("A MySQL error has occurred.<br />Query: " . $query . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());    
        $rij = mysql_fetch_assoc($resultaat);    
    }


Vervolgens doe ik dit om een secure pagina te laden
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
if(isSet($rij['gebruiker_id'])){
 echo 'secure page';
}


Ik heb eigenlijk maar wat gedaan, maar hoe veilig is dit? Soms heb ik wel eens als ik een tijdje niks doe ik dat "opeens" uitgelogd ben, dit vind ik eigenlijk vreemd, want in principe controleer ik op browser + ip adres en aangezien deze hetzelfde zijn gebleven zou ik dus ingelogd moeten blijven.

Hoe kan ik dit verbeteren? Kan ik iets met een cookie doen ofzo? Is dat nodig?

Graag wat hulp, ik wil een zo veilig mogelijk script namelijk.
 
Er zijn nog geen reacties op dit bericht.



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.