JCB: Apache öffnet Errordokument zu früh!

Schön guten Morgen :)!

Wieder steht ein glorreicher Tag bevor. - Naja ok, schaun wir mal ;). Also, mal zu meinem Problem. Als Webserver läuft der Apache 1.3.20. Wenn der Fehler 401 (falsche Authorisation) auftritt, wird ein von mir erstelltes Perl-Script aufgerufen (ErrorDocument). Läuft soweit auch ganz gut bis auf einen kleinen Fehler. Wenn man den gesperrten Bereich betreten will kommt, wie immer, die Passwortabfrage vom Apache. Doch schon bei diesem ersten Aufruf wird das Perl-Script für den Fehler 401 ausgeführt, obwohl der Fehler noch gar nicht aufgetreten ist, bzw. noch gar nicht hätte auftreten können, weil man ja noch gar keinen falschen Benutzernamen oder  falsches Passwort eingegeben hat. Ist das n Bug vom Apache oder ist das normal? Und kann man das irgendwie umgehen?

Gruß, Jan

  1. Hallo Jan,

    damit der Browser überhaupt weiß, daß eine Paßwortabfrage erfolgen soll, schickt der Server in einem solchen Fall _immer_ den Statuscode 401. Um Dir sagen zu können, ob und wie das Perlscript nur bei falscher Eingabe gestarten werden kann, kenn ich mit der Materie zu wenig aus. Aber es findet sich sicherlich noch jemand, der Dir weiterhelfen kann.

    Viele Grüße
    Carsten

  2. Moin,

    Wieder steht ein glorreicher Tag bevor. - Naja ok, schaun wir mal ;). Also, mal zu meinem Problem. Als Webserver läuft der Apache 1.3.20. Wenn der Fehler 401 (falsche Authorisation) auftritt, wird ein von mir erstelltes Perl-Script aufgerufen (ErrorDocument). Läuft soweit auch ganz gut bis auf einen kleinen Fehler. Wenn man den gesperrten Bereich betreten will kommt, wie immer, die Passwortabfrage vom Apache. Doch schon bei diesem ersten Aufruf wird das Perl-Script für den Fehler 401 ausgeführt, obwohl der Fehler noch gar nicht aufgetreten ist, bzw. noch gar nicht hätte auftreten können, weil man ja noch gar keinen falschen Benutzernamen oder  falsches Passwort eingegeben hat. Ist das n Bug vom Apache oder ist das normal? Und kann man das irgendwie umgehen?

    Noe, das ist ein Bug in deinem HTTP-Wissen.
    Hier ein kurzer Abriss was passiert wenn dein Browser eine geschützte Seite abrufen will:
    Browser an Server: Ich hätte gern /blabla.html
    Server an Browser: Öhm, die kann ich dir nicht geben weil dein Passwort falsch ist (HTTP/1.1 401 Authorization Required), du möchtest vielleicht deinen User nach einem Passwort für meinen Sicherheitsbereich "hallo" fragen (WWW-Authenticate: Basic realm="hallo"), falls du keine Ahnung hast wovon ich rede sende ich dir ausserdem noch eine verständliche Fehlermeldung für deinen Benutzer (Der Body enthält das 401 Error Document)
    Variante a) Browser kennt sich mit Passworteingaben aus
    (Browser fragt jetzt Benutzer nach Passwort)
    Subvariante a1) Der Benutzer gibt ein Passwort ein
    Browser an Server: Ich hätte gern /blabla.html, der Benutzername ist haha, das Passwort ist blublu
    Subsubvariante a1*) Das Passwort ist richtig
    Server an Browser: Alles klar (HTTP/1.1 200 OK) , hier hast du die Datei (der Body enthält die angeforderte Datei)
    Subsubvariante a1') das Passwort ist falsch
    (der ganze Spaß fängt oben von vorne an)
    Subvariante a2) Der Benutzer drückt abbrechen, identisch mit Variante b) Der Browser kennt HTTP-Auth nicht
    (Der Browser zeigt den gelieferten Body mit dem Error Document an)

    Der Browser versucht also in jedem Fall erst mal die Datei ohne Passwort abzurufen (er kann ja nicht riechen dass da ein Passwort benötigt wird), was dazu führt das der Server in jedem Fall erst mal einen 401-Statuscode liefert. Zusammen mit diesem Statuscode werden nähere Informationen zu der gewünschten Authentifizierung geliefert (im Header) und es wird ein Body mitgeliefert der menschenlesbare Informationen enthält. Da steht dann in der Regel drin "Ihr Browser kann entweder kein HTTP-Auth oder sie haben das falsche Passwort angegeben". Dein Perlskript als 401 Errordocument wird also in jedem Fall mindestens einmal aufgerufen.
    Bei weiteren Requests sendet der Browser häufig das Passwort schonmal als reine Vorsichtsmaßnahme mit, garantiert ist das aber nicht. D.h. auch bei jeder weiteren Bewegung im geschützten Bereich (etwa um Grafik, etc. zu laden) wird das Skript potentiell einmal aufgerufen.

    Its not a bug, its the standard.

    --
    Henryk Plötz
    Grüße aus Berlin