2010-08-16 22 views
5

Ich würde es einrichten, wo, wenn jemand eine Anfrage "Abmeldung" sendet es automatisch zu einer Seite mit der Meldung "erfolgreich abmelden". Wenn der Kunde versucht, den Zurück-Knopf zu drücken oder in den Sperrbereich zu gehen, wird er erneut nach HTTP-Auth fragen.PHP: HTTP Basic - Abmelden

Was ich bisher habe, ist dies:

example.com/restricted/index.php:

<?php 
    session_start(); 

    if(isset($_GET['logout'])) 
    { 
     unset($_SESSION["login"]); 
     header("location: ../logout.php"); 
     exit; 
    } 

    if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || !isset($_SESSION["login"])) 
    { 

     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     $_SESSION["login"] = true; 
     // Print HTML that a password is required 
     exit; 
    } 
?> 
// The rest of the page is then displayed like normal 

Der Benutzer erfolgreich Besuche example.com/logout.php wenn Beispiel. com/restricted/index.php? Logout ist zugegriffen. Wenn der Benutzer versucht, zurückzugehen, aber zufällige Dinge passieren, wird er manchmal zweimal nach HTTP-Authentifizierung fragen (???), manchmal wird er nach Authentifizierung in einer Schleife fragen (?) Und manchmal lässt er mich gleich wieder gehen Ich habe mich nie ausgeloggt.

Ich bin neu, wie Sitzungen arbeiten, aber mein Verständnis ist dies: Wenn/wenn die Person validiert ist, speichert es eine Variable in seiner Sitzung namens Login mit einem Wert von True ... wenn es jeder bekommt eine GET-Anfrage mit Logout, es wird dann diese Session-Variable löschen und zurück zur Logout.php ... Warum ist es dann, wenn ich zurück auf den Index klicke, lass es mich wieder rein, ohne nach Authentifizierung zu fragen, wenn Session [Login] angeblich nicht gesetzt ist .

Jede Verbesserung dieses PHP-Codes wird geschätzt. Ich weiß, dass ich HTTP Basic nicht verwenden sollte und SQL einbeziehen sollte, aber meh. Dies ist eine vorübergehende Lösung.

Edit: Ich werde eine Lösung mit MySQL akzeptieren, wenn ein Beispiel mit Anweisungen enthalten sind. Ich habe keine MySQL oder PHP-Datenbank-Kenntnisse (noch)

+1

Ohne Sitzungen sollten Sie die grundlegende Realm-Zeichenfolge ändern. – stillstanding

+0

Ist es nicht so viel Aufwand für nur eine vorübergehende Lösung? –

+0

@stillstanding das Hauptproblem ist WANN, es zu senden. Wie kann ich einen Anruf von einem angemeldeten Benutzer und einen Anruf von einem abgemeldeten unterscheiden? –

Antwort

1

Eine grobe Idee, die Sie beginnen:

<?php 
    session_start(); 

    if(isset($_GET['logout'])) 
    { 
    session_destroy(); 
    header('Location: ../logout.php'); 
    exit; 
    } 

    if(!isset($_SESSION['login'])) 
    { 
    if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) 
    { 
     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     // Print HTML that a password is required 
     exit; 
    } 
    else 
    { 
     // Validate the $_SERVER['PHP_AUTH_USER'] & $_SERVER['PHP_AUTH_PW'] 
     if($_SERVER['PHP_AUTH_USER']!='TheUsername' 
      || $_SERVER['PHP_AUTH_PW']!='ThePassword') 
     { 
     // Invalid: 401 Error & Exit 
     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     // Print HTML that a username or password is not valid 
     exit; 
     } 
     else 
     { 
     // Valid 
     $_SESSION['login']=true; 
     } 
    } 
    } 
?> 
// The rest of the page is then displayed like normal 
+0

Wie würde ich PHP_AUTH_USER und PHP_AUTH_PW validieren ohne zu analysieren und .htpass und so? – ParoX

+0

Wenn es sich um eine temporäre Lösung handelt und Sie nur einen Satz Benutzername/Passwort benötigen, tun Sie etwas wie 'if ($ _SERVER [' PHP_AUTH_USER ']! =' Der Benutzername '|| $ _SERVER [' PHP_AUTH_PW ']!= 'ThePassword') {/ * 401 Fehler & Beenden * /} else {$ _SESSION ['login'] = true} ' Persönlich habe ich PHP_AUTH_USER/PHP_AUTH_PW noch nicht benutzt, ich neige dazu, nur ein Formular zu haben, das mich überholt ihr Benutzername und Passwort durch $ _GET oder $ _POST - Viel einfacher. –

+0

@Brian Login speichern und in der DB übergeben? –

1

ich einen Weg, um es gefunden haben.

Ich habe 2 Dateien: index.php und logout.php

Hier ist mein 'index.php' Code:

# CHECK LOGIN. 
if (!isset($_SESSION["loged"])) { 
    $_SESSION["loged"] = false; 
} else { 
    if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { 
     if (($_SERVER['PHP_AUTH_USER'] == L_USER) && (md5($_SERVER['PHP_AUTH_PW']) == L_PASS)) { 
      $_SESSION["loged"] = true; 
     } 
    } 
} 
if ($_SESSION["loged"] === false) { 
    header('WWW-Authenticate: Basic realm="Need authorization"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    die('<br /><br /> 
    <div style="text-align:center;"> 
     <h1 style="color:gray; margin-top:-30px;">Need authorization</h1> 
    </div>'); 
} 

Und hier ist mein 'logout .php 'code:

session_start(); 
$_SESSION["loged"] = false; // We can't use unset($_SESSION) when using HTTP_AUTH. 
session_destroy(); 
0

Sie können das Meta-Tag http-equiv="refresh" mit einer sehr kurzen Antwortzeit (z. content="1"). Diese Aktualisierung löscht alle $_POST.

if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!='myusername' || $_SERVER['PHP_AUTH_PW']!='mypassword' || isset($_POST['logout'])) { 
    header('WWW-Authenticate: Basic realm="My protected area"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    echo '<html><head><title>401 Unauthorized</title><meta http-equiv="refresh" content="1"></head><body><h1>401 Unauthorized</h1><p>You are not allowed to see this page. Reload the page to try again.</p></body></html>'; 
    exit(); 
}