我会设置它,如果有人发送请求“注销”,它会自动将他们带到一个“成功注销”的页面。如果客户试图按下后退按钮或转到限制区域,它将再次请求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/restricted/index.php?logout ,则用户成功访问 example.com/logout.php 。当用户尝试返回时,随机事情会发生,有时它会要求两次HTTP身份验证(???),有时它会继续要求在循环中进行身份验证(?),有时它会让我回去,就好像我从未退出。
我对会话的工作方式不熟悉,但我的理解是这样的:如果/当这个人被验证时,它会在其会话中存储一个名为login的变量,其值为true ...如果每个人都获得一个带注销的GET请求,然后它将删除该会话变量并返回logout.php ...为什么当我点击返回索引时它会让我回来而不要求进行身份验证,因为会话[登录]未被设置。
对此PHP代码的任何改进都表示赞赏。我知道我不应该使用HTTP Basic并且应该包含SQL,但是meh。这是一个临时解决方案。
编辑:如果包含带有说明的示例,我将接受MySQL的解决方案。我还没有MySQL或PHP数据库知识
答案 0 :(得分:1)
一个粗略的想法让你开始:
<?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
答案 1 :(得分:1)
我找到了解决方法。
我有2个文件: index.php 和 logout.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>');
}
这是我的' logout.php '代码:
session_start();
$_SESSION["loged"] = false; // We can't use unset($_SESSION) when using HTTP_AUTH.
session_destroy();
答案 2 :(得分:0)
您可以使用元标记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();
}