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.
<?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>
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.
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:
<?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 [php]uniqid[/php] (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.
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
$_SESSION sha1(uniqid)
Want nu weet ik dat als ik in file succes.php check op
if ($_SESSION['logged_in'])
dat ik ben ingelogd
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
$_SESSION['logged_in']
een uniqid i.p.v
$_SESSION['logged_in'] = true
Of moet ik de uniqid plaatsen i.p.v de 'logged_in', hoor graag hier over.
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.
@-SanThe-, hoe moet ik dit in succes.php checken wat ik nu heb is;
$_SESSION['logged_in'] = sha1(uniqid());
in de index.php
en in succes.php
<?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.
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.