Avatar billede molte Nybegynder
28. februar 2009 - 15:57 Der er 16 kommentarer

Opdatering af side i historik under tvang.

Jeg udvikler et website, hvor visse af siderne kræver login før de er tilgængelige.

Når man besøger en af disse sider, tjekker serveren om man er logget ind, og ellers redirect'er den en til login-siden.

Når brugeren logger ud (og cookie'en, der siger denne er logget ind, slettes), kan brugeren stadig klikke på tilbageknappen i sin browser og se de sider, man ellers skal være logget ind for at se. Hvordan undgår jeg dette?
Avatar billede olebole Juniormester
28. februar 2009 - 17:14 #1
<ole>

Det undgås ved at gøre tingene rigtigt  ;o)

At anbefale en alternativ løsning kræver, man ved, hvad den skal være et alternativ til  =)

/mvh
</bole>
Avatar billede molte Nybegynder
28. februar 2009 - 17:20 #2
Lige nu kører det således:

if (!check_login()) {
  header('Location: login.php');
}

Funktionen "check_login" returnerer true, hvis man er logget ind.
Avatar billede olebole Juniormester
28. februar 2009 - 17:49 #3
- og så er vi jo tilbage ved:
    Det undgås ved at gøre tingene rigtigt  ;o)
Avatar billede molte Nybegynder
28. februar 2009 - 18:51 #4
Ja, det kan jeg forstå, men hvordan vil du så definere "rigtigt" (hvad skal jeg gøre)? :O
Avatar billede olebole Juniormester
28. februar 2009 - 18:57 #5
Hvad er det, du ikke forstod i mit første indlæg? Vis, hvad du gør  =)
Avatar billede molte Nybegynder
28. februar 2009 - 19:02 #6
Det troede jeg sådan set jeg havde gjort. ;)

Hvad er det helt nøjagtigt, du gerne vil have at vide?
Avatar billede showsource Seniormester
28. februar 2009 - 19:33 #7
Når man logger ud, så sletter du en cookie?
Så lav en header("Location..... efterflg.
Avatar billede molte Nybegynder
28. februar 2009 - 19:37 #8
Det gør jeg da allerede.
Avatar billede showsource Seniormester
28. februar 2009 - 19:46 #9
nånå, :O)
et hurtigt bud er at server kører med register globals on, og at du bruger det "samme navn" til en anden var.

f.eks.
$_COOKIE["login"] og $login
Avatar billede olebole Juniormester
28. februar 2009 - 20:06 #10
molte >> Du viser et lille fragment af din kode. Det er ikke til at sige, hvad du skal gøre anderledes, når vi ikke kan se mere. Fejlen kan ligge alle mulige forskellige steder
Avatar billede molte Nybegynder
28. februar 2009 - 21:15 #11
@showsource:
Brugeren kan i øjeblikket sagtens logge ud. Cookie'en, jeg bruger til at definere, at man er logget ind, bliver fint slettet.

Det der er galt er, at når brugeren går tilbage i sin historik til en side, hvor der kræves login, når vedkommende ikke er logget ind, viser browseren bare den side, der ligger i dens cache i stedet for at load den 'rigtige' side igen for at blive redirect'et.
Avatar billede olebole Juniormester
28. februar 2009 - 21:34 #12
molte >> Så længe du ikke hæver informationsniveauet, hæver vi tråden sig næppe over quizniveauet. Ingen af os er i tvivl om, hvordan dit problem ytrer sig, men du burde ikke have det problem, så uden flere informationer er det svært at gætte sig frem til, hvorfor det opstår  =)
Avatar billede molte Nybegynder
28. februar 2009 - 21:51 #13
Godt, så...

Så godt som øverst (det eneste, der er før er en 'define' og en 'require_once') i den side, man skal være logget ind for at se, har jeg skrevet

if (!check_login()) header('Location: login.php');

check_login-funktionen ser således ud:

function check_login()
{
    $login_params = remove_magic_quotes($_COOKIE);
    return check_password($login_params['mail'], $login_params['password']);
}

remove_magic_quotes fjerner bare magic_quotes_gpc (som det nok kan regnes ud).

Så har jeg følgende:

function check_password($mail, $password)
{
    // check if no login information was given
    if (empty($mail) || empty($password)) {
        return false;
    }
   
    // connect to database
    $mysqli = new mysqli('localhost', 'user', 'password', 'database');

    // check if connection error occured
    if (mysqli_connect_errno()) {
        return false;
    }
   
    // get correct password if any
    if ($stmt = $mysqli->prepare('SELECT password FROM clients WHERE mail = ? LIMIT 1')) {
        $stmt->bind_param('s', $mail);
        $stmt->execute();
        $stmt->bind_result($result);
        $stmt->fetch();
        $stmt->close();
    }
    else {
        $result = null;
    }
   
    // disconnect from database
    $mysqli->close();
   
    // check if passwords match
    if ($password == $result) {
        return true;
    }
    else {
        return false;
    }
}

Slutteligt kan jeg sige, at disse funktioner findes i en fil jeg 'require_once'er. I denne fil tjekker jeg også om den 'define' jeg omtalte tidligere er defineret, så man ikke kan tilgå den side direkte.

Forresten sker samme fejl, hvis man er logget ind og går tilbage til login-siden (som eller også burde redirect). Hvis jeg opdaterer siden gør den som den skal.
Avatar billede molte Nybegynder
28. februar 2009 - 21:51 #14
Nu håber jeg det var nok denne gang :P
Avatar billede molte Nybegynder
28. februar 2009 - 21:55 #15
@showsource: Jeg har lige tjekket, og register globals skulle være slået fra.
Avatar billede molte Nybegynder
01. marts 2009 - 16:30 #16
Aha!

Jeg har lige fundet ud af, at fejlen kun forekommer med Firefox, Google Chrome og Opera. Med IE og Safari virker det fint.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester