質問

PHPで行われたダイジェスト認証のログアウトの方法はありますか?

私はunset($ _ server ["php_auth_digest"])を試しました($ _ server ["));しかし、それはレロギンを求めません。ブラウザを閉じると、それが機能し、ここに私の機能があります。

    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;
    }

これを終了するには、ログアウト関数に追加する必要があります。

私が領域を変更すると、それは機能しますが、私はそれを変更したくありません。

役に立ちましたか?

解決

$ _SERVER ['PHP_AUTH_DIGEST']を設定しても効果はありません。問題は、設定したタスクに対する「良い」答えが実際にはないことです。

HTTP仕様は技術的には許可されていませんが、実際には、そこにあるブラウザのほとんどは、別の401を送信すると、ユーザーを効果的に「ログアウト」します。

Netscape NavigatorとInternet Explorerの両方が、401のサーバー応答を受信すると、領域のローカルブラウザウィンドウの認証キャッシュをクリアします。これにより、ユーザーがユーザーに効果的に「ログアウト」し、ユーザー名とパスワードに再び入ることを強制できます。これを使用してログインするか、「ログアウト」ボタンを提供する人もいます。

コードから、最も単純な方法はおそらく次のようなものです。

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

しかし、繰り返しますが、これは実際にはHTTP仕様によって承認されたものではありません。

他のヒント

権威ある答え: http://tools.ietf.org/id/draft-ietf-httpbis-p7-auth-12.txt - セクション6.1
信頼できる方法はありません。

一部の回避策には、401を偽造してレルムを変更し、意図的に無効な資格情報を使用してAjax Authリクエストを確認することが含まれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top