PHP Digest auth,注销

时间:2011-01-05 04:43:38

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

有没有办法注销在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;
    }

我还需要添加到注销功能以完成此操作。

如果我改变了它的作用,但我不希望它被改变。

2 个答案:

答案 0 :(得分:10)

取消设置$ _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规范所批准的内容。

答案 1 :(得分:6)

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

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