Toon posts:

[php]logout werkt niet altijd meteen goed

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0Henk 'm!

  • Peetz0r
  • Registratie: Mei 2009
  • Laatst online: 04-06 21:30
Ik heb een webapplicatie waar je kunt inloggen en (duh) uitloggen.
Wat eisen over het uitloggen:
  • CSRF-proof (dus niet uitloggen via een 'plaatje' in dit topic)
  • Na het uitloggen wil ik een nieuw sessie-is, zodat als mijn cookie gestolen is, en ik daarom uitlog en daarna weer inlog, dat ik dan niet opnieuw ingelogd ben met hetzelfde sessie-id.
Dus dan hebben we de volgende code (ongeveer).
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
session_start();

if(isset($_GET['logout_token']) && isset($_SESSION['logout_token'])
    && $_GET['logout_token'] == $_SESSION['logout_token'])
{
    session_unset();
    session_destroy();
    $_SESSION['logged_in'] = false;
    session_regenerate_id(true);
}

$_SESSION['logout_token'] = base64_encode(openssl_random_pseudo_bytes(12));
?>

<a href="/?logout_token=<?php echo $_SESSION['logout_token']; ?>">Uitloggen</a>

Dat werkt ongeveer wel, dat wil zeggen, meestal doet het precies wat het moet doen. Maar soms wordt er pas uitgelogd na een tweede (of derde) keer klikken op de link. Da's natuurlijk niet de bedoeling.

Acties:
  • 0Henk 'm!

  • Anoniem: 241683
  • Registratie: November 2007
  • Niet online
Waar maak je
PHP:
1
<?php echo $logout_token; ?>


aan?

Als deze niet gelijk is aan $_SESSION['logout_token'] is het nogal wiedes


Edit: Daarnaast, lees eens welke tegenreeks base64 oplevert.... hint: Wikipedia: Base64

[Voor 32% gewijzigd door Anoniem: 241683 op 02-05-2012 12:36]


Acties:
  • 0Henk 'm!

  • Peetz0r
  • Registratie: Mei 2009
  • Laatst online: 04-06 21:30
Anoniem: 241683 schreef op woensdag 02 mei 2012 @ 12:34:
Waar maak je
PHP:
1
<?php echo $logout_token; ?>


aan?

Als deze niet gelijk is aan $_SESSION['logout_token'] is het nogal wiedes


Edit: Daarnaast, lees eens welke tegenreeks base64 oplevert.... hint: Wikipedia: Base64
Die zijn gelijk aan elkaar, ik edit m'n eerste post even. In de echte appilcatie gebruik ik Smarty als template engine, maar voor dit topic had ik het even vereenvoudigd. Maar dat is het probleem dus niet.

Acties:
  • 0Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 14:46
Maak bijvoorbeeld gebruik van een form token. Voorbeeld: http://www.serversidemaga...res-against-csrf-attacks/ (ik heb al betere artikels gezien, maar het principe is wel duidelijk).

Acties:
  • 0Henk 'm!

  • Anoniem: 241683
  • Registratie: November 2007
  • Niet online
Heb je mijn link gezien in mijn edit? Over base64 en url's? Standaard base64 implementaties leveren namelijk karakters op die je url kunnen ver******

Acties:
  • 0Henk 'm!

  • Peetz0r
  • Registratie: Mei 2009
  • Laatst online: 04-06 21:30
Anoniem: 241683 schreef op woensdag 02 mei 2012 @ 12:49:
Heb je mijn link gezien in mijn edit? Over base64 en url's? Standaard base64 implementaties leveren namelijk karakters op die je url kunnen ver******
Hmm, ja, dat verklaart waarschijnlijk wel waarom hij zo onregelmatig faalt. Dankje!

Acties:
  • 0Henk 'm!

  • Peetz0r
  • Registratie: Mei 2009
  • Laatst online: 04-06 21:30
Styxxy schreef op woensdag 02 mei 2012 @ 12:44:
Maak bijvoorbeeld gebruik van een form token. Voorbeeld: http://www.serversidemaga...res-against-csrf-attacks/ (ik heb al betere artikels gezien, maar het principe is wel duidelijk).
Dat is prima voor forms, maar dit is een simpel linkje. Ik wil niet afhankelijk zijn van javascript om via het linkje een form te submitten, dus het zal over GET moeten. Andere forms zullen waar van toepassing over POST gaan, maar uitloggen dus niet.

Acties:
  • 0Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 14:39

DataGhost

iPL dev

Het "mag niet" met GET, ik zou daar toch even goed naar gaan kijken. Een button is best te doen en die kan je alsnog redelijk stylen zoals je wilt. Als je deze manier blijft gebruiken zal je ongetwijfeld een keer klachten krijgen van mensen met precachende browsers, die loggen dan namelijk al uit terwijl er gewoon gesurft wordt.

Acties:
  • 0Henk 'm!

  • Peetz0r
  • Registratie: Mei 2009
  • Laatst online: 04-06 21:30
DataGhost schreef op woensdag 02 mei 2012 @ 13:14:
Het "mag niet" met GET, ik zou daar toch even goed naar gaan kijken. Een button is best te doen en die kan je alsnog redelijk stylen zoals je wilt. Als je deze manier blijft gebruiken zal je ongetwijfeld een keer klachten krijgen van mensen met precachende browsers, die loggen dan namelijk al uit terwijl er gewoon gesurft wordt.
Als dat zo zou zijn zou je op de meeste sites nieteens kunnen inloggen. Zelfs gmail's logout-link gaat over get (en is/was zelfs csrf-kwetsbaar dacht ik). Als je de specs tot de letter volgt zou je inderdaat moeten uitloggen over POST, maar dat wordt em gewoon niet. Alhoewel het wel netter is ind e zin dat je je logout-token niet in beeld krijgt...
Ahhhh, nu heb je me alsnog overtuigd! (en als we dan toch bezig zijn kan ik net zo goed m'n token in hex maken, en dan gewoon 4x zo lang).

Zo jammer dat HTTP een stateless protocol is!

Acties:
  • 0Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nee, POST is vooral netter omdat de actie niet idempotent is. Hint: zoekterm, maakt het beantwoorden van 99% vd 'GET of POST?' vragen compleet triviaal.

{signature}


Acties:
  • 0Henk 'm!

  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 11:39
Wat ik altijd doe, is een logout-link maken naar een bevestigings-formulier. In dat formulier kun je dan een token stoppen. Dan voorkom je meteen dat je bij een mis-klik uitgelogd wordt.

Acties:
  • 0Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 13-08-2022

Scyth

Fat finger, three beer

Kleine tip; het is niet érg netjes, maar de base64_decode functie werkt ook op strings die getrimmed zijn indien strict false is (default):


PHP:
1
2
3
4
5
6
7
$a = base64_encode('test'); //dGVzdA==
$b = trim($a, '=+');

$a = base64_decode($a);
$b = base64_decode($b);

var_dump($a === $b); // [i]true[/i]


URL-vern**kende characters hoeven dus niet persé een probleem te zijn. De trailing =='s zijn puur voor het volledig vullen van de gebruikte bytes, dus collisions zijn uitgesloten.

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Acties:
  • 0Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Of maak een formulier met de logout link als submit button, met een klein beetje styling zie je het verschil niet en je weet iig zeker dat het netjes via POST gebeurt.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 14:39

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Scyth schreef op woensdag 02 mei 2012 @ 13:58:
URL-vern**kende characters hoeven dus niet persé een probleem te zijn.
Precies, maar niet om de reden die jij hier aandraagt (met een, IMHO smerige, workaround). Je kunt ook gewoon urlencode gebruiken zoals 't hoort.

Maar dat is allemaal los van de discussie POST/GET etc. die hier verder gevoerd word. Daar heb ik nu even geen zin in; ik heb maar 1 woord: POST! :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Acties:
  • 0Henk 'm!

  • Peetz0r
  • Registratie: Mei 2009
  • Laatst online: 04-06 21:30
Zoals je kunt lezen (13:46) heb ik al besloten om er inderdaad een form van te maken, wat ook meteen het probleem van de url-slopende karakters oplost.

Acties:
  • 0Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 14:39

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

P.E.T.E.R. schreef op woensdag 02 mei 2012 @ 14:06:
wat ook meteen het probleem van de url-slopende karakters oplost.
Dan nog dien je iig bekend te zijn met urlencoding dus beschouw dat dan maar als een bonus leermomentje ;) :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Acties:
  • 0Henk 'm!

  • Peetz0r
  • Registratie: Mei 2009
  • Laatst online: 04-06 21:30
RobIII schreef op woensdag 02 mei 2012 @ 14:08:
[...]

Dan nog dien je iig bekend te zijn met urlencoding dus beschouw dat dan maar als een bonus leermomentje ;) :P
Dat wist ik ook wel, maar af en toe denk je niet aan alles tegelijk

Acties:
  • 0Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 14:46
P.E.T.E.R. schreef op woensdag 02 mei 2012 @ 13:04:
[...]
Dat is prima voor forms, maar dit is een simpel linkje. Ik wil niet afhankelijk zijn van javascript om via het linkje een form te submitten, dus het zal over GET moeten. Andere forms zullen waar van toepassing over POST gaan, maar uitloggen dus niet.
Ik zie JavaScript niet direct hier in het plaatje komen? Overigens is het zelfde principe ook over GET te verkrijgen, al is het wel minder netjes (token meegeven via query string).
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee