Kaskadierende HTTP-Auth-Directories
Fabian Transchel
- https
Hallo Forum, insbesondere HTTP_Kenner ;-)
Ich habe bei mir ein wenig gebastelt und, da mein Test-Webserver permanent (mit Absicht) vom Internet erreichbar ist (Die Idee dabei ist, Leuten meine (dynamische) IP zu geben und die testen die Seiten dann...) habe ich über HTTP-Auth zwei User eingerichtet: Einmal Fabian (also ich *ggg*), der auf alles Zugriff haben sollte, und einen Gast, der auf bestimmte Ordner keinen Zugriff hat. So weit, so gut, das klappt auch prima.
Nun habe ich bei einer Unterseite aber noch einen HTTP-Auth-Mechanismus in PHP manuell gemacht. Dort wind andere Credentials gefordert, als beim "übergeordneten" HTTP 401. Der Anmeldedialog kommt auch in den meisten Browsern noch, die Anzeige der Seite jedoch nicht mehr. Ich denke nun, dass es daran liegt, dass sich die beiden HTTP-Auth-Bereich "überlagern", und die Browser zu dumm sind, die Credentials in der richtigen Reihenfolge zu senden. Das erzeugt eine 401-Endlosschleife und weg ist der Apache ;-)
Meine Frage nun: Ist es notwendig, die Credentials zu synchronisieren (d.h. das PHP-Script erfordert die gleichen Daten wie die in der .htusers...) oder geht das anders?
Ich würde nämlich ungern die gleichen Credentials benutzen, da ich das für eine (minimale) Sicherheitslücke halte. Doppelte Abfrage = doppelte Sicherheit, denke ich halt.
Grüße,
Fabian
Hallo Fabian,
Ich denke nun, dass es daran liegt, dass sich die beiden HTTP-Auth-Bereich "überlagern", und die Browser zu dumm sind, die Credentials in der richtigen Reihenfolge zu senden. Das erzeugt eine 401-Endlosschleife und weg ist der Apache ;-)
Der Browser sendet ausschließlich _einen_ Credential und der Webserver schickt dann halt immer den anderen 401er zurück. Daher die Endlosschleife. (Warum der Apache da abstürzt, ist mir allerdings schleierhaft)
Meine Frage nun: Ist es notwendig, die Credentials zu synchronisieren (d.h. das PHP-Script erfordert die gleichen Daten wie die in der .htusers...) oder geht das anders?
Nein, Du müsstest die schon »syncronisieren«.
Ich würde nämlich ungern die gleichen Credentials benutzen, da ich das für eine (minimale) Sicherheitslücke halte.
Warum? Du kannst ja immer noch nur bestimmten Benutzern Rechte vergeben. $_SERVER['REMOTE_USER'] <wink/>
Doppelte Abfrage = doppelte Sicherheit, denke ich halt.
Quatsch. ;)
Christian
Hallo,
das haben wir doch schon einmal gemeinsam ausprobiert, dass der Browser die Logindaten für jedes Verzeichnis einzeln speichern kann und dann auch immer die richtigen mitsendet.
Warum da eine Endlosschleife OHNE Benutzereingabe aufgebaut wird, ist mir nicht verständlich. Du verwendest ja keine Umleitung auf sich selbst, oder?
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi Tom,
das haben wir doch schon einmal gemeinsam ausprobiert, dass der Browser die Logindaten für jedes Verzeichnis einzeln speichern kann und dann auch immer die richtigen mitsendet.
Das ist ja das Problem: Das Verzeichnis hat _andere_ Credentials als das Script sie erfordert. Ich habe jetzt das so gelöst, dass ich, wie Christian verschlägt, nur noch auf $REMOTE_USER prüfe. Das ist allerdings nur auf meinem lokalen server praktikabel, da man dort in jedem Falle angemeldet ist, wennauch als Gast. Im "freien" Netz möchte ich es jedoch so haben, dass man (logischerweise) für das Verzeichnis sich nicht anmelden muss, das Script aber trotzdem den user Fabian erfordert. Wie bekomme ich das hin, ohne das ganze Verzeichnis per .htaccess zu schützen? Ginge es so, indem ich _nur_ die Pfad zur .htusers reinschreibe und das
AuthType Basic ganz rauslasse?
Warum da eine Endlosschleife OHNE Benutzereingabe aufgebaut wird, ist mir nicht verständlich. Du verwendest ja keine Umleitung auf sich selbst, oder?
Nein, das wundert mich auch, ist aber jetzt nicht mehr so schlimm, wenn ich auf $REMOTE_USER teste.
Fabian
Hallo Fabian,
die Credentials werden bei jedem Zugriff automatisch geprüft. Wenn si nicht mehr stimmen, wird ein 401 ausgelöst. Wenn der Client für dieses Verzeichnis Credentials hat, schickt er sie automtisch an den Server. Wenn er keine hat, klappt er das Loginfenster auf.
Bei .htaccess läuft das dann ungefähr so ab:
1. Erstanmeldung, im Client sind keine Daten bekannt, es werden also keine mitgesendet
2. Server stellt fest, dass das Verzeichnis mit .htaccess markiert ist und versucht, die Credentials vom Client zu lesen. Die sind nicht da, der Server sendet 401.
3. Der Client bekommt 401 und die URI, auf die er antworten soll. Er schaut in seiner internen Liste für diese URI nach. Es sind keine Daten da. Er incrementiert seinen Zähler für den Loginversuch auf dieser URI und klappt das Anmeldefemnster auf.
4. Du sendest die falschen Logindaten.
5. Der Server prüft und weist mit einem erneuten 401 ab
6. der Client sucht nach den Logindaten für das Verzeichnis und stellt fest, dass er weder bei 3 angekommen sit, noch das Flag für 200 gesetzt war. Er incrementiert seinen Zähler und klappt das Fenster auf.
7. Nun sendest Du die passenden Daten
8. Der Server prüft und stellt die angeforderte Datei mit einem 200 (Bsp.) zur Verfügung.
9. Der Client merkt sich das für das Verzeichnis und wird nun immer automatisch die Anmeldedaten für alle Pfade ab diesem Verzeichnis abwärts mitsenden.
10. Du hast in einem untergeordenten Verzeichnis andere Anmeldedaten.
11. Du rufst eine Datei in diesem Unterverzeichnis auf. Der Server prüft die Anmeldedaten, die der Client ja, dumm wie er ist, mitsendet.
12. Der Server prüft, weil das Verzeichnis markiert ist, und lehnt mit einem 401 ab
13. Der Client zuckt nicht einmal mit den Schultern, schaut einfach in seiner Liste nach, ob er denn dieses Verzeichnis schon gecheckt hat. Er hat nicht. Also klappt er sein fenster auf...
Den Rest kennst Du
Was ich aber nicht mehr weiß ist, ob man gleich und direkt auf das Unterverzeichnis zugreifen durfte. Ich habe den Versuch auch wiedergefunden, nur leider weiß ich Holgers PWs nicht, die er dafür eingestzt hat. Ich werde die gleich mal überschreiben und dann melde ich mich wieder.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi Tom,
danke für deine umfangreiche Erklärung, nur so weit war ich ja auch schon.
Das Problem war, dass das Script funktionieren soll, wenn auf dem lokalen Server nur angemeldete User Zugriff haben und "falsche" HTTP-Credentials gesendet werden und, wenn das Script im Netz ohne .htaccess läuft.
Ich habe einen Workaround geschrieben, der mein Problem löst:
-- Wenn HTTP-Auth angemeldeter User Fabian, bei Erfolg dann Zugriff,
-- wennicht auf PHP-Auth-Credentials prüfen, bei Erfolg dann Zugriff,
-- wennicht dann 401 schicken.
Meine Frage wäre nur, ob es nicht auch einfacher geht.
Fabian
Hi Fabian,
Nun habe ich bei einer Unterseite aber noch einen HTTP-Auth-Mechanismus in PHP manuell gemacht.
Warum? Wenn Du kaskadierende HTTP-Authentications haben willst, dann versuche doch mal, in das Unterverzeichnis einfach noch eine zweite serverseitige Authentifizierung einzubauen - mit einem anderen Realm-Namen. Was macht der Browser in diesem Fall?
Ich denke nun, dass es daran liegt, dass sich die beiden HTTP-Auth-Bereich "überlagern"
Hm. Wenn ich mir http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.47 so durchlese, wäre meine nächste Frage, ob Dein Effekt browserabhängig ist ...
Das erzeugt eine 401-Endlosschleife und weg ist der Apache ;-)
Hast Du eine aktive, ressourcenfressende 40*-Fehlerbehandlung (CGI/PHP)?
Ein Apache-Absturz sollte eigentlich nicht passieren ...
Viele Grüße
Michael