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数据库知识(还)
一个粗略的想法,开始你:
<?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
如何验证PHP_AUTH_USER和PHP_AUTH_PW而不解析和.htpass等? – ParoX 2010-08-16 05:02:00
如果是临时解决方案,并且只需要一组用户名/密码,只需执行一些操作即可: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
@Brian保存登录并传入数据库? – 2010-08-16 05:09:33
我已经找到办法解决它。
我有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>');
}
这里是我的'注销.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();
}
没有会话,你最好的选择就是改变基本的字符串。 – stillstanding 2010-08-16 04:50:33
仅仅是一个临时的解决方案,不是很努力吗? – 2010-08-16 04:54:48
@暂时的主要问题是什么时候发送它。如何区分来自登录用户的呼叫和来自登出用户的呼叫:) – 2010-08-16 04:56:54