session id

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

Ward van der Put
Moderator

Ward van der Put

04/10/2013 14:44:32
Quote Anchor link
Je geeft een digitale handtekening mee aan het webformulier: dit ene formulier hoort bij dit ene HTTP-verzoek. Zodra het ingevulde formulier wordt geretourneerd, moet de handtekening "op" het formulier overeenkomen met de handtekening in de sessie op de server.

De sessie, op de server, bepaalt dus wat een geldige HTTP-respons is. Geen handtekening? Of een verouderde handtekening? Dan wég met dat formulier. En wég met die sessie.
 
PHP hulp

PHP hulp

06/11/2024 02:34:50
 
Ozzie PHP

Ozzie PHP

04/10/2013 14:55:27
Quote Anchor link
Ward ik begrijp wat je bedoelt. Maar ik zit me even af te vragen... De geheime code staan in de cookie op de client. De client post een formulier. Ik vraag de post gegevens op, maar kan ik dan niet tegelijkertijd de cookie gegevens opvragen bij een post request? Anders zou ik gewoon de code uit de cookie kunnen gebruiken.
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 15:07:48
Quote Anchor link
Het is bij voorkeur $_SESSION('token') != $_POST('token') betekent foute boel.

Daarvoor zijn grofweg drie redenen:

• Iemand kan een webpagina met een formulier lokaal opslaan. Of er eentje opvissen uit de browsercache. Dat willen we niet: we willen een actueel formulier voor een actieve sessie.

• Browsers springen flexibeler om met sessiecookies dan met gewone cookies. Maak het sessiebeheer van PHP daarom liever niet afhankelijk van gewone cookies.

• Je applicatie kan zich in een bepaalde toestand bevinden. Bijvoorbeeld "ik ben bezig met het openen van een account" is een andere toestand dan "ik heb een account geopend en wil nu afrekenen". Dat is bijvoorbeeld belangrijk als gebruikers op de knop Vorige gaan zitten klikken.
 
Ozzie PHP

Ozzie PHP

04/10/2013 15:16:10
Quote Anchor link
Hmmm, oké. Ik probeer het te begrijpen.

Maar zeg je dan eigenlijk dat het opslaan van de code in een afzonderlijke cookie geen goed idee is?

Mijn idee was:
- code opslaan in sessie en cookie
- bij iedere pagina-aanroep controleren of de code uit de cookie overeenkomt met die uit de sessie
- zo nee, sessie vernietigen
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 15:29:40
Quote Anchor link
Je kunt de code inderdaad beter meegeven in een formulier. Niet alleen worden sessiecookies anders behandeld dan gewone cookies. Je hebt ook nog het "probleem" dat gewone cookies worden verzonden bij alle verzoeken om afbeeldingen, JavaScript en CSS van de huidige webpagina. Programmeer je dat ergens verkeerd, dan kan één zo'n request leiden tot een nieuw token en een webpagina die vastloopt.
 
Ozzie PHP

Ozzie PHP

04/10/2013 15:52:10
Quote Anchor link
Ah oke, maar dan kan ik die geheime code dus niet werkend krijgen als ik niet met cookies kan werken. Want dan kun je bij een normale (niet-post) request dus geen controle uitvoeren. Dus dan kan wel iemand je sessie stelen als ik het goed begrijp.
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 16:07:56
Quote Anchor link
Even een paar reacties terug: waarom wil je session_regenerate_id() niet gebruiken?
 
Ozzie PHP

Ozzie PHP

04/10/2013 16:11:58
Quote Anchor link
Ward, dat zou ook kunnen. Mijn idee met een extra code leek me echter wel leuk :) Maar als dat niet kan dan is session_regenerate_id() inderdaad een goede optie. Maar dan nog zou volgens mij een sessie kunnen worden overgenomen. Je verkleint toch alleen maar de kans dat een hacker het juiste id "raadt"?

1) ik log in... sessie wordt gestart.
2) nieuwe sessie id wordt gegenereerd
3) hacker "raadt" mijn nieuwe sessie id en neemt mijn sessie over... :(
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 16:26:51
Quote Anchor link
"Raden" van een 512-bits SHA-2 sessie-ID (of token) is praktisch onmogelijk, tenzij je toestaat dat er vele miljoenen verzoeken met steeds een andere sessie-ID naar je server worden verzonden. Dáár moet je beveiliging dus op ingericht zijn. Bijvoorbeeld door niet meer dan x ongeldige sessie-ID's per IP-adres toe te staan.
 
Ozzie PHP

Ozzie PHP

04/10/2013 18:05:10
Quote Anchor link
Euh, en hoe weet je dan of iemand een ongeldig sessie-id aanroept? :-s Ik heb geen idee hoe je dat zou moeten controleren. Heb jij sowieso enig idee hoe iemand eigenlijk zo'n id te pakken kan krijgen? Want ze kunnen immers niet op je server.
 
Ward van der Put
Moderator

Ward van der Put

04/10/2013 18:12:06
Quote Anchor link
Ozzie PHP op 04/10/2013 18:05:10:
Euh, en hoe weet je dan of iemand een ongeldig sessie-id aanroept? :-s Ik heb geen idee hoe je dat zou moeten controleren. Heb jij sowieso enig idee hoe iemand eigenlijk zo'n id te pakken kan krijgen? Want ze kunnen immers niet op je server.

Ozzie, begrijp je überhaupt hoe een sessie-ID bij PHP tot stand komt en hoe die vervolgens wordt uitgewisseld tussen client en server?

Dat is toch echt wel de minimale basis die je moet kunnen dromen voordat je aan verbeteringen gaan sleutelen :(
 
NOLot -

NOLot -

04/10/2013 18:33:47
Quote Anchor link
Ozzie PHP op 04/10/2013 18:05:10:
Euh, en hoe weet je dan of iemand een ongeldig sessie-id aanroept? :-s Ik heb geen idee hoe je dat zou moeten controleren. Heb jij sowieso enig idee hoe iemand eigenlijk zo'n id te pakken kan krijgen? Want ze kunnen immers niet op je server.


http://en.wikipedia.org/wiki/Session_hijacking
 
Ozzie PHP

Ozzie PHP

04/10/2013 20:15:20
Quote Anchor link
@Ward, ja dat weet ik... maar de vraag was hoe iemand die sessie kan stelen. NOLot bedankt voor de link. Ik vraag me dus af of iemand een soort van bruteforce-aanval kan uitvoeren (net als met wachtwoorden), dus continue een andere id uitproberen. Maar de vraag is of dit kan. Ik zou namelijk niet weten hoe.
 
Eddy E

Eddy E

05/10/2013 08:51:03
Quote Anchor link
Tuurlijk kan dat.

Open index.php?PHPSESSID=827463473047fhON bijvoorbeeld.
Ben je 'opeens' ingelogd, heb je dus een sessie gekaapt.

Je zou kunnen kijken of iemand $_GET['PHPSESSID'] opgeeft, per IP-adres bijvoorbeeld (niet per sessie, want dat overschrijf hij).
Als dat meer dan 3 is, blokkeer het IP-adres.

Je kan ook, wellicht gaat dat nadelige consequenties hebben, voor je session_start() gewoon $_GET['PHPSESSID'] unsetten.
Ben je er ook van af, dus werkt dat PHPSESSID niet meer.
 
Ward van der Put
Moderator

Ward van der Put

05/10/2013 08:57:32
Quote Anchor link
Ozzie PHP op 04/10/2013 20:15:20:
Ik vraag me dus af of iemand een soort van bruteforce-aanval kan uitvoeren (net als met wachtwoorden), dus continue een andere id uitproberen. Maar de vraag is of dit kan. Ik zou namelijk niet weten hoe.

Dat kan zeker. De sessienaam en de sessie-ID zijn te vervalsen doordat ze als een eenvoudig cookie worden uitgewisseld tussen client en server. Bij de standaardconfiguratie van PHP 5 is dat de naam PHPSESSID gevolgd door een MD5-hash voor de ID, dus als iemand je server gaat bestoken met vergelijkbare cookies, kan hij binnenkomen.

In wezen is het dus een eenvoudige variabele. Maak je de waarde langer (minimaal MD5 vervangen door SHA-1) en wijzig je de waarde voortdurend, dan neemt de beveiliging sterk toe.

Vroeger werden sessies nog wel eens onbedoeld overgenomen wanneer de sessie-ID werd doorgegeven in een URL. (Een optie in php.ini die nu standaard uitstaat.) Als iemand dan een link deelde met iemand anders, vaak via e-mail, hadden twee gebruikers dezelfde sessie.
 
Eddy E

Eddy E

05/10/2013 09:28:22
Quote Anchor link
Toch zie ik dat laatste nog regelmatig gebeuren.
Bij phpBB-fora bijvoorbeeld, net nadat je ingelogd ben.
 
Ozzie PHP

Ozzie PHP

05/10/2013 15:41:50
Quote Anchor link
@Eddy: PHP koppelt $_GET['PHPSESSID'] toch niet standaard aan de session id? Je moet het dan toch zelf eerst zo programmeren? Ik geef geen sessie id's door via de URL dus ik neem aan dat ze op die manier dan ook geen sessie kunnen stelen?

@Ward: dat is inderdaad dus ook de manier die ik in gedachten had. Maar precies vandaar dus ook mijn vraag. Zoals je zelf zegt kun je de waarde langer maken en telkens wijzigen. En hoewel de kans uiteraard zeer zeer zeer klein is, zou het echter nog steeds kunnen dat iemand met zo'n valse cookie jouw sessie kaapt. Toch? En daar ging mijn vraag dus over. Hoe voorkom je dat? SHA-1 en een telkens wijzigende sessie-id zal de kans kleiner maken dat een hacker de juiste code vindt, maar het maakt het niet onmogelijk. En wat doe je dan als die hacker toch ineens jouw sessie te pakken heeft? Wat is dan het stukje extra controle, waardoor het systeem weet dat 2 gebruikers gebruik maken van dezelfde sessie?
 
Ward van der Put
Moderator

Ward van der Put

05/10/2013 16:40:25
Quote Anchor link
Dat is het inderdaad: je kunt de kans uitzonderlijk klein maken, maar je kunt de kans nooit nul maken.

Daarom varen goed beveiligde systemen nooit blind op sessies alleen. Er is altijd een aanvullende beveiliging. Meestal meerdere zelfs.
 
Ozzie PHP

Ozzie PHP

05/10/2013 16:45:04
Quote Anchor link
Ward, dat is dus precies mijn vraag. Iemand steelt dus een sessie. Hoe weet het systeem dan dat de sessie is gestolen? Dan moet er toch iets aanwezig zijn op de cliënt van de originele sessie, wat niet aanwezig is op de cliënt van de hacker. En zodoende dacht ik dus aan een cookie op de cliënt van de originele sessie, maar jij zei dat dat geen goed idee is. Wat is dan wel een goed idee?
 
Ward van der Put
Moderator

Ward van der Put

05/10/2013 16:56:17
Quote Anchor link
Een goed idee is bijvoorbeeld formulieren beveiligen met een digitale handtekening. Op het moment dat je het formulier verzendt, plaats je een uniek token in een input type="hidden". Het token sla je op in de sessie. Op het moment dat het ingevulde formulier wordt geretourneerd door de client, moet het token in $_POST identiek zijn aan het token dat je eerder in $_SESSION hebt opgeslagen.

Zodra er twee clients zijn (waaronder bijvoorbeeld één hacker), verandert de digitale handtekening in de sessie. Degene die een formulier met een verouderde handtekening indient, vist dus achter het net.

Hetzelfde idee als jouw cookie, denk ik, maar minder gevoelig voor cookieweigeraars.
 

Pagina: « vorige 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.