2010-08-16 15 views
5

Lo configuraría donde si alguien envía una solicitud de "cierre de sesión" automáticamente los llevará a una página que dice "cerrar la sesión exitosamente". Si el cliente intenta presionar el botón Atrás o ir al área restringida, volverá a solicitar la autenticación HTTP.PHP: HTTP Basic - Cerrar sesión

Lo que tengo hasta ahora es la siguiente:

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 

El usuario exitosas visitas example.com/logout.php si ejemplo. se accede a com/restricted/index.php? logout. Cuando el usuario intenta retroceder sin embargo suceden cosas al azar, a veces pedirá autenticación HTTP dos veces (???), a veces seguirá pidiendo autenticación en un bucle (?) Y, a veces, me dejará volver como si Nunca me desconecté

Soy nuevo en cómo funcionan las sesiones pero mi entendimiento es el siguiente: si/cuando la persona es validada, almacena una variable en su sesión llamada inicio de sesión con un valor verdadero ... si recibe una solicitud GET logout, luego eliminará esa variable de sesión y volverá a logout.php ... ¿Por qué entonces cuando vuelva a hacer clic en el índice me permitirá volver a entrar sin pedir autenticación, cuando la sesión [login] supuestamente no está configurada? .

Se aprecia cualquier mejora de este código PHP. Sé que no debería usar HTTP Basic y debería incorporar SQL, pero meh. Esta es una solución temporal.

Editar: Aceptaré una solución con MySQL si se incluye un ejemplo con instrucciones. No tengo conocimiento de base de datos MySQL o PHP (aún)

+1

Sin sesiones, su mejor opción es cambiar la cadena del reino básico. – stillstanding

+0

¿No son tantos los esfuerzos solo por una solución temporal? –

+0

@stillstanding el principal problema es CUÁNDO enviarlo. Cómo distinguir una llamada de un usuario conectado y una llamada de una sesión cerrada :) –

Respuesta

1

una idea aproximada para empezar:

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

¿Cómo validar PHP_AUTH_USER y PHP_AUTH_PW sin analizar y .htpass y tal? – ParoX

+0

Si se trata de una solución temporal, y solo necesita un conjunto de nombre de usuario/contraseña, simplemente haga algo como 'if ($ _SERVER ['PHP_AUTH_USER']! = 'TheUsername' || $ _SERVER ['PHP_AUTH_PW']!= 'Thepassword') {/ * 401 de error y la salida * /} else {$ _SESSION [ 'login'] = true} ' Personalmente, no he utilizado PHP_AUTH_USER/PHP_AUTH_PW antes, tiendo a tener una forma que me pasa su nombre de usuario y contraseña a través de $ _GET o $ _POST - Mucho más simple. –

+0

@Brian guardar el inicio de sesión y pasar en el db? –

1

he encontrado una manera de evitarlo.

tengo 2 archivos: index.php y logout.php

Aquí está mi 'index.php ' código:

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

Y aquí es mi 'cierre de sesión .php 'código:

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

Puede usar la metaetiqueta http-equiv="refresh" con un tiempo de respuesta muy corto (p. Ej. content="1"). Esta actualización borrará cualquier $_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(); 
} 
Cuestiones relacionadas