2010-08-16 11 views
5

Vorrei impostarlo dove, se qualcuno invia una richiesta "logout", li porterà automaticamente a una pagina che dice "logout riuscito". Se il cliente tenta di premere il pulsante Indietro o accedere all'area riservata, richiederà di nuovo l'autenticazione HTTP.PHP: HTTP Basic - Disconnetti

Quello che ho finora è questo:

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 

l'utente visita di successo example.com/logout.php se esempio. it/restricted/index.php? logout è accessibile. Quando l'utente tenta di tornare indietro, tuttavia accadono cose casuali, a volte chiederà l'autenticazione HTTP due volte (???), a volte continuerà a chiedere l'autenticazione in un ciclo (?) Ea volte mi consentirà di tornare indietro come se Non ho mai disconnesso.

Sono nuovo su come funzionano le sessioni, ma la mia comprensione è questa: Se/quando la persona viene convalidata, memorizza una variabile nella sua sessione chiamata login con un valore true ... se ottiene una richiesta GET con logout, cancellerà quella variabile di sessione e tornerà a logout.php ... Perché è allora che quando faccio clic sull'indice mi consentirà di rientrare senza chiedere l'autenticazione, quando la sessione [login] non è presumibilmente impostata .

Qualsiasi miglioramento a questo codice PHP è apprezzato. So che non dovrei usare HTTP Basic e dovrei incorporare SQL, ma meh. Questa è una soluzione temporanea.

Modifica: accetterò una soluzione con MySQL se è incluso un esempio con istruzioni. Non sono a conoscenza di database MySQL o PHP (ancora)

+1

Senza sessioni, la soluzione migliore è cambiare la stringa di base. – stillstanding

+0

Non sono tanti gli sforzi per una soluzione temporanea? –

+0

@stillstanding il problema principale è QUANDO inviarlo. Come distinguere una chiamata da un utente connesso e una chiamata da una disconnessa :) –

risposta

1

una vaga idea per iniziare si:

<?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

Come potrei convalidare PHP_AUTH_USER e PHP_AUTH_PW senza analisi e .htpass e così via? – ParoX

+0

Se è una soluzione temporanea e hai solo bisogno di un set di Username/Password, fai qualcosa come 'if ($ _SERVER ['PHP_AUTH_USER']! = 'TheUsername' || $ _SERVER ['PHP_AUTH_PW']!= 'ThePassword') {/ * 401 Error & Exit * /} else {$ _SESSION ['login'] = true} ' Personalmente, non ho usato PHP_AUTH_USER/PHP_AUTH_PW prima, tendo ad avere solo un modulo che mi passa il loro nome utente e password tramite $ _GET o $ _POST - Molto più semplice. –

+0

@Brian salva l'accesso e passa il db? –

1

Ho trovato un modo intorno ad esso.

ho 2 file: index.php e logout.php

Ecco la mia 'index.php' Codice:

# 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>'); 
} 

Ed ecco il mio 'Logout .php 'codice:

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

È possibile utilizzare il metatag http-equiv="refresh" con un tempo di risposta molto breve (ad es. content="1"). Questo aggiornamento cancellerà qualsiasi $_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(); 
}