PHP模拟http基本身份验证的注销功能


PHP to mimick a logout feature for http basic auth

我知道没有"真正的解决方案"可以注销http,因为它是无状态的。然而,我所需要的只是一个变通办法。我试图实现的是,当点击注销链接时,它会重定向到logout.php文件。该文件再次调用基本身份验证标头。我想让php代码传入一个伪造的密码,然后重定向到我的主页,用户将在那里"注销"。

我意识到他们实际上不会被注销,而是浏览器会尝试使用最新的身份验证凭据,这些凭据将被传递进来,并且是不正确的,因此会让用户使用有效凭据重新登录。

我基本上没有php经验,也不知道如何对传递的错误密码进行编码。

感谢您的帮助。

logout.php

<?php
    session_start();
    session_write_close();
    header('HTTP/1.1 401 Access Denied');
    header('WWW-Authenticate: Basic realm="HTTPS File Upload"');
    header('HTTP/1.0 401 Unauthorized');
    header('Location: http://www.homepage.com') 
?>

本页的示例#3可能与您想要的非常接近。

http://php.net/manual/en/features.http-auth.php

您可以采取的另一种方法是实现PHP会话。这里有一个很好的基本阅读。

http://phpmaster.com/php-sessions/

编辑-若您添加了一个PHP会话,就不需要强制使用无效凭据(是的,两者都可以)。即使您拥有的唯一会话变量是布尔值$_session["IsLoggedIn"]。使用上述变量,您可以将其添加到示例#3中的if语句中,如下所示,并通过logout.php脚本将其从会话中删除。

if (!isset($_SESSION["IsLoggedIn"]) || !isset($_SERVER['PHP_AUTH_USER']) ||
    ($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
    authenticate();
} else {
    ...
}

不要忘记使用session_start();每当您使用$_SESSION变量时,都会在页面顶部显示。

它确实有效:

<?php
if (!isset($_SERVER['PHP_AUTH_USER']) or isset($_POST['logout'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo '<h1>Access Denied!</h1>';
    exit;
} else {
    if(!($_SERVER['PHP_AUTH_USER']=='admin' and md5($_SERVER['PHP_AUTH_PW'])=='d81edf2e48ddddddddd631e374c5932d'))
    {
        header('HTTP/1.0 401 Unauthorized');
        exit;
    }
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>

<html>
<head>
</head>
<body>
<form method="POST">
<button name="logout" type="submit">Log Out</button>
</form>
</body>
</html>

Basic http auth通过在每个请求中传递用户名/密码来工作。浏览器通常会存储凭据并在每次请求中传递,因此您的解决方案不能是服务器端的,如果可能的话,您必须想办法告诉浏览器忘记凭据。

将http响应代码设置为:

401

响应标头必须包括:

WWW-Authenticate : Basic

现在,用户刷新时将被提示登录。

p.S.Chromium浏览器会提示用户仅从401代码登录,所以我会用IE进行测试。此外,私人浏览模式是你的朋友。