Homepage » Tutorials » PHP & MySQL » Beveiligen van sessies
Beveiligen van sessies
| Info | ||||
| Door: | indianajames | Moeilijkheidsgraad: | ![]() |
|
| Views: | 7.115 | Reacties: | 4(Bekijken) | |
| Log in om zelf te reageren | ||||
| Waardering: | ||||
De meeste gevorderde, maar ook beginnende PHP scripters kennen allemaal sessies. Bijna alle inlog-systemen die geschreven worden in PHP gebruiken op één of andere manier sessies voor het behouden van informatie over de gebruiker tussen opeenvolgende HTTP-verzoeken.
Deze standaard-extensie op PHP lijkt perfect voor het bijhouden van allerhande tijdelijke data. En dat is ook zo, zolang het veilig gebeurd! Deze tutorial leert je iets over twee (hacker-)aanvallen die gebruik maken van onveilig gescripte sessies, nl. sessie-fixatie en sessie-hijacking.
Sessie fixatie
Het gebruik van een sessie begint met de functie session_start() waardoor een sessie voor de betreffende gebruiker aangemaakt wordt. Een identifier wordt gegenereerd om de gebruiker te identificeren bij zijn verdere bezoek van de site. Deze identifier draagt meestal "PHPSESSID" als naam, maar dit kan aangepast worden in de php.ini. Deze unieke identifier wordt bij een volgend server-verzoek in de vorm van een cookie of GET-argument meegegeven en identificeert op die manier de gebruiker.
En daarin zit hem het gevaar, want dit opent de mogelijkheid om deze identificatie-string manueel te kiezen. Maak hiervoor gewoon een link naar de site die je wil testen op deze aanval:
| # | Code |
1 | <a href="http://www.voorbeeldsite.be/index.php?PHPSESSID=2605">Ga |
Wanneer een gebruiker de voorbeeldsite op deze manier bezoekt, wordt de server geforceert om als identifier 2605 te gebruiken! Bij het bezoeken van de url kan een mailtje de aanvaller op de hoogte stellen. Hij bezoekt dan de voorbeeldsite met dezelfde sessie identifier en heeft op die manier toegang tot de account van diegene die de link klikte!
De bescherming hiertegen is vrij eenvoudig. De functie session_regenerate_id() zorgt ervoor dat de identifier voor de sessie gewijzigd wordt, bv. van 2605 naar 3095940. De aanvaller kan nu niet langer gebruik maken van de voor hem bekende sessie identificatie-string.
Zoals eerder vermeld, kan je ook de naam voor de session identificatie-string wijzigen in de php.ini wat het instellen via GET bemoeilijkt. Let erop dat dit sessie fixatie bemoeilijkt, maar zeker niet verhindert!
Sessie hijacking
Buiten het zelf opleggen van een sessie-id, kan een hacker de sessie identificatie-string ook op andere manieren te weten komen, bv door het analyseren/onderscheppen van netwerkverkeer.
In de beveiliging voorkomen we het onderscheppen van de identificatie-string niet, maar voeren we extra controles in om ervoor te zorgen dat het HTTP verzoek van de bezoeker kan onderscheiden worden van dat van de hacker.
Dit kan oa. door het analyseren van de $_SERVER globale variabele. Controleer of de 'user-Agent' header dezelfde blijft tussen opeenvolgende bezoeken. Het is onwaarschijnlijk dat een bezoeker opeens van browser veranderd midden in een bezoek. Ook 'remote_addr' kan je helpen bij het identiferen van een hacker. Deze $_SERVER variabele geeft je het ip-adres van de bezoeker en deze is hoogstwaarschijnlijk verschillend voor de bezoeker en aanvaller.
In feite kunnen nog meerder $_SERVER variabelen gebruikt worden, een overzichtje kan je vinden op: http://be.php.net/manual/en/reserved.variables.php
Voorbeeld:
| # | Code |
1 | if ( ($_SESSION['user-agent'] == $_SERVER['HTTP_USER_AGENT']) |
Besluit
Het zou je nu duidelijk moeten zijn, dat sessies niet waterdicht zijn. Aandachtig en verstandig gebruik van sessies is noodzakelijk om geen grote beveiligingsrisico 's te doen ontstaan.
| 4 reacties | |
| kokx | |
![]() Nieuwsposter |
@20cent: Mischien een idee om bij registratie ergens dit ervoor zetten: Schakel IP controle uit (Pas op! Dit is onveiliger!) |
| indianajames | |
![]() Moderator |
De server variabelen kunnen je helpen in het oplossen van het probleem, maar iedere situatie is uniek. In het geval van proxies hebben meerdere computers idd hetzelfde ip-adres. De user-agent kan steeds gebruikt worden, voor het ip-adres kan je dit best combineren met andere variabelen. Zo kan je bv. zoeken op verschillen in een combinatie van parameters, wat de nauwkeurigheid verbeterd. De tutorial introduceert principes en het is aan de lezer om er wat mee te doen! Maar natuurlijk heb je gelijk. Aanvullingen en details heb ik weggelaten om de structuur overzichtelijk te houden. |
| 20cent | |
![]() Regular |
Mensen die gebruik maken van AOL kunnen per pagina die ze bezoeken een ander IP-adres hebben (of ten minste zo ziet het er uit). Aol surfers sturen requests naar een proxy-server en die zendt dan hun request verder. Dat doet die proxy voor honderden, misschien wel duizenden gebruikers. Deze mensen hebben dan allemaal hetzelfde zichtbare IP-adres. AOL heeft zijn proxy-servers zo geconfigureerd dat ze requests van eenzelfde client roteert over verschillende proxyservers en zo kan het zichtbare IP-adres per pagina die de client bezoekt anders zijn. ik vrees dat mijn uitleg een beetje chinees-nederlands is, maar je begrijpt vast welwat ik bedoel. |
| Grubolsch | |
![]() Moderator |
Dat van Sessie fixatie wist ik nog niet, knap werk! |
Pagina 1
Om te reageren moet je ingelogd zijn.
Nog niet geregistreerd? Doe dat dan nu!
Check je domein...
Websitemaken wordt gehost door Nucleus.be




