Cookies of Session?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Gurdt Hooghoudt

Gurdt Hooghoudt

06/06/2011 17:17:40
Quote Anchor link
Hallo PHP Hulp,

Ik heb een vraag ik ben momenteel bezig met een website waar mensen zich kunnen aanmelden en berichten naar elkaar kunnen sturen met een eigen profiel etc.

Maar goed, de site is opgebouwd als je ingelogd bent herkend hij wie je bent door middel van cookies $_COOKIE['gebruikersnaam'] maar je kan je cookie wijzigen in firefox en als ik dan de cookie wijzig naar een andere gebruiker op de site kan ik zo overal in zijn profiel en dat is uiteraard niet helemaal de bedoeling.

Heb het ook proberen op telossen met $_COOKIE['gebruikersnaam'] tevervangen door $_GET['gebruikersnaam'] maar op een of andere manier werkt dat niet echt.. Heeft iemand enig idee hoe ik dit veilig kan oplossen?

Alvast bedankt!
Gewijzigd op 08/06/2011 17:08:58 door Gurdt Hooghoudt
 
PHP hulp

PHP hulp

19/04/2024 20:02:58
 
Thomas de vries

thomas de vries

06/06/2011 17:40:52
Quote Anchor link
Het werken met sessies. is in dit geval beter. dan met cookie.
 
Gurdt Hooghoudt

Gurdt Hooghoudt

06/06/2011 18:37:33
Quote Anchor link
Ja maar het probleem is als ik na het inloggen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
echo $_GET['gebruikersnaam'];
doe, laat hij geen gebruikers naam zien, komt dat door dat ik mijn from op post heb?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
          <form method="post">
           <table>
           <tr>
             <td><input name="gebruikersnaam" type="text" title="Gebruikersnaam"></td>
           </tr>
           <tr>
             <td><input type="password" name="wachtwoord" title="Password"></td>
             <td><input type="submit" name="login" value="Log in"></td>
           </tr>
           </table>
           </form>
Gewijzigd op 06/06/2011 18:38:22 door Gurdt Hooghoudt
 
- SanThe -

- SanThe -

06/06/2011 18:43:13
Quote Anchor link
Dat lijkt mij inderdaad wel logisch.
 
Thomas de vries

thomas de vries

06/06/2011 18:43:49
Quote Anchor link
Nee daar heeft het niet mee te maken.
Als je een sessie maakt dan moet je hem er ook zo uithalen.

Voorbeeld
Met een form log je in als je de form gavalideerd hebt maak je een sessie aan dus zo
$_SESSION['gebruikersnaam'] = hier de gebruikersnaam vanuit de database.

Het weergeven is dan als volgt

echo $_SESSION['gebruikersnaam'];
 
Dennis meijer

dennis meijer

06/06/2011 18:44:41
Quote Anchor link
Ja omdat je post hebt kun je hem niet met get opvangen..

Maar als je $_GET hebt krijg je de naam in je url te zien en kun je hem ook vervagnen volgens mij...

Beter is zoals Thomas zegt met sessions te werken want die kan niemand veranderen volgens mij...
 
Thomas van den Bulk

Thomas van den Bulk

06/06/2011 18:45:19
Quote Anchor link
ik denk wel dat het te maken heeft omdat hij post gebruik ipv get thomas...
 
Thomas de vries

thomas de vries

06/06/2011 18:52:25
Quote Anchor link
Sorry Thomas
Maar hij wil niet met $_GET het formulier gaan vullen.
Hij heeft een inlog formulier die na het inloggen toegaat.
Als je daar method="get" van maakt dan krijg je het in de url te zien.

En dus zijn probleem heeft niks te maken met het formulier.
Zie na het inloggen.
Dus eerst formulier invullen dan inloggen.
En dan gebruikersnaam ophalen met echo $_SESSION['gebruikernsaam'].


Edit het kan ook dat ie zijn form gewoon rechstreeks in de URL wil zetten.
En dan de $_GET['gebruikersnaam'] daar uit wil halen.

Maar gezien zijn eerste Topic zie ik dat niet daar maakt de TS'er een cookie.
Gewijzigd op 06/06/2011 18:55:58 door thomas de vries
 
Thomas van den Bulk

Thomas van den Bulk

06/06/2011 18:59:37
Quote Anchor link
ja hij vroeg zich af waarom hij de gebruikersnaam niet kon uitlezen, en of dat komt doordat hij $_GET gebruikt ipv $_POST, en jij zegt dat dat niet zo is, dat bedoelde ik meer ;)
 
- Ariën  -
Beheerder

- Ariën -

06/06/2011 19:02:09
Quote Anchor link
je kan SESSION's gebruiken, maar wat ik heb gedaan is bij het inlogggen twee cookies aanmaken: userID en hash.
De waardes van deze cookies moeten in de database beiden overeenkomen met elkaar, en in dat geval geeft de inlog-check-functie 'true' door.
 
Thomas de vries

thomas de vries

06/06/2011 19:04:49
Quote Anchor link
offTopic
hoezo misscommunicatie hier ;)

Ontopic

Maak ipv cookie's Sessies dat werkt beter en veiliger.
Denk ook aan mysql_real_escape_string
 
Gurdt Hooghoudt

Gurdt Hooghoudt

08/06/2011 10:44:44
Quote Anchor link
Allereerst super bedankt voor de reacties, heb even zitten kijken hoe het precies werkt met Sessions ik ben nog geen exper in php haha.

Maar ik krijg het nog niet voor elkaar ik zal even de login script posten tot hoever ik hem heb (werkend maar wel met COOKIES.)
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
<?php     $sqll = "SELECT gebruikersnaam, wachtwoord FROM leden WHERE gebruikersnaam='".addslashes($_POST['gebruikersnaam'])."'";
    $sqll = mysql_query($sqll);
    $sql  = mysql_fetch_assoc($sqll);

    if(empty($_POST['gebruikersnaam'])) {
      echo '<p>U heeft geen gebruikersnaam ingevoerd.</p>';
      exit();
    }

    else if(empty($_POST['wachtwoord'])) {
      echo '<p>U heeft geen wachtwoord ingevoerd.</p>';
      exit();
    }

    else if($sql['wachtwoord'] != md5($_POST['wachtwoord'])) {
      echo '<p>Uw wachtwoord klopt niet.</p>';
      exit();
    }

    else {
    setcookie("gebruikersnaam", $_POST['gebruikersnaam']);
    setcookie("wachtwoord", md5($_POST['wachtwoord']));
    setcookie("ip", $_SERVER['REMOTE_ADDR']);
    
    echo '<p>U bent succesvol ingelogd.</p>';
    echo '<meta http-equiv="refresh" content="1;URL='.$websiteurl.'" />';
    exit();
    }
?>


Form:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
    <?php      echo '
          <form method="post">
           <table>
           <tr>
             <td><input name="gebruikersnaam" type="text" title="Gebruikersnaam"></td>
           </tr>
           <tr>
             <td><input type="password" name="wachtwoord" title="Password"></td>
             <td><input type="submit" name="login" value="Log in"></td>
           </tr>
           </table>
           </form>
          '
;?>


Alleen als ik bijvoorbeeld alleen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $_POST['gebruikersnaam']; ?><


Doet laat hij ook niets zien..
Gewijzigd op 08/06/2011 10:45:20 door Gurdt Hooghoudt
 
Erik van de Locht

Erik van de Locht

08/06/2011 10:54:39
Quote Anchor link
Cookies benader je niet met $_POST maar met $_COOKIE.
Als je sessions gebruikt moet je bovenaan voordat je uitput gaat genereren de functie session_start() aanroepen.

Even over het eerste script wat je net gepost hebt:
Je voert eerst de query uit, en vervolgens ga je pas controleren of er iets ingevuld is?
Gebruik mysql_real_escape_string() en niet addslashes(). Maak ook een nette foutafhandeling (kijk op php.net/functienaam naar wat de functie mysql_query enzo als returnwaarde hebben).
Je manier van errors is een beetje apart. Als iemand niets in vult krijgt hij eerst alleen de melding 'U heeft geen gebruikersnaam ingevoerd.' te zien. Als hij dan wel een gebruikersnaam invult krijgt hij alleen de melding 'U heeft geen wachtwoord ingevoerd.' te zien. So on and so forth. Een handigere manier zou zo iets zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$errors
= array();
if (empty($_POST['gebruikersnaam'])) {
  $errors[] = 'U heeft geen gebruikersnaam ingevoerd.';
}

if (empty($_POST['wachtwoord'])) {
  $errors[] = 'U heeft geen wachtwoord ingevoerd.';
}

$lijst_met_errors = implode('<br />', $errors);
echo $lijst_met_errors;
?>
 
Gurdt Hooghoudt

Gurdt Hooghoudt

08/06/2011 11:04:12
Quote Anchor link
Bedankt voor je snelle reactie Erik,

heb nu
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 $sqll = "SELECT gebruikersnaam, wachtwoord FROM leden WHERE gebruikersnaam='".addslashes($_POST['gebruikersnaam'])."'";
    $sqll = mysql_query($sqll);
    $sql  = mysql_fetch_assoc($sqll);
    

    $errors = array();
    if (empty($_POST['gebruikersnaam'])) {
    $errors[] = 'U heeft geen gebruikersnaam ingevoerd.';
    }

    if (empty($_POST['wachtwoord'])) {
    $errors[] = 'U heeft geen wachtwoord ingevoerd.';
    }

    else if($sql['wachtwoord'] != md5($_POST['wachtwoord'])) {
      echo '<p>Uw wachtwoord klopt niet.</p>';
    }

    $lijst_met_errors = implode('<br />', $errors);
    echo $lijst_met_errors;
    else {
    setcookie("gebruikersnaam", $_POST['gebruikersnaam']);
    setcookie("wachtwoord", md5($_POST['wachtwoord']));
    setcookie("ip", $_SERVER['REMOTE_ADDR']);
    
    echo '<p>U bent succesvol ingelogd.</p>';
    echo '<meta http-equiv="refresh" content="1;URL='.$websiteurl.'" />';
    exit();
    }
?>


Maar dan zegt dreamweaver dat er een fout in zit op de regel van de tweede else na echo $lijst_met_errors; (Regel 18)

Heb ook al de regel waar hij de wachtwoord controleerd weg gehaald omdat ik dacht misschien kan je maar een keer Else gebruiken maar dat was het ook niet..
Gewijzigd op 08/06/2011 11:10:33 door Gurdt Hooghoudt
 
Arjan -

Arjan -

08/06/2011 12:52:53
Quote Anchor link
- Geef niet aan de gebruiker aan of de gebruikersnaam danwel het wachtwoord onjuist is. Houd het algemeen, zodat kwaadwillenden niet kunnen achterhalen of de gebruikersnaam wel correct is ingevuld.
- Het beste is, zoals Aar al aangaf, niet de gebruikersnaam in een cookie op te slaan, maar de user_id in combinatie met een random hash (dus ook niet het gehashte wachtwoord). Gebruik het wachtwoord van de gebruiker alleen om diegene te laten inloggen. De user id en random hash gebruik je dan op iedere pagina om te controleren of iemand is ingelogd.
- En gebruik een salt voor het hashen van je wachtwoord. Hierdoor worden simpele wachtwoorden als "hallo" toch erg moeilijk om te kraken doordat een moeilijk te achterhalen string voor, danwel na, het wachtwoord wordt geplaatst (zie voorbeeld hieronder).

Hieronder heb ik een opzetje gemaakt (even snel in elkaar geflanst, dus er kunnen kleine foutjes inzitten):

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

if($_SERVER['REQUEST_METHOD'] == 'POST') {

    $errors = array();

    if(!isset($_POST['gebruikersnaam']) OR !isset($_POST['wachtwoord']) OR trim($_POST['wachtwoord']) == '' OR trim($_POST['wachtwoord']) == '') {
        $errors[] = 'U hebt uw gegevens niet volledig ingevuld!';
    }
else {
    
        $salt = 'j&21Hkas#k$JakW'; // WILLEKEURIGE STRING (NIET VERANDEREN WANNEER DE WEBSITE LIVE IS)
        
        $wachtwoord_hash = sha1($salt.$_POST['wachtwoord']);
        
        $sql = mysql_query("SELECT id, gebruikersnaam FROM tabel WHERE gebruikersnaam = '".mysql_real_escape_string($_POST['gebruikersnaam'])."' AND wachtwoord = '".$wachtwoord_hash."' LIMIT 1");
        
        if($sql) {
            
            if(mysql_num_rows($sql) > 0) {
                
                $user_data = mysql_fetch_assoc($sql);
                
                $random_hash = sha1($salt.uniq_id(mt_rand(), true)); // EEN RANDOM HASH DIE JE IN EEN SESSIE OF COOKIE KAN STOPPEN. DEZE DIEN JE DAN OOK IN DE DATABASE BIJ DE BETREFFENDE GEBRUIKER TE PLAATSEN ZODAT HET GEVERIFIEERD KAN WORDEN (ZOALS HIERONDER)
                
                $sql_update = mysql_query("UPDATE tabel SET hash = '".$random_hash."' WHERE id = ".$user_data['id']);
                
                if($sql_update) {
                
                    // HIER COOKIE en / of SESSIE AANMAKEN INCLUSIEF DE USER ID EN DE RANDOM HASH
                    
                    echo 'U bent succesvol ingelogd onder de naam: '.$user_data['gebruikersnaam'];
                    
                }
else
                    $errors[] = 'Er is een fout opgetreden tijdens het aanmaken van een sessie!';
                
                
            }
else
                $errors[] = 'Uw gebruikersnaam en / of wachtwoord zijn onjuist!';
        
        }
else
            $errors[] = 'Er is een fout opgetreden bij het opvragen van uw gegevens!';
    
    
    }

    
    
    if(is_array($errors) AND count($errors) > 0) {
        
        foreach($errors AS $error) {
        
            echo $error.'<br />';
        
        }
    
    }


}


?>
Gewijzigd op 09/06/2011 17:24:12 door Arjan -
 
Gurdt Hooghoudt

Gurdt Hooghoudt

08/06/2011 15:17:26
Quote Anchor link
Thanks voor je hulp Arjan,

Maar ik heb de script even zitten kopiëren en plakken.
Maar ik zie dat er gebruik wordt gemaakt van Hash en Salt, maar is dit een andere manier van wachtwoorden omzetten?

Want ik maak nu gebruik van md5 wachtwoorden hoe zet ik dit om want ik heb het script nu wel werkend maar als ik me eigen probeer in teloggen geeft hij aan dat er iets niet klopt en ik denk zelf dat dat komt door de wachtwoord omdat die in de database met MD5 is gemaakt.. hoe los ik dit op ?

Toevoeging op 08/06/2011 15:33:53:

ik heb even zitten prutsen maar volgens mij klopt er meer niet want ik heb mijn wachtwoord gesalt en in de database ingevoerd maar werkt niet.. als ik inlog zegt hij nog steeds dat er iets niet klopt..

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
  $hashwachtwoord
= sha1($salt.'12345678');
  echo 'Hash='. $hashwachtwoord .'<br>'
?>
 
Gurdt Hooghoudt

Gurdt Hooghoudt

09/06/2011 15:36:51
Quote Anchor link
Hmm ik kom er nog steeds niet uit, wie kan mij uit de brand helpen :)
 
Arjan -

Arjan -

09/06/2011 16:48:36
Quote Anchor link
Een salt moet je zien als een string voor je wachtwoord. Dit wil zeggen dat je daadwerkelijke wachtwoord bijvoorbeeld "mijnwachtwoord" wordt veranderd in 8&238&@^*#87mijnwachtwoord.

Hierdoor is het relatief eenvoudige wachtwoord nu opeens zeer moeilijk te kraken. Wanneer je dit wachtwoord hasht, door middel van sha1, dan is dit een veilige manier om je wachtwoorden op te slaan.

Bij de controle wanneer iemand wil inloggen zal je dus dezelfde salt moeten gebruiken om te controleren of het wachtwoord klopt. Dit snap je hopelijk?

En in mijn script heb ik het zo gemaakt dat bij het inloggen een random hash wordt gegenereerd die gebruikt wordt voor de authentificatie (de controle of iemand is ingelogd). Hier komt dus geen wachtwoord meer aan te pas. Het wachtwoord van de gebruiker gebruik je alleen om de gebruiker te laten inloggen.

Wanneer je dus md5 gehashte wachtwoorden in je database hebt staan zal mijn code niet goed werken. Je dient uiteraard ook deze wachtwoorden te voorzien van dezelfde salt en een sha1 hash. Want je kan begrijpen dat bij een controle deze nooit overeen komen wanneer je verschillende hash technieken gebruikt....

Wat snap je precies nog meer niet of is het zo duidelijk?
Gewijzigd op 09/06/2011 16:50:19 door Arjan -
 
Gurdt Hooghoudt

Gurdt Hooghoudt

09/06/2011 17:06:03
Quote Anchor link
Ik heb het gevonden, hij
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php if(!isset($_POST['gebruikersnaam']) OR !isset($_POST['wachtwoord']) OR trim($_POST['wachtwoord']) == '' OR trim($_POST['wachtwoord']) != '') { ?>


OR trim($_POST['wachtwoord']) != '' moest weg.

Daarna kreeg ik een melding over een type fout die heb ik er nu ook uitgehaald.
Maar voor de rest wat moet ik nu doen om een veilige sessie testarten, met het ID en random hash?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php                 $lidid = mysql_query("SELECT id FROM leden WHERE gebruikersnaam = '".mysql_real_escape_string($_POST['gebruikersnaam'])."' AND wachtwoord = '".$wachtwoord_hash."' LIMIT 1");
                $hash = mysql_query("SELECT hash FROM leden WHERE gebruikersnaam = '".mysql_real_escape_string($_POST['gebruikersnaam'])."' AND wachtwoord = '".$wachtwoord_hash."' LIMIT 1");

                $_SESSION['id'] = $lidid;
                $_SESSION['hash']   = $hash;
?>
Gewijzigd op 09/06/2011 17:10:43 door Gurdt Hooghoudt
 
Arjan -

Arjan -

09/06/2011 17:26:52
Quote Anchor link
Excuus, het moest trim($_POST['wachtwoord']) == '' zijn.

Die random hash sla je op in de database bij de juiste gebruiker (hetgeen ik dus al gedaan heb).

Ook sla je de hash in de sessie op, inclusief de user id. Ook is het handig om tijdens het inloggen het ipadres op te slaan en deze ook telkens te controleren. Wanneer deze niet overeenkomt dan is het 99% zeker dat je sessie gehijackt is.

De random hash en user id (en eventueel ook het ipadres) controleer je vervolgens op elke pagina waar je ingelogd dient te zijn met de gegevens in de database.

Bijvoorbeeld (verwerkt in mijn vorige 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
63
64
<?php
session_start();

if($_SERVER['REQUEST_METHOD'] == 'POST') {

    $errors = array();

    if(!isset($_POST['gebruikersnaam']) OR !isset($_POST['wachtwoord']) OR trim($_POST['wachtwoord']) == '' OR trim($_POST['wachtwoord']) == '') {
        $errors[] = 'U hebt uw gegevens niet volledig ingevuld!';
    }
else {
    
        $salt = 'j&21Hkas#k$JakW'; // WILLEKEURIGE STRING (NIET VERANDEREN WANNEER DE WEBSITE LIVE IS)
        
        $wachtwoord_hash = sha1($salt.$_POST['wachtwoord']);
        
        $sql = mysql_query("SELECT id, gebruikersnaam FROM tabel WHERE gebruikersnaam = '".mysql_real_escape_string($_POST['gebruikersnaam'])."' AND wachtwoord = '".$wachtwoord_hash."' LIMIT 1");
        
        if($sql) {
            
            if(mysql_num_rows($sql) > 0) {
                
                $user_data = mysql_fetch_assoc($sql);
                
                $random_hash = sha1($salt.uniq_id(mt_rand(), true)); // EEN RANDOM HASH DIE JE IN EEN SESSIE OF COOKIE KAN STOPPEN. DEZE DIEN JE DAN OOK IN DE DATABASE BIJ DE BETREFFENDE GEBRUIKER TE PLAATSEN ZODAT HET GEVERIFIEERD KAN WORDEN (ZOALS HIERONDER)
                
                $sql_update = mysql_query("UPDATE tabel SET hash = '".$random_hash."', ipadres = INET_ATON('".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."') WHERE id = ".$user_data['id']);
                
                if($sql_update) {
                
                    // HIER COOKIE en / of SESSIE AANMAKEN INCLUSIEF DE USER ID EN DE RANDOM HASH
                    $_SESSION['user_id'] = $user_data['id'];
                    $_SESSION['user_hash'] = $random_hash;
                    
                    
                    echo 'U bent succesvol ingelogd onder de naam: '.$user_data['gebruikersnaam'];
                    
                }
else
                    $errors[] = 'Er is een fout opgetreden tijdens het aanmaken van een sessie!';
                
                
            }
else
                $errors[] = 'Uw gebruikersnaam en / of wachtwoord zijn onjuist!';
        
        }
else
            $errors[] = 'Er is een fout opgetreden bij het opvragen van uw gegevens!';
    
    
    }

    
    
    if(is_array($errors) AND count($errors) > 0) {
        
        foreach($errors AS $error) {
        
            echo $error.'<br />';
        
        }
    
    }


}


?>
Gewijzigd op 09/06/2011 17:30:01 door Arjan -
 
Gurdt Hooghoudt

Gurdt Hooghoudt

09/06/2011 17:28:35
Quote Anchor link
Phoe, mijn excuses maar ik heb me script nu echt helemaal over hoop liggen..
Kan ik jou misschien in een prive bericht even de hele pagina sturen, want nu heb ik het cookie gedeelte er nog half in zitten :$..
 

Pagina: 1 2 volgende »



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.