Sessie beveiligen tegen hijacken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jaws

Jaws

19/11/2006 17:24:00
Quote Anchor link
Ik ben al een tijdje bezig met een inlogscript. Ik heb her en der gelezen dat het mogelijk is een sessie te hijacken, door in je headers de sessieid te plaatsen van de persoon die op dat moment legaal in dezelfde sessie zit.

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?
 
PHP hulp

PHP hulp

07/03/2025 22:00:06
 

19/11/2006 17:30:00
Quote Anchor link
Maak een database tabel aan en sla hiering de sessie id en het ip adres op.
Controleer steeds of de combinatie van sessie id en ip nog juist is.
Zoniet:
exit("Jammer, maar deze site is dus wel beveiligd.");
 
Frank -

Frank -

19/11/2006 18:47:00
Quote Anchor link
Zet bij het inloggen het ip-adres in de sessie met behulp van sha1() en een salt. Op alle vervolg pagina's ga je controleren of de hash die in de sessie staat nog steeds gelijk is aan de hash die je op de vervolgpagina's berekent op basis van het ip-adres dat daar wordt gebruikt:
salt.inc.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$salt
= '1w5Rb$l[Pf'; // geheime salt, kun je beter buiten de webroot zetten
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
// bij het inloggen:
require_once('salt.inc.php');

$_SESSION['hash'] = sha1($salt.$_SERVER['REMOTE_ADDR'];
?>

En dan de volgpagina's:
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
<?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
}
?>

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 -
 
Kalle P

Kalle P

19/11/2006 18:49:00
Quote Anchor link
zet geen wachtwoorden e.d. in je session.
 
Frank -

Frank -

19/11/2006 18:52:00
Quote Anchor link
Kalle schreef op 19.11.2006 18:49:
zet geen wachtwoorden e.d. in je session.
Durf je wel? Zo maar met bruut geweld een open deur intrappen? Zeker weer zo'n lompe Amsterdammer! ;)
 
- SanThe -

- SanThe -

19/11/2006 18:57:00
Quote Anchor link
Frank schreef op 19.11.2006 18:52:
Kalle schreef op 19.11.2006 18:49:
zet geen wachtwoorden e.d. in je session.
Durf je wel? Zo maar met bruut geweld een open deur intrappen? Zeker weer zo'n lompe Amsterdammer! ;)

Lol ;-)
 
Paul K

Paul K

19/11/2006 19:30:00
Quote Anchor link
Als je een foutje maakt bij een veld of een text dan kan je gwoon zo de sessies druit halen;)
kijk ook daarma uit
 
Frank -

Frank -

19/11/2006 19:34:00
Quote Anchor link
Paul schreef op 19.11.2006 19:30:
Als je een foutje maakt bij een veld of een text dan kan je gwoon zo de sessies druit halen;)
kijk ook daarma uit
Geef eens een voorbeeldje, ik snap hier niets van.
 
Jaws

Jaws

19/11/2006 20:20:00
Quote Anchor link
Ok thx voor de voorbeelden Frank. Heb alleen nog wat vragen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php $_SESSION['hash'] = sha1($salt.$_SERVER['REMOTE_ADDR']; ?>

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)
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
<?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
}
?>


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
 
Jaws

Jaws

21/11/2006 12:15:00
Quote Anchor link
Laat ik het dan even anders stellen.

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
 
Joren de Wit

Joren de Wit

21/11/2006 12:42:00
Quote Anchor link
Je kunt toch meerdere variabelen in een sessie zetten? Je gebruikt die hash om te controleren of je sessie niet gehackt is en de gebruikersnaam om het voor jou makkelijk te maken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$_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.
 
Frank -

Frank -

21/11/2006 12:52:00
Quote Anchor link
Code gecorrigeerd! Toch maar goed dat er meerdere mensen naar kijken, had de fout zelf namelijk niet gezien en had hem niet getest...
 
Jaws

Jaws

21/11/2006 13:23:00
Quote Anchor link
Het foutje in Franks script was me toevallig ook opgevallen, zie maar mijn post hiervoor in het commentaar van het script ;)

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.
 



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.