session & salt werking [leren]
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)
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
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>
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>
Gewijzigd op 26/04/2014 12:19:47 door - SanThe -
- 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)
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
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!';
}
}
}
?>
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.
Nou heb ik even naar de uniqid gekeken, hoe laat ik die precies dan werken met
Want nu weet ik dat als ik in file succes.php check op dat ik ben ingelogd
Code (php)
1
2
3
4
5
6
7
8
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!';
}
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 een uniqid i.p.v
Of moet ik de uniqid plaatsen i.p.v de 'logged_in', hoor graag hier over.
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.
in de index.php
en in succes.php
Code (php)
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.
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
@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).