Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Inlogproblemen door cache

Pagina: 1
Acties:

Onderwerpen


  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Hey,

Voor een website maak ik gebruik van het principe dat de formuliervelden (gebruikersnaam en wachtwoord) op de inlogpagina random worden gegenereerd, waarbij deze random strings worden opgeslagen in een sessie. Hierdoor wordt het extern inloggen onmogelijk gemaakt (ten minste, dat probeer ik hiermee te bereiken).

Nu heb ik het probleem dat (volgens mij alleen) in Firefox het probleem ontstaat waarbij de (html)pagina soms uit de cache wordt gehaald. Hierdoor komen de veldnamen in de htmlpagina niet overeen met de veldnamen in de sessie. Het komt dan ook wel eens voor dat ik twee keer moet inloggen voordat ik daadwerkelijk ingelogd ben.

Als template engine gebruik ik smarty (waarbij caching is uitgeschakeld).

De code die ik gebruik op de inlogpagina is:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$length = 10;
            
            if(isset($_SESSION['login_form_fields']['username']) AND isset($_SESSION['login_form_fields']['password']))
                $login_form_fields = $_SESSION['login_form_fields'];
            else {
                $login_form_fields = $oLogin->generateFormFieldNames($length);
            }

      

        $_SESSION['login_form_fields'] = $login_form_fields;

        $smarty->assign('login_form_fields', $login_form_fields);
?>


De volgende check gebruik ik om bij het verzenden van de gegevens uberhaupt te controleren of de variabelen in de $_POST array bestaan:

PHP:
1
2
3
4
5
6
7
8
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
        
                if(!isset($_POST[$_SESSION['login_form_fields']['username']]) AND !isset($_POST[$_SESSION['login_form_fields']['password']]))
                        $errors[] = 'Er is een fout opgetreden. Wij vragen u de pagina te verversen en het nogmaals te proberen.';

... etc.
?>


De functie generateFormFieldNames() genereert voor zowel de gebruikersnaam als wachtwoord een random string en zet deze in een array.

Caching staat voor zover ik kan zien overal uit. De antwoordheaders in firebug geven aan dat caching is uitgeschakeld.

Weet iemand wat ik tegen dit probleem kan doen of hoe ik het kan oplossen?

Alvast bedankt.

[ Voor 8% gewijzigd door radem205 op 17-10-2011 17:08 ]


Verwijderd

Zijn verschillende manieren:

+ Header sturen dat resource niet gecached mag worden
+ ?t=(timestamp hier) appenden achter je login link

Zijn nog wel wat andere, maar probeer het eerst even zo

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Verwijderd schreef op maandag 17 oktober 2011 @ 17:06:

+ Header sturen dat resource niet gecached mag worden
Hoe doe ik dit volgens jou (afgezien van een no-cache header)? Want de antwoordheaders geven aan dat de pagina niet gecached wordt / mag worden. Dus volgens mij is caching al uitgeschakeld.

  • Thralas
  • Registratie: December 2002
  • Laatst online: 09:10
radem205 schreef op maandag 17 oktober 2011 @ 17:03:
Hierdoor wordt het extern inloggen onmogelijk gemaakt (ten minste, dat probeer ik hiermee te bereiken).
Even terug naar je originele probleem. 'Extern inloggen' wil je voorkomen. Wat bedoel je hier precies mee? Inloggen met 'third party' clients?

Wat het ook is, volgens mij probeer je het probleem op de verkeerde manier op te lossen. Laat de form field names gewoon voor wat ze zijn, en voeg een CSRF token toe. Doe maar meteen op al je form fields, dan is CSRF meteen geen probleem meer.

  • 8088
  • Registratie: December 2000
  • Niet online

8088

NaN

radem205 schreef op maandag 17 oktober 2011 @ 17:09:
Hoe doe ik dit volgens jou (afgezien van een no-cache header)? Want de antwoordheaders geven aan dat de pagina niet gecached wordt / mag worden. Dus volgens mij is caching al uitgeschakeld.
Wat je de browser ook opdraagt, je moet er nooit van uitgaan dat deze gehoorzaamt.

Do you seek to engage in or have you ever engaged in terrorist activities, espionage, sabotage, or genocide?