PHP:HTTP基本 - 注销

问题描述:

我会设置它,如果有人发送请求“注销”它会自动带他们到一个页面,说“成功注销”。如果客户试图按下后退按钮或去限制区域,它会再次要求HTTP认证。PHP:HTTP基本 - 注销

我到目前为止是这样的:

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 

用户成功访问example.com/logout.php如果例子。 com/restricted/index.php?logout被访问。当用户尝试返回时发生随机事件时,有时它会要求HTTP认证两次(???),有时它会一直要求循环(?)中的认证,有时它会让我马上回去,好像是我从未注销。

我是新来的会议如何工作,但我的理解是这样的:如果/当人被验证,它存储一个变量在它的会话称为登录与值为真...如果它获得GET请求与注销,然后它会删除该会话变量,并返回到logout.php ...为什么当我点击回索引它会让我回到没有要求身份验证,当会议[登录]应该没有设置。

对此PHP代码的任何改进表示赞赏。我知道我不应该使用HTTP Basic,而应该合并SQL,但是meh。这是一个临时解决方案。

编辑:如果包含指令示例,我将接受MySQL解决方案。我没有MySQL或PHP数据库知识(还)

+1

没有会话,你最好的选择就是改变基本的字符串。 – stillstanding 2010-08-16 04:50:33

+0

仅仅是一个临时的解决方案,不是很努力吗? – 2010-08-16 04:54:48

+0

@暂时的主要问题是什么时候发送它。如何区分来自登录用户的呼叫和来自登出用户的呼叫:) – 2010-08-16 04:56:54

一个粗略的想法,开始你:

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

如何验证PHP_AUTH_USER和PHP_AUTH_PW而不解析和.htpass等? – ParoX 2010-08-16 05:02:00

+0

如果是临时解决方案,并且只需要一组用户名/密码,只需执行一些操作即可:if($ _SERVER ['PHP_AUTH_USER']!='TheUsername'|| || $ _SERVER ['PHP_AUTH_PW']!='ThePassword'){/ * 401 Error&Exit * /} else {$ _SESSION ['login'] = true}' 个人而言,我以前没有使用过PHP_AUTH_USER/PHP_AUTH_PW,我倾向于只有一张表格,他们的用户名和密码通过$ _GET或$ _POST - 更简单。 – 2010-08-16 05:07:59

+0

@Brian保存登录并传入数据库? – 2010-08-16 05:09:33

我已经找到办法解决它。

我有2个文件:的index.phplogout.php

这里是我的 '的index.php' 代码:

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

这里是我的'注销.php'code:

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

您可以使用元标记http-equiv="refresh",其响应时间非常短(例如, content="1")。此刷新将清除任何$_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(); 
}