session id

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Ozzie PHP

Ozzie PHP

04/10/2013 01:15:45
Quote Anchor link
Ola, ik vraag me weer eens wat af.

Een session id bestaat uit 32 karakters. Via de functie session_id kun je de id van een sessie aanpassen. En nu zat ik me ineens af te vragen... is het slim om zo'n id te SALTen? Dus dat je er een paar karakters aan vastplakt. Ik kan me voorstellen dat iemand die een sessie wil kapen dit probeert te doen door telkens met 32 karakters een id te genereren. Echter, als mijn session id geen 32 maar bijv. 35 karakters is, zal hem dat nooit lukken. Wel of geen slim idee?
 
PHP hulp

PHP hulp

06/11/2024 00:38:43
 
Bart V B

Bart V B

04/10/2013 01:48:36
Quote Anchor link
Dat lijkt me een beetje overbodig.
Beter lijkt me om de session te controleren. Bijvoorbeeld zo:
http://www.pfz.nl/wiki/session-hijacking/
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 07:11:42
Quote Anchor link
Bart V B op 04/10/2013 01:48:36:
Dat lijkt me een beetje overbodig.
Beter lijkt me om de session te controleren. Bijvoorbeeld zo:
http://www.pfz.nl/wiki/session-hijacking/

Het voorbeeld van PFZ gaat uit van het IP-adres. Dat heeft twee grote nadelen:

• Het sluit eerlijke gebruikers met een veranderend IP-adres uit, waaronder veel mobiele gebruikers en gebruikers van bepaalde providers.

• Het verhindert session hijacking niet wanneer de hacker in hetzelfde internetcafé, hetzelfde hotel, hetzelfde bedrijfsverzamelgebouw, enzovoort zit.

Je kunt beter vier andere maatregelen nemen:

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
20
21
22
23
24
25
<?php
// (1) Altijd een HTTP-only sessiecookie gebruiken
ini_set('session.cookie_httponly', '1');

// (2a) Sessienaam PHPSESSID van PHP vervangen door JSESSIONID van JSP
session_name('JSESSIONID');
// (2b) Deze server gebruikt geen PHP op Apache
header('Server: Sun-Java-System-Web-Server/7.0', true);
header('X-Powered-By: JSP/2.1', true);

// Controleren of de extensie hash bestaat
if (function_exists('hash_algos')) {
    // (3a) Sessie-ID versleutelen met 512-bits SHA-2 (sha512)
    ini_set('session.hash_function', 'sha512');
}
else {
    // (3b) Sessie-ID versleutelen met 128-bits SHA-1 in plaats van MD5
    ini_set('session.hash_function', '1');
}


// Sessie starten of hervatten
session_start();

// (4) Steeds een nieuwe sessie-ID genereren
session_regenerate_id(true);
?>


Verder nog:

(5) formulieren beveiligen met een token;
(6) inloggen altijd combineren met uitloggen;
(7) SSL gebruiken in kritieke situaties.
 
Ozzie PHP

Ozzie PHP

04/10/2013 11:59:07
Quote Anchor link
Thanks Ward, doe jij het zelf ook op die manier? Wat is JSP? En waarom de naam PHPSESSID vervangen? En wat bedoel je met "inloggen altijd combineren met uitloggen"?

(Ik heb een eigen VSP en geen shared server. Maakt dat nog iets uit?)
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 12:13:36
Quote Anchor link
JSP is JavaServer Pages, net zoals ASP een techniek die lijkt op PHP. Ik liet even zien hoe je kunt verhullen dat je PHP en Apache gebruikt. Als je een complete "X-Powered-By: PHP/5.x.y"-header verzendt, is je site namelijk gevoelig voor aanvallen via bugs in versie 5.x.y van PHP. En die worden openbaar gepubliceerd in bug reports...

Als je gebruikers laat inloggen, moet je ze een mogelijkheid bieden om uit te loggen. Bij het uitloggen vernietig je vervolgens de sessie. Zó kan die vervolgens niet meer worden misbruikt.

Session hijacking kan een gebruiker die online is soms zelf opmerken. En nog belangrijker: je kunt interacties met een live gebruiker benutten om de sessie beter te beveiligen. Maar als de gebruiker eenmaal vertrokken is, heb je alleen nog de hacker/cracker met de gekaapte sessie. Daarom dus: uitloggen is einde sessie.
 
Ozzie PHP

Ozzie PHP

04/10/2013 12:29:31
Quote Anchor link
Ah oke, dat verhaal van inloggen/uitloggen snap ik.

Dat verhullen dat het PHP is, vind ik wel grappig. Maar doe jij dat dan standaard bij alle output die jij terug naar de cliënt stuurt?

Overigens, dit kun je ook op een andere manier doen! Je kunt de server signature uitschakelen, evenals de server tokens en ook php expose kun je uitzetten. Het enige wat je dan nog kunt zien is dat je op een Apache server draait. Ik weet niet of je dit wist, maar dit lijkt me eigenlijk een betere methode dan "valse" headers mee te sturen.
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 12:39:52
Quote Anchor link
Klopt, bijvoorbeeld ook de Suhosin-patch voor "hardened PHP" verbergt de server signature.

Alleen kun je er wel over discussiëren wat beter is: de gebruikte software verbergen of erover liegen? Als je alleen dit ziet, gaat de onverlaat op zoek naar je technologie:

Server: Apache

Maar als je bijvoorbeeld dit meldt, zet je de inbreker op het verkeerde been:

Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET

Kan de leukerd fijn op zoek naar lekken in IIS en ASP.NET.
 
Ozzie PHP

Ozzie PHP

04/10/2013 12:43:42
Quote Anchor link
Ja, da's waar :)
Wel grappig inderdaad. Maar kan dat verder geen kwaad, dat je een header meestuurt die niet klopt, of maakt dat helemaal niks uit?
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 12:49:19
Quote Anchor link
Ozzie PHP op 04/10/2013 12:43:42:
Maar kan dat verder geen kwaad, dat je een header meestuurt die niet klopt, of maakt dat helemaal niks uit?

Goede vraag, ik weet het eerlijk gezegd niet, maar daarom stuur ik in dergelijke gevallen voor de zekerheid bestaande headers mee die door bekende, grote sites worden gebruikt.
 
Ozzie PHP

Ozzie PHP

04/10/2013 12:56:17
Quote Anchor link
Hmmm, okeej... maar ik denk dat als je die andere trucs gebruikt je ook al een eind op weg bent hoor! Dan zien ze alleen dat je een Apache server gebruikt, maar niet welke versie. En ze zien ook niet dat je PHP gebruikt. Lijkt me op zich dus wel oké.
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 13:01:03
Quote Anchor link
Het is inderdaad een bijzaak van het type "alleen gekken en dwazen schrijven hun naam op muren en glazen".

Belangrijker is een lange sessie-ID die je voortdurend verandert. Je eerste ingeving om er een salt aan toe te voegen was al goed, alleen kan dat gewoon met SHA-2.
 
Ozzie PHP

Ozzie PHP

04/10/2013 13:05:30
Quote Anchor link
Kun je daar een voorbeeld van geven hoe ik dan de session name zou moeten maken met SHA-2. En is SHA-2 hier het beste voor? (volgens mij werkt de standaard manier met MD5?)
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 13:10:12
Quote Anchor link
Ozzie PHP op 04/10/2013 13:05:30:
Kun je daar een voorbeeld van geven hoe ik dan de session name zou moeten maken met SHA-2. En is SHA-2 hier het beste voor? (volgens mij werkt de standaard manier met MD5?)

Niet de name maar de id bedoel je denk ik? Staat in mijn eerdere voorbeeld: 3a is 512-bits SHA-2 en 3b is het alternatief dat altijd werkt, namelijk MD5 vervangen door SHA-1.
 
Ozzie PHP

Ozzie PHP

04/10/2013 13:17:41
Quote Anchor link
Ah sorry, ik bedoelde inderdaad de id.

En wat is het voordeel van sha-2 boven sha-1. En hoe voeg je dan een salt toe?
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 13:45:52
Quote Anchor link
SHA-1 is 128 bits en SHA-2 heeft een variabele lengte tot 512 bits. Dat is al extreem veel sterker.

Voeg daaraan nog session_regenerate_id() toe om deze 512-bits hash voortdurend te veranderen en het is al bijna waterdicht. Je krijgt dan dit:

1. Gebruiker A krijgt sessie-ID 1.
2. Kaper B verandert die in sessie-ID 2.
3. Gebruiker A keert terug met sessie-ID 1, maar die is inmiddels ongeldig.

Hierna kan A niets meer en kun je bijvoorbeeld A dwingen opnieuw in te loggen. Probleem is dan alleen nog dat kaper B een geldige sessie heeft en dus de kaping is geslaagd. Dit kun je bijvoorbeeld voorkomen door beide sessie-ID's op te slaan in een database: bij stap 3 vernietig je vervolgens zowel sessie 1 als sessie 2.

Je ziet hier overigens ook wáárom sessies makkelijker zijn te beveiligen met een live gebruiker: dan verandert de (geldige) sessie-ID voortdurend.
Gewijzigd op 04/10/2013 13:47:19 door Ward van der Put
 
Ozzie PHP

Ozzie PHP

04/10/2013 13:50:39
Quote Anchor link
Dat klinkt nog best ingewikkeld! In hoeverre is dit eigenlijk nodig? Is de standaard-manier waarop PHP met sessies omgaat te onveilig?

Stel nu dat je het anders zou doen en je zou GEEN gebruik maken van session_regenerate_id(). In plaats daarvan sla je in de database het sessie-id op + een extra code. Bij iedere pagina-aannroep controleer je de code. Een hacker heeft die code natuurlijk niet. Stel dat ie dan toch per ongeluk het juiste id "raadt" dan klopt de code niet en wordt de complete sessie vernietigd. Is dat een idee?
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 14:05:07
Quote Anchor link
Dat kan inderdaad ook, en wordt ook vaak gedaan, met een token in een cookie of een verborgen formulierveld. Je hebt dan als het ware twee sleutels: de vaste van de sessie-ID en de variabele van het token.

Dan krijg je dit:

1. Gebruiker A krijgt sessie-ID 1 en hidden-input met token x.
2. Kaper B kaapt sessie-ID 1 maar token y.
3. Gebruiker A keert terug met sessie-ID 1 en inmiddels ongeldig token x: vernietig sessie 1.

En om je eerste vraag te beantwoorden: de standaardbeveiliging van PHP is inderdaad ontoereikend, vooral bij het verwerken van persoonsgegevens en financiële transacties.
 
Ozzie PHP

Ozzie PHP

04/10/2013 14:11:23
Quote Anchor link
Ah, oké thanks. Slecht eigenlijk dat de standaardbeveiliging ontoereikend is!

Wat versta jij precies onder "hidden input"?

Zou ik niet gewoon een cookie kunnen setten met een geheime code en die opslaan in de database, of desnoods in de sessie zelf? En dan zodra een pagina wordt geladen kijken of de geheime code uit de database of sessie overeenkomt met de code in de cookie?
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 14:19:08
Quote Anchor link
Ozzie PHP op 04/10/2013 14:11:23:
Wat versta jij precies onder "hidden input"?


<input type="hidden" name="token" value="...">

Ozzie PHP op 04/10/2013 14:11:23:
Zou ik niet gewoon een cookie kunnen setten met een geheime code en die opslaan in de database, of desnoods in de sessie zelf? En dan zodra een pagina wordt geladen kijken of de geheime code uit de database of sessie overeenkomt met de code in de cookie?


Je hoeft het token niet eens op te slaan in een database: je kunt het gewoon opslaan in de sessie. Zodra je een respons krijgt met het token (in een cookie via $_COOKIE of een formulier via $_POST) kijk je of dat geretourneerde token overeenkomt met het token in de sessie. Zo nee, dan vernietig je de sessie. Zo ja, dan ga je verder, maar genereer je een nieuw token.

Client en server wisselen dus voortdurend veranderende tokens uit. Komt daar een extra client bij, via session hijacking, dan heeft één van de clients een ongeldig token en kun je de boel dus op slot gooien.
Gewijzigd op 04/10/2013 14:19:53 door Ward van der Put
 
NOLot -

NOLot -

04/10/2013 14:22:38
Quote Anchor link
Ozzie PHP op 04/10/2013 14:11:23:
Ah, oké thanks. Slecht eigenlijk dat de standaardbeveiliging ontoereikend is!

Wat versta jij precies onder "hidden input"?

Zou ik niet gewoon een cookie kunnen setten met een geheime code en die opslaan in de database, of desnoods in de sessie zelf? En dan zodra een pagina wordt geladen kijken of de geheime code uit de database of sessie overeenkomt met de code in de cookie?


Je hebt helemaal niet zoiets als "standaardbeveiliging". Het gaat allemaal om de programmeur. Een slechte programmeur kan altijd beveiligingslekken veroorzaken, overal, en een goede programmeur zorgt altijd dat hij het goed dichttimmert. Helaas is php zo'n makkelijke taal dat het door veel noobies gebruikt wordt, en die hebben de ballen verstand van echt programmeren.

En dat is ook de reden waarom er altijd zo lacherig over php wordt gedaan. Met hidden input bedoelt hij csrf protectie
Gewijzigd op 04/10/2013 14:22:59 door NOLot -
 
Ozzie PHP

Ozzie PHP

04/10/2013 14:25:23
Quote Anchor link
Ah oke... als er een formulier wordt gepost, heb je dan eigenlijk geen sessie-waarden vraag ik me ineens af? Omdat jij het token dan uit het formulier haalt ipv uit de sessie??

Bij iedere nieuwe request / nieuwe pagina vernieuw je dus de token. Is dat wat je bedoelt? En de sessie-id blijft dan gewoon hetzelfde. Correct?

Maar ik moet dan wel een cookie op de client opslaan toch? Waarin ik telkens die nieuwe code opsla?
 

Pagina: 1 2 3 volgende »



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.