【问题标题】:PHP Digest auth, logoutPHP Digest 身份验证,注销
【发布时间】:2011-06-03 19:22:12
【问题描述】:

有没有办法退出在 php 中完成的摘要身份验证。

我试过 unset($_SERVER["PHP_AUTH_DIGEST"]); 但它不会要求重新登录。 我知道如果我关闭浏览器,它就会工作,这是我的功能。

    function login(){
        $realm = "Restricted area";
        $users = array("jamesm"=>"");
        if (empty($_SERVER["PHP_AUTH_DIGEST"])) {
            header("HTTP/1.1 401 Unauthorized");
            header("WWW-Authenticate: Digest realm=\"{$realm}\",qop=\"auth\",nonce=\"".uniqid()."\",opaque=\"".md5($realm)."\"");
            return false;
        }
        if (!($data = http_digest_parse($_SERVER["PHP_AUTH_DIGEST"])) || !isset($users[$data["username"]]))
            return false;
        $A1 = md5($data["username"] . ":{$realm}:{$users[$data["username"]]}");
        $A2 = md5($_SERVER["REQUEST_METHOD"].":{$data["uri"]}");
        $valid_response = md5("{$A1}:{$data["nonce"]}:{$data["nc"]}:{$data["cnonce"]}:{$data["qop"]}:{$A2}");
        if ($data["response"] != $valid_response)
            return false;
        return true;
    }
    function logout(){
        unset($_SERVER["PHP_AUTH_DIGEST"]);
        return true;
    }

我还需要在注销功能中添加什么来完成此操作。

如果我改变它的工作领域,但我不希望它被改变。

【问题讨论】:

  • HTTP authentication logout via PHP 的副本。答案:没有。
  • 我知道可以做到,只是不知道怎么做。
  • 关闭浏览器是唯一的方法,因为信息是在浏览器中注册的

标签: php security logout http-status-code-401 digest-authentication


【解决方案1】:

权威答案:http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - 第 6.1 节
没有可靠的方法。

一些解决方法包括伪造 401 并更改 realm=,或使用故意无效的凭据确认 AJAX 身份验证请求。

【讨论】:

  • 可能值得注意的是,这个 IETF 草案文档的相关部分是 6.1:身份验证凭据和空闲客户端
  • @JamesM:您需要通过 jQuery 启动此操作以不显示登录对话框。请求单独的logout1.php,例如发送header("Status:401 Logout")header("WWW-Authenticate: Invalidate, Basic realm=logout")。 (可选)第二个 AJAX 调用,使用无效凭据到 logout2.php,它会在不检查的情况下确认它。
  • 马里奥、Status: 401 logoutHTTP/1.1 401 Logout 他们有什么不同吗?
  • 您能否将其作为 Digest 的有效测试答案发送,您的评论是基本的,它适用于 Digest 吗?
【解决方案2】:

取消设置 $_SERVER['PHP_AUTH_DIGEST'] 将无效。问题是,对于您设置的任务,并没有真正“好的”答案。

HTTP 规范在技术上不允许这样做,但实际上,如果您向它们发送另一个 401,大多数浏览器将有效地“将用户注销”。根据 php.net/http-auth:

Netscape Navigator 和 Internet Explorer 都会在接收到服务器响应 401 时清除本地浏览器窗口的域身份验证缓存。这可以有效地“注销”用户,迫使他们重新输入用户名和密码。有些人使用它来“超时”登录,或提供“注销”按钮。

从您的代码中,最简单的方法可能是这样的:

function logout(){
    header('HTTP/1.1 401 Unauthorized');
    return true;
}

但是,这实际上并没有得到 HTTP 规范的认可。

【讨论】:

  • 它可以工作,但注销页面要求登录。并且无法通过它登录。事实上,我根本无法登录。哦,它让我退出了,只是无法再次登录。它还必须只给出 header("HTTP/1.1 401 Unauthorized");没有 www-autherticate 了。
  • 很高兴知道,我不确定 Digest 是否需要 - 我还没有在我自己的任何东西中实现 Digest。
  • 我发现像下面这样的东西对我来说很好用:codepad.org/BUJvSmnm 请注意,就我而言,我发现至少有一个浏览器(Firefox 3.6)需要 WWW-Authenticate 标头logout(),所以我将生成的 uniqid() 保存在 $_SESSION 中,以便在注销标头中使用。
  • 我错了,它仍然需要 www-autherticate,我正在测试下面的答案
猜你喜欢
  • 2015-05-25
  • 2010-11-07
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 2011-05-30
相关资源
最近更新 更多