Sessie beveiligen tegen hijacken
Maar ik kom er maar niet uit hoe ik dit nou kan oplossen? En als ik dan iets zou hebben weet ik niet hoe ik kan testen of mijn eigen sessie nou wel of niet te hijacken is met het huidige script ;)
Wie kan me een beetje opgang helpen?
Controleer steeds of de combinatie van sessie id en ip nog juist is.
Zoniet:
exit("Jammer, maar deze site is dus wel beveiligd.");
salt.inc.php
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
// bij het inloggen:
require_once('salt.inc.php');
$_SESSION['hash'] = sha1($salt.$_SERVER['REMOTE_ADDR'];
?>
// bij het inloggen:
require_once('salt.inc.php');
$_SESSION['hash'] = sha1($salt.$_SERVER['REMOTE_ADDR'];
?>
En dan de volgpagina's:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
session_start();
require_once('salt.inc.php');
if(isset($_SERVER['REMOTE_ADDR'])){
$check = sha1($salt.$_SERVER['REMOTE_ADDR']);
if(isset($_SESSION['hash']) && $_SESSION['hash'] == $check){
echo 'session is niet gehackt.';
}
else {
die('Er is een fout opgetreden.'); // Wees ze vaag mogelijk! Geen melding is nog beter.
}
}
else {
header('Location: login.php'); // terug naar de login-pagina
exit(); // stop de rest van het script
}
?>
session_start();
require_once('salt.inc.php');
if(isset($_SERVER['REMOTE_ADDR'])){
$check = sha1($salt.$_SERVER['REMOTE_ADDR']);
if(isset($_SESSION['hash']) && $_SESSION['hash'] == $check){
echo 'session is niet gehackt.';
}
else {
die('Er is een fout opgetreden.'); // Wees ze vaag mogelijk! Geen melding is nog beter.
}
}
else {
header('Location: login.php'); // terug naar de login-pagina
exit(); // stop de rest van het script
}
?>
Zet deze check even in een functie, wel zo handig, je hebt hem op iedere beveiligde pagina nodig.
Edit: Code gecorrigeerd n.a.v. opmerking Blanche, bedankt!
Gewijzigd op 01/01/1970 01:00:00 door Frank -
zet geen wachtwoorden e.d. in je session.
Kalle schreef op 19.11.2006 18:49:
Durf je wel? Zo maar met bruut geweld een open deur intrappen? Zeker weer zo'n lompe Amsterdammer! ;)zet geen wachtwoorden e.d. in je session.
Frank schreef op 19.11.2006 18:52:
Kalle schreef op 19.11.2006 18:49:
Durf je wel? Zo maar met bruut geweld een open deur intrappen? Zeker weer zo'n lompe Amsterdammer! ;)zet geen wachtwoorden e.d. in je session.
Lol ;-)
kijk ook daarma uit
Paul schreef op 19.11.2006 19:30:
Geef eens een voorbeeldje, ik snap hier niets van.Als je een foutje maakt bij een veld of een text dan kan je gwoon zo de sessies druit halen;)
kijk ook daarma uit
kijk ook daarma uit
Hier zet je dus een Hash van Sha1 met als combinatie je ip + een salt.
Ik deed dit nu dus met een $_SESSION['user'] = $gebruikersnaam. De gebruikersnaam kwam binnen met $_POST via een form. Ik vond dit handig omdat ik telkens als ik later een query wilde maken ik gewoon iets deed in de trand van "select blablab from tabel where user = '$_SESSION['user']'".
Hoe kan ik dit anders oplossen nu als ik een hash als sessie id gebruik? Of snap ik het niet helemaal?
Dan het stukje erna (zie mijn extra commentaar):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
session_start();
require_once('salt.inc.php');
if(isset($_SERVER['REMOTE_ADDR'])){
$check = sha1($salt.$_SERVER['REMOTE_ADDR']);
if(isset($_SERVER['hash']) && $_SERVER['hash'] == $check){ //Moet dit niet zijn $_SESSION['hash'] ipv. $_SERVER['hash']???
echo 'session is niet gehackt.';
}
else {
die('Er is een fout opgetreden.'); // Wees ze vaag mogelijk! Geen melding is nog beter.
}
}
else {
header('Location: login.php'); // terug naar de login-pagina
exit(); // stop de rest van het script
}
?>
session_start();
require_once('salt.inc.php');
if(isset($_SERVER['REMOTE_ADDR'])){
$check = sha1($salt.$_SERVER['REMOTE_ADDR']);
if(isset($_SERVER['hash']) && $_SERVER['hash'] == $check){ //Moet dit niet zijn $_SESSION['hash'] ipv. $_SERVER['hash']???
echo 'session is niet gehackt.';
}
else {
die('Er is een fout opgetreden.'); // Wees ze vaag mogelijk! Geen melding is nog beter.
}
}
else {
header('Location: login.php'); // terug naar de login-pagina
exit(); // stop de rest van het script
}
?>
En tot slot vroeg ik me af hoe ik die "salt" dan buiten de publieke www map zet? en hoe ik die dan doe includen.
Gewijzigd op 01/01/1970 01:00:00 door Jaws
Nu zet ik de gebruikersnaam in de sessie dus $_SESSION['user'] = $gebruikersnaam. Dit gebeurd pas als ik de gebruikersnaam die ingevoerd werd in het form overeenkomt met de gebruiker-ww combinatie in mijn database.
maar als ik nu, zoals Frank in zijn script laat zien, een hash als Sessie id gebruik dan weet mijn sessie alleen welke hash hij heeft maar niet meer de gebruiker, toch? Hoe kan ik die gebruikersnaam laten meesturen in de sessie? Of is de enige oplossing de Hash in een DB plaatsen met de gebruikersnaam en daarna weer uitlezen voor controle? Ik zou liever niet de DB erbij betrekken alleen als het niet op een andere manier veilig zou kunnen.
Gewijzigd op 01/01/1970 01:00:00 door Jaws
Code (php)
1
2
3
4
2
3
4
<?php
$_SESSION['hash'] = 'je gegenereerde hash';
$_SESSION['user'] = $gebruikersnaam;
?>
$_SESSION['hash'] = 'je gegenereerde hash';
$_SESSION['user'] = $gebruikersnaam;
?>
Wat betreft het script van Frank: er staat nog wel een fout in. De twee $_SERVER's op regel 7 moeten $_SESSION zijn.
Code gecorrigeerd! Toch maar goed dat er meerdere mensen naar kijken, had de fout zelf namelijk niet gezien en had hem niet getest...
Oh Dank u Blanche!
Ik wist niet dat je gewoon meerdere variabelen in een sessie kon plaatsen. Ik denk dat ik het PHPsessie ID verwisselt heb met een gewone variabele. Ben nog niet zo veel bezig geweest met sessies namelijk.
Dan rest me alleen nog die "salt" wat buiten de webroot moet komen te staan.
Welke map kun je daar normaal voor gebruiken als je gewoon een Linux webhoster hebt voor je site? Komt die dan in de private_html map bijv.? Ik neem aan dat ik niet gewoon in het wilde weg een bestandje kan plaatsen in een map.