session & salt werking [leren]

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Arno Bleek

Arno Bleek

26/04/2014 12:06:37
Quote Anchor link
Beste,

ik ben PHP aan het leren, ik probeer nu de werking van $_SESSION en SALT te leren.
Ik heb nu iets geschreven klein stukje wilde graag weten of de codering hiervan juist is en/of dat het anders beter had gekunt.
Dat het veilig is is voor mij ook heel erg belangrijk.
Dit is puur om te zien of ik het wel onder de knie heb.

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
<?php
session_start();

    $nick = '';
    $salt = 'strooimijdoorhetwachtwoord';
    
    //Pretending as this is the DB data
    $nickname = 'Naampje';
    $ps = 'topsecret';
        // Dit is puur om de $ps met $salt te mengen.
    $nickpass = sha1($salt . $ps);

    //If the session is set on 'logged_in' load header();
if (isset($_SESSION['logged_in'])) {
    header('Location: succes.php');
    }
else {
    
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        
        $nick = trim($_POST['nick']);
        $wachtwoord = sha1 ($salt . $_POST['pass']);
            
        if($nick == $nickname && $wachtwoord == $nickpass){
        $_SESSION['logged_in'] = true;
        $_SESSION['nickname'] = $nick;
        header('Location: succes.php');
        }
else {
        echo 'Nickname/Password not correct!';
        }

    }
}

?>

<form method="POST">
    <input type="text" name="nick" value="Naampje">
    <input type="password" name="pass" value="topsecret">
    <button>Send</button>
</form>
 
PHP hulp

PHP hulp

01/11/2024 00:52:36
 
- SanThe -

- SanThe -

26/04/2014 12:19:14
Quote Anchor link
Wat mij direct opvalt is dat je eerst diverse vars aanmaakt die ongebruikt blijven als er al is ingelogd. Beetje zinloos extra werk lijkt mij. Je kan regel 4 t/m 11 net zo goed op regel 19 zetten waarbij regel 4 ook nog eens overbodig wordt.
Gewijzigd op 26/04/2014 12:19:47 door - SanThe -
 
Wouter J

Wouter J

26/04/2014 12:22:36
Quote Anchor link
Laten we eerst beginnen met wat algemene PHP tips:
- Probeer netjes in te springen, dat maakt je code veel makkelijker te lezen. Spring bijv. elke regel na de { met 4 spaties in en ga na een } weer terug. Dan krijg je dus zoiets:
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
<?php
session_start();

$nick = '';
$salt = 'strooimijdoorhetwachtwoord';
    
//Pretending as this is the DB data
$nickname = 'Naampje';
$ps = 'topsecret';
// Dit is puur om de $ps met $salt te mengen.
$nickpass = sha1($salt . $ps);

//If the session is set on 'logged_in' load header();
if (isset($_SESSION['logged_in'])) {
    header('Location: succes.php');
}
else {    
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $nick = trim($_POST['nick']);
        $wachtwoord = sha1 ($salt . $_POST['pass']);

        if($nick == $nickname && $wachtwoord == $nickpass){
            $_SESSION['logged_in'] = true;
            $_SESSION['nickname'] = $nick;
            header('Location: succes.php');
        }
else {
            echo 'Nickname/Password not correct!';
        }
    }
}

?>

- Je hebt nu een grote mix van engels en nederlands, zowel in de comments als in de variabele namen. Probeer consistent te zijn en maar 1 taal te gebruiken voor alles in je applicatie.
- Gebruik <input type="submit" value="Send" /> ipv het <button> element om een formulier te versturen.

Dan de veiligheid, je hebt de salt door, alleen nog wat andere dingen:
- Regel 8 tot 11 horen in een database thuis. Sla nooit het plain wachtwoord op zonder salt.
- sha1 is een niet echt veilig hashing algoritme. Het beste is om de, ietwat moeilijk om te gebruiken in PHP, bcrypt algoritmes te gebruiken. Als je het toch simpel wilt houden is een hoge sha, zoals sha256 aangeraden.
- Je bepaalt nu of iemand is ingelogd door een simpele sessie "logged_in". Dat betekend dat zodra ik in mijn browser die sessie aanmaakt op een andere manier, ik direct ben ingelogd op je site (zonder het inlogformulier gebruikt te hebben!). Dat is natuurlijk erg gevaarlijk. Het beste wat je kunt doen is een unieke hash creëren tijdens het inloggen. Bijv. met het gebruik van sha1 en uniqid (sha1 is hier wel geschikt voor, sinds het kraken hier niet heel veel opbrengt en het lekker snel is). Deze unieke hash sla je dan op in de "logged_in" sessie en in de database. Op elke pagina kijk je of de "logged_in" sessie bestaat en of hash die daarin zit overeen komt met die in de database. Zo ja => user is ingelogd, zo nee => niet ingelogd/hacker.
 
Arno Bleek

Arno Bleek

26/04/2014 12:56:29
Quote Anchor link
Bedankt voor deze uitleg, ja regel 4 t/m 11 is voor nu om zonder een database aan de slag te gaan (moet database nog leren).

Nou heb ik even naar de uniqid gekeken, hoe laat ik die precies dan werken met
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$_SESSION sha1(uniqid)


Want nu weet ik dat als ik in file succes.php check op
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if ($_SESSION['logged_in'])
dat ik ben ingelogd

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
session_start();

if (isset($_SESSION['logged_in'])){
    echo 'Welkom '.    $_SESSION['nickname'].', Goed je bent ingelogd!';
    unset($_SESSION['logged_in']);
    } else {
    echo 'Je bent niet welkom hier!';
}    


hoe geef ik
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$_SESSION['logged_in']
een uniqid i.p.v
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$_SESSION['logged_in'] = true

Of moet ik de uniqid plaatsen i.p.v de 'logged_in', hoor graag hier over.
 
- SanThe -

- SanThe -

26/04/2014 13:06:26
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$_SESSION
['...'] = uniqid();
?>
 
Willem vp

Willem vp

26/04/2014 13:08:51
Quote Anchor link
Je maakt in dit script gebruik van een vaste salt. Security-technisch betekent dat, dat je net zo goed geen salt kunt gebruiken.

Als je echt veilig bezig wilt zijn, genereer je voor elk wachtwoord een unieke salt. Ook wanneer een gebruiker zijn wachtwoord wijzigt, zou de salt moeten veranderen.
 
Arno Bleek

Arno Bleek

26/04/2014 13:17:48
Quote Anchor link
@-SanThe-, hoe moet ik dit in succes.php checken wat ik nu heb is;
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$_SESSION['logged_in'] = sha1(uniqid());
in de index.php

en in succes.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

<?php

session_start();

if (isset($_SESSION['logged_in'])){
    echo 'Welkom '.    $_SESSION['nickname'].', Goed je bent ingelogd!';
    unset($_SESSION['logged_in']);
    }
else {
    echo 'Je bent niet welkom hier!';
}
    


?>

is dit de juiste manier ?

@Willem vp , hmm ik dacht dat salt veilig was als niemand weet wat de $salt value is of heb ik het mis ?
Zal dus meer moeten lezen over de salt dan, ik zag overigens wel iets met rand();
Maar zo ver ben ik nog niet, moet nog heeeel veel leren.
 
- SanThe -

- SanThe -

26/04/2014 13:21:57
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
if (isset($_SESSION['logged_in']) and $_SESSION['logged_in'] == het_uniqid()_in_de_database){
?>
 
Willem vp

Willem vp

26/04/2014 13:38:12
Quote Anchor link
Quote:
ik dacht dat salt veilig was als niemand weet wat de $salt value is of heb ik het mis ?

Een salt is eigenlijk een extra beveiliging voor het geval iemand je database met gecrypte wachtwoorden kan inzien. Als twee personen hetzelfde (ongecrypte) wachtwoord hebben, zal de hash-functie ook dezelfde gecrypte string opleveren. Wanneer je het wachtwoord van de eerste persoon weet, kun je dus aan de gecrypte versie zien dat het wachtwoord van de andere persoon hetzelfde is.

Wanneer je voor iedereen dezelfde salt gebruikt, verandert hier niets aan. Gebruik je echter voor iedereen een andere salt, dan zal in bovenstaand geval voor beide gebruikers het gecrypte wachtwoord anders zijn. Je zal dan dus voor beide gebruikers afzonderlijk het wachtwoord moeten zien te kraken. Het maakt dan eigenlijk niet uit of de salt wel of niet geheim is.
Gewijzigd op 26/04/2014 13:39:01 door Willem vp
 
Arno Bleek

Arno Bleek

26/04/2014 15:47:48
Quote Anchor link
@- SanThe - , ik heb geen database, moet het nog leren.

@Willem vp, dankjewel voor deze nuttige informatie zo had ik het echter niet bekeken. Ik zal me er meer in verdiepen.


Iemand die me wel netter kan uileggen hoe ik de uniqid() kan gebruiken met de sessie i.p.v alleen codes (Ik ben in de leerfase).
 
Dos Moonen

Dos Moonen

26/04/2014 15:52:39
Quote Anchor link
Goede resource die je kan gebruiken bij het verdiepen: https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords
 



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.