Was ist der richtige Weg, um sich von einem durch HTTP-Authentifizierung geschützten Ordner abzumelden?
Es gibt Problemumgehungen, die dies erreichen können, aber sie sind möglicherweise gefährlich, da sie fehlerhaft sein können oder in bestimmten Situationen / Browsern nicht funktionieren. Deshalb suche ich nach einer richtigen und sauberen Lösung.
php
authentication
.htaccess
http-headers
password-protection
Josef Sábl
quelle
quelle
Miscellaneous -> Clear Private Data -> HTTP Authentication
Antworten:
Mu. Es gibt keinen richtigen Weg , nicht einmal einen, der über alle Browser hinweg konsistent ist.
Dies ist ein Problem, das aus der HTTP-Spezifikation (Abschnitt 15.6) stammt:
Auf der anderen Seite heißt es in Abschnitt 10.4.2 :
Mit anderen Worten, Sie können das Anmeldefeld möglicherweise erneut anzeigen (wie @Karsten sagt), aber der Browser muss Ihrer Anfrage nicht nachkommen. Verlassen Sie sich also nicht zu sehr auf diese (falsche) Funktion.
quelle
Methode, die in Safari gut funktioniert. Funktioniert auch in Firefox und Opera, jedoch mit einer Warnung.
Dadurch wird der Browser angewiesen, die URL mit dem neuen Benutzernamen zu öffnen und den vorherigen zu überschreiben.
quelle
user:password@host
ist veraltet. Nur zu verwendenhttp://[email protected]/
ist und sollte in den meisten Fällen nicht funktionieren.Die einfache Antwort lautet, dass Sie sich nicht zuverlässig von der http-Authentifizierung abmelden können.
Die lange Antwort:
Http-auth (wie der Rest der HTTP-Spezifikation) soll zustandslos sein. "Angemeldet" oder "Abgemeldet" zu sein, ist also kein wirklich sinnvolles Konzept. Der bessere Weg, dies zu sehen, besteht darin, für jede HTTP-Anforderung (und denken Sie daran, dass beim Laden einer Seite normalerweise mehrere Anforderungen erforderlich sind) zu fragen, ob Sie das tun dürfen, was Sie anfordern. Der Server sieht jede Anforderung als neu an und hat nichts mit früheren Anforderungen zu tun.
Browser haben sich entschieden, sich die Anmeldeinformationen zu merken, die Sie ihnen beim ersten 401 mitgeteilt haben, und sie ohne die ausdrückliche Erlaubnis des Benutzers bei nachfolgenden Anforderungen erneut zu senden. Dies ist ein Versuch, dem Benutzer das erwartete Modell "angemeldet / abgemeldet" zu geben, aber es ist nur ein Kludge. Es ist der Browser , der diese Beständigkeit des Zustands simuliert. Der Webserver ist sich dessen überhaupt nicht bewusst.
Das "Abmelden" im Kontext von http-auth ist also eine reine Simulation, die vom Browser bereitgestellt wird und somit außerhalb der Autorität des Servers liegt.
Ja, es gibt Kludges. Aber sie brechen die Ruhe (wenn das für Sie von Wert ist) und sie sind unzuverlässig.
Wenn Sie für Ihre Site-Authentifizierung unbedingt ein angemeldetes / abgemeldetes Modell benötigen, ist die beste Wahl ein Tracking-Cookie, bei dem der Status auf irgendeine Weise auf dem Server gespeichert bleibt (MySQL, SQLite, Flatfile usw.). Dies erfordert, dass alle Anforderungen beispielsweise mit PHP ausgewertet werden.
quelle
Problemumgehung
Sie können dies mit Javascript tun:
Was oben gemacht wird ist:
für IE - einfach den Auth-Cache leeren und irgendwo umleiten
Für andere Browser : Senden Sie eine XMLHttpRequest hinter den Kulissen mit dem Anmeldenamen und dem Kennwort "Abmelden". Wir müssen es an einen Pfad senden, der 200 OK für diese Anforderung zurückgibt (dh es sollte keine HTTP-Authentifizierung erforderlich sein).
Durch
'/where/to/redirect'
einen Pfad ersetzen, zu dem nach dem Abmelden umgeleitet werden soll, und durch'/path/that/will/return/200/OK'
einen Pfad auf Ihrer Site ersetzen , der 200 OK zurückgibt.quelle
Problemumgehung (keine saubere, nette (oder sogar funktionierende! Siehe Kommentare) Lösung):
Deaktivieren Sie seine Anmeldeinformationen einmal.
Sie können Ihre HTTP-Authentifizierungslogik nach PHP verschieben, indem Sie die entsprechenden Header senden (falls nicht angemeldet):
Und analysieren Sie die Eingabe mit:
Das einmalige Deaktivieren seiner Anmeldeinformationen sollte daher trivial sein.
quelle
Melden Sie sich in zwei Schritten von HTTP Basic Auth ab
Angenommen, ich habe einen HTTP-Basisauthentifizierungsbereich mit dem Namen "Kennwortgeschützt" und Bob ist angemeldet. Um mich abzumelden, stelle ich zwei AJAX-Anforderungen:
WWW-Authenticate: Basic realm="Password protected"
Zu diesem Zeitpunkt vergaß der Browser Bobs Anmeldeinformationen.
quelle
Meine Lösung für das Problem ist die folgende. Sie können die Funktion finden
http_digest_parse
,$realm
und$users
im zweiten Beispiel dieser Seite: http://php.net/manual/en/features.http-auth.php .quelle
Sobald ein Browser den Benutzer nach Anmeldeinformationen gefragt und diese an eine bestimmte Website übermittelt hat, wird dies in der Regel ohne weitere Aufforderung fortgesetzt. Im Gegensatz zu den verschiedenen Möglichkeiten, wie Sie Cookies auf der Clientseite löschen können, gibt es keine ähnliche Möglichkeit, den Browser aufzufordern, die angegebenen Authentifizierungsdaten zu vergessen.
quelle
Trac verwendet standardmäßig auch die HTTP-Authentifizierung. Abmelden funktioniert nicht und kann nicht behoben werden:
Von: http://trac.edgewall.org/ticket/791#comment:103
Es sieht so aus, als gäbe es keine funktionierende Antwort auf die Frage. Dieses Problem wurde vor sieben Jahren gemeldet und es ist absolut sinnvoll: HTTP ist zustandslos. Entweder wird eine Anfrage mit Authentifizierungsdaten gestellt oder nicht. Aber das ist eine Frage des Clients, der die Anfrage sendet, nicht des Servers, der sie empfängt. Der Server kann nur sagen, ob ein Anforderungs-URI autorisiert werden muss oder nicht.
quelle
Ich musste die .htaccess-Autorisierung zurücksetzen, also habe ich Folgendes verwendet:
Fand es hier: http://php.net/manual/en/features.http-auth.php
Stelle dir das vor.
Auf dieser Seite befinden sich eine Reihe von Lösungen, die unten sogar vermerkt sind: Lynx löscht die Authentifizierung nicht wie andere Browser;)
Ich habe es in meinen installierten Browsern getestet und nach dem Schließen scheint jeder Browser beim Wiedereintritt immer wieder neu zu sein.
quelle
WWW-Authenticate
das Problem verursachte und mich automatisch abmeldete.WWW-Authenticate
während der Behebung des Problems in einem Browser (Chrome) dazu führt, dass sich ein anderer Browser (Firefox) die Anmeldeinformationen merkt und sie bei der nächsten Anfrage sendet, was zu einer automatischen erneuten Anmeldung führt! Argh!Dies ist möglicherweise nicht die gesuchte Lösung, aber ich habe sie so gelöst. Ich habe 2 Skripte für den Abmeldevorgang.
logout.php
log.php
Auf diese Weise erhalte ich keine Warnung und meine Sitzung wird beendet
quelle
AFAIK, es gibt keine saubere Möglichkeit, eine "Abmelde" -Funktion zu implementieren, wenn die htaccess-Authentifizierung (dh HTTP-basierte Authentifizierung) verwendet wird.
Dies liegt daran, dass bei einer solchen Authentifizierung der Browser mithilfe des HTTP-Fehlercodes '401' darüber informiert wird, dass Anmeldeinformationen erforderlich sind. Zu diesem Zeitpunkt fordert der Browser den Benutzer zur Eingabe der Details auf. Von da an sendet der Browser bis zum Schließen immer die Anmeldeinformationen ohne weitere Aufforderung.
quelle
Die beste Lösung, die ich bisher gefunden habe, ist (es ist eine Art Pseudocode, das
$isLoggedIn
ist eine Pseudovariable für http auth):Zum Zeitpunkt der "Abmeldung" speichern Sie einfach einige Informationen in der Sitzung, die besagen, dass der Benutzer tatsächlich abgemeldet ist.
An der Stelle, an der ich nach Authentifizierung suche, erweitere ich die Bedingung:
Die Sitzung ist in gewisser Weise mit dem Status der http-Authentifizierung verknüpft, sodass der Benutzer abgemeldet bleibt, solange er den Browser geöffnet hält und die http-Authentifizierung im Browser bestehen bleibt.
quelle
Vielleicht verpasse ich den Punkt.
Der zuverlässigste Weg, die HTTP-Authentifizierung zu beenden, besteht darin, den Browser und alle Browserfenster zu schließen. Sie können ein Browserfenster mit Javascript schließen, aber ich glaube nicht, dass Sie alle Browserfenster schließen können.
quelle
Die einzige effektive Möglichkeit, die
PHP_AUTH_DIGEST
oderPHP_AUTH_USER
AND-PHP_AUTH_PW
Anmeldeinformationen zu löschen, besteht darin, den Header aufzurufenHTTP/1.1 401 Unauthorized
.quelle
Während die anderen zu Recht sagen, dass es unmöglich ist, sich von der grundlegenden http-Authentifizierung abzumelden, gibt es Möglichkeiten, eine Authentifizierung zu implementieren, die sich ähnlich verhält . Ein naheliegender Ansatz ist die Verwendung von auth_memcookie . Wenn Sie die grundlegende HTTP-Authentifizierung wirklich implementieren möchten (dh die Browser-Dialoge zum Anmelden verwenden möchten, anstatt ein HTTP-Formular zu verwenden), setzen Sie die Authentifizierung einfach auf ein separates .htaccess-geschütztes Verzeichnis, das ein PHP-Skript enthält, das zurückleitet, wohin der Benutzer gekommen ist Erstellen der Memcache-Sitzung.
quelle
Hier gibt es viele großartige - komplexe - Antworten. In meinem speziellen Fall habe ich eine saubere und einfache Lösung für das Abmelden gefunden. Ich muss noch in Edge testen. Auf meiner Seite, auf der ich mich angemeldet habe, habe ich einen ähnlichen Abmeldelink eingefügt:
Und im Kopf dieser logout.html-Seite (die auch durch .htaccess geschützt ist) habe ich eine ähnliche Seitenaktualisierung:
Wo Sie die Wörter "Abmelden" beibehalten würden, um den für die Site zwischengespeicherten Benutzernamen und das Kennwort zu löschen.
Ich gebe zu, dass, wenn mehrere Seiten von Anfang an direkt angemeldet werden müssen, jeder dieser Einstiegspunkte eine eigene entsprechende logout.html-Seite benötigt. Andernfalls können Sie die Abmeldung zentralisieren, indem Sie vor der eigentlichen Anmeldeaufforderung einen zusätzlichen Gatekeeper-Schritt in den Prozess einfügen, bei dem eine Phrase eingegeben werden muss, um ein Anmeldeziel zu erreichen.
quelle