【问题标题】:PHP to mimick a logout feature for http basic authPHP 模仿 http 基本身份验证的注销功能
【发布时间】:2013-08-06 16:44:50
【问题描述】:

我知道没有“真正的解决方案”来注销 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') 
?>

【问题讨论】:

  • 你能解释一下你为什么这样做吗?这似乎非常令人费解,可能没有充分的理由。顺便说一下,HTTP 身份验证信息存储在 cookie 中。
  • 你不能取消设置持有用户身份验证的会话变量(如果你正在使用的话)?
  • 这是一个低容量页面,几个用户可以访问并登录,然后上传文件供我们访问。目前该网站根本没有注销功能,从网站基础设施的角度来看,这看起来很糟糕。我对 php 或 http 知之甚少,从这看起来像是一个合理的解决方法
  • 一个随机的想法:重定向到一个包含用户信息的 url:nobody@www.homepage.com,这样浏览器就会尝试使用它。
  • 我继承了尝试清理此站点的乐趣,似乎首先设置它的人没有存储任何登录信息,因此取消设置变量不成功

标签: php http authentication basic-authentication


【解决方案1】:

此页面上的示例 #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.net 对 PHP 程序员来说都是无价之宝
  • 示例 3 非常接近,也许我应该将其改写为,我已经成功提升了重新身份验证窗口,并想知道是否有一种方法可以编写代码自动填充错误的提示信息?示例 3 有效,除非有人只是点击浏览器上的后退按钮
【解决方案2】:

确实有效:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我对我正在尝试的工作的理解是我试图让浏览器使用错误的凭据。浏览器使用最近传递的凭据,因此通过给它错误的凭据,它会使用它们并“忘记”以前的正确凭据
    【解决方案4】:

    设置http响应码为:

    401
    

    响应头必须包括:

    WWW-Authenticate : Basic
    

    现在刷新时会提示用户登录。

    附: Chromium 浏览器将提示用户仅从 401 代码登录,因此我将使用 IE 进行测试。另外,隐私浏览模式是你的朋友。

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 2017-11-16
      • 1970-01-01
      • 2021-10-08
      • 2017-07-30
      • 2010-10-14
      • 2010-10-01
      • 2011-06-03
      • 2013-12-30
      相关资源
      最近更新 更多