Wowbagger: wie komme ich an user und pw nach 401???

Hi,

über $PHP_AUTH_USER sowie _PW kommt man ja bekanntlich unter PHP an die authentifizierungs-daten nach erfolgreichem login auf eine per .htaccess geschütze seite (Apache).

Schlägt die authentifizierung fehl, wird ein 401er erzeugt, welchen ich per .htaccess-direktive (ErrorDocument) auf eine eigene seite legen kann. Leider sind hier $PHP_AUTH_USER u. _PW leer :(((

Gibt es trotzdem eine möglichkeit, an die fehlerhaften daten für "user" und "passwort" zu gelangen, welche zum 401 führten???

--Micha

  1. Hi auch (long time no read),

    Schlägt die authentifizierung fehl, wird ein 401er erzeugt,
    welchen ich per .htaccess-direktive (ErrorDocument) auf eine
    eigene seite legen kann.
    Leider sind hier $PHP_AUTH_USER u. _PW leer :(((
    Gibt es trotzdem eine möglichkeit, an die fehlerhaften daten für
    "user" und "passwort" zu gelangen, welche zum 401 führten???

    Hm, ich kenne das CGI-Interface von PHP nicht, aber der Apache selbst
    schreibt im Falle eines 401 eine Menge Informationen ins Environment:

    REMOTE_ADDR=153.46.90.209
    REMOTE_PORT=4264
    REMOTE_USER=123                  (der von mir eingegebene Benutzername)

    REQUEST_METHOD=GET
    REQUEST_URI=/~ms/401/            (mein geschütztes Verzeichnis)

    REDIRECT_REDIRECT_ERROR_NOTES=user 123 not found: /~ms/401/
    REDIRECT_REDIRECT_REQUEST_METHOD=GET
    REDIRECT_REDIRECT_STATUS=401     (zu dem Thema hatten wir gerade ein Posting hier)
    REDIRECT_STATUS=401
    REDIRECT_URL=/~ms/env.pl         (mein 401-Handler, der das hier ausgibt)

    Gib doch mal Dein komplettes Environment aus, um zu isolieren, ob PHP
    die Daten gar nicht sieht oder bloß nicht durchreicht.

    Viele Grüße
          Michael

    1. Moin

      Hm, ich kenne das CGI-Interface von PHP nicht, aber der Apache selbst
      schreibt im Falle eines 401 eine Menge Informationen ins Environment:

      Nein, geht so nicht. Wenn der Webserver die Authentifizierung per .htaccess vornimmt, dann kriegt PHP die Username/Passwort-Daten nicht (über CGI sollte es auch nicht gehen). Das ist übrigens ein dokumentiertes Feature!

      Wenigstens der Username sollte im Error oder Access-Log landen.

      Wenn du das Passwort unbedingt haben willst, musst du wohl die Authentifikation mit PHP machen. Dann hast du auch mehr Kontrolle darüber was passiert.

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

      1. Hi Henryk,

        Hm, ich kenne das CGI-Interface von PHP nicht, aber der Apache selbst
        schreibt im Falle eines 401 eine Menge Informationen ins Environment:
        Nein, geht so nicht.

        Mein Posting basiert auf einer Konfiguration, mit der ich den Zugriff
        gerade hier habe laufen lassen. (Ich hätte es nicht auswendig gewußt. ;-)

        Die Benutzerkennung wird bei "401" in REMOTE_USER gesetzt.
        (Sogar dann, wenn es zu gar keiner Überprüfung gekommen ist, weil vorher
        ein interner Serverfehler aufgrtreten war - beim ersten Versuch hatte ich
        mich im Pfadnamen der User-Datei vertippt ... probier's selbst aus!)

        Wenn der Webserver die Authentifizierung per .htaccess vornimmt,
        dann kriegt PHP die Username/Passwort-Daten nicht
        Das ist übrigens ein dokumentiertes Feature!

        Daß PHP nicht an das normale Environment ran kommt?
        Das wäre dann aber ein heftiges Argument _gegen_ die Verwendung von PHP.

        Wenigstens der Username sollte im Error oder Access-Log landen.

        Das naturlich außerdem (falls entsprechendes Log-Format).

        Wenn du das Passwort unbedingt haben willst, musst du wohl die
        Authentifikation mit PHP machen.

        An das Passwort kommt man über Server Authentication natürlich generell
        nicht ran.
        Das kann ja schon deshalb nicht funktionieren, weil der Webserver es ggf.
        auch nicht kennt (es könnte ja verschlüsselt übertragen worden sein, bei
        AuthType Digest).

        Viele Grüße
              Michael

        1. Moin

          Die Benutzerkennung wird bei "401" in REMOTE_USER gesetzt.
          (Sogar dann, wenn es zu gar keiner Überprüfung gekommen ist, weil vorher
          ein interner Serverfehler aufgrtreten war - beim ersten Versuch hatte ich
          mich im Pfadnamen der User-Datei vertippt ... probier's selbst aus!)

          ok, siehe unten

          Daß PHP nicht an das normale Environment ran kommt?
          Das wäre dann aber ein heftiges Argument _gegen_ die Verwendung von PHP.

          Nein, natürlich kommst du an das Environment, nur nicht an das Passwort wenn der Server schon authentifiziert. Ich bezog mich aus dem Gedächtnis auf diesen Abschnitt aus http://www.php.net/manual/en/features.http-auth.php:
            In order to prevent someone from writing a script which reveals the password for a
            page that was authenticated through a traditional external mechanism, the PHP_AUTH
            variables will not be set if external authentication is enabled for that particular page. In
            this case, the $REMOTE_USER variable can be used to identify the
            externally-authenticated user.

          Der Teil mit dem $REMOTE_USER war mir wohl grad entfallen, weil ich es eh nie brauche :)

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

          1. HI Henryk,

            In order to prevent someone from writing a script which reveals the password for a
              page that was authenticated through a traditional external mechanism, the PHP_AUTH
              variables will not be set if external authentication is enabled for that particular page.

            mir wird der Zusammenhang zwischen diesen beiden Informationen nicht klar.

            Okay, PHP möchte verhindern, daß man ein Passwort versehentlich irgendwohin ausgibt.

            Was aber hat das damit zu tun, die Benutzerkennung zugänglich zu machen?
            Denn nur um diese Informationgeht es ja gerade.
            Eine Variable mit dem via HTTP-Authentication übertragenen Passwort kann PHP doch
            ohnehin nicht anbieten, weil ggf. nicht mal der Webserver weiß, welches Passwort
            er da gerade empfangen hat (siehe mein vorheriges Posting).

            Viele Grüße
                  Michael

            1. Moin

              Okay, PHP möchte verhindern, daß man ein Passwort versehentlich irgendwohin ausgibt.

              Nicht "versehentlich". Es soll verhindert werden dass ein Passwortgeschützter Bereich irgendwo existiert (mit einweg-gehashtem Passwort) und ein böser Bube da ein PHP-Skript reinsetzt dass Passwörter mitloggt.

              Was aber hat das damit zu tun, die Benutzerkennung zugänglich zu machen?

              Die Benutzerkennung wird nicht unzugänglich gemacht. Es stehen lediglich die Variablen $PHP_AUTH_USER und $PHP_AUTH_PW nicht zur Verfügung (die ja eigentlich nur zusammen einen Sinn haben).

              Denn nur um diese Informationgeht es ja gerade.

              Wie gesagt, $REMOTE_USER bleibt dir erhalten

              Eine Variable mit dem via HTTP-Authentication übertragenen Passwort kann PHP doch
              ohnehin nicht anbieten, weil ggf. nicht mal der Webserver weiß, welches Passwort
              er da gerade empfangen hat (siehe mein vorheriges Posting).

              Das habe ich schon im vorherigen Posting nicht verstanden: Der Webserver empfängt ein Passwort (BASE64-enkodiert) und kennt es dann nicht mehr?

              Also:
              Normaler Ablauf ohne externe Authentifizierung: mit PHP: Der Webserver empfängt Passwort und Benutzername base64-codiert, dekodiert sie und wurschtelt sie auseinander. Der PHP-Interpreter läuft an und holt sich das Passwort und den Benutzernamen beim Webserver ab. Der Benutzername landet in $REMOTE_USER und $PHP_AUTH_USER und das Passwort in $PHP_AUTH_PW.
              mit CGI/Perl: Wahrscheinlich ähnlich, bloss das die Informationen im Environment rumliegen?

              Mit externer Authentifizierung: mit PHP: Der Webserver empfängt Passwort und Benutzername, dekodiert sie, entwurschtelt sie und überprüft ob der Zugriff gewährt wird. Wenn der Zugriff gewährt wurde, zum Beispiel auf ein PHP-Skript, dann springt der PHP-Interpreter an und kriegt jetzt das Passwort _nicht_ vom Server, da die Authentifikation ja schon vorbei ist und es keinen vernünftigen Grund mehr gibt, das Passwort irgendwo hin weiterzugeben. Der Benutzername landet weiterhin in $REMOTE_USER. Das selbe sollte passieren wenn ein PHP-Skript als 401 Dokument aufgerufen wurde.
              mit CGI/Perl: hmm? Ich hoffe stark das Passwort wird auch hier nicht von Webserver rausgegeben.

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

              1. Hi Henryk,

                Das habe ich schon im vorherigen Posting nicht verstanden:

                Ich rede   von Server Authentication im Allgemeinen.
                Du  redest von Server Authentication im Modus "Basic".

                Der Webserver empfängt ein Passwort (BASE64-enkodiert) und kennt es
                dann nicht mehr?

                Das ist "Basic".

                In Digest empfängt er ein MD5-codiertes Passwort und vergleicht es mit
                dem gespeicherten, ebenfalls MD5-codierten Wert.
                Was der eigentlich bedeutete, weiß er aber nicht (wozu auch?).

                mit CGI/Perl: Wahrscheinlich ähnlich, bloss das die Informationen
                im Environment rumliegen?

                Kein Passwort (siehe oben).

                Was immer PHP als Passwort ausgibt, kann es bestenfalls dadurch bekommen,
                daß mod_php sich so tief in den Apache hinein hängt, daß es in die Tabellen
                von mod_auth hinein greift oder aus den Core-Tabellen den Original-HTTP-
                Header fischt.
                PHP via CGI sollte genauso wenig ein Passwort zu sehen bekommen wie Perl
                via CGI, denke ich mal. Ich wüßte zumindest nicht, woher die Information
                stammen sollte.

                Probier doch mal, einen Digest-geschützten Bereich zu definieren und darin
                mit PHP ein Passwort abzufragen. (M$IE 5+, Opera 4+, Mozilla 0.9.7.+)

                Viele Grüße
                      Michael

                1. Moin

                  Ich rede   von Server Authentication im Allgemeinen.
                  Du  redest von Server Authentication im Modus "Basic".

                  Ah, ok, alle Unklarheiten beseitigt. Vielleicht hätte ich das 'Only "Basic" authentication is supported at this point' noch extra erwähnen sollen :)

                  In Digest empfängt er ein MD5-codiertes Passwort und vergleicht es mit
                  dem gespeicherten, ebenfalls MD5-codierten Wert.
                  Was der eigentlich bedeutete, weiß er aber nicht (wozu auch?).

                  Hmm, auch wenn ich jetzt vor lauter Schreck nicht in der Lage war einen per Digest geschützten Bereich zu basteln (oder liegt das an Mozilla 0.9.6 ?), denk ich, ich weiss was du meinst.

                  Was immer PHP als Passwort ausgibt, kann es bestenfalls dadurch bekommen,
                  daß mod_php sich so tief in den Apache hinein hängt, daß es in die Tabellen
                  von mod_auth hinein greift oder aus den Core-Tabellen den Original-HTTP-
                  Header fischt.

                  Das ist ja das schöne an einem Server-Modul.
                  Daher hier noch eine Notlösung für Wowbagger: Mit getallheaders() holst du dir ein Array aller HTTP-Header (geht nur wenn PHP als Modul läuft). Mit etwas Glück liegt da noch ein Eintrag "Authorization" drin rum. Der enthält dann einen Base64-kodierten String bestehend aus Username, einem Doppelpunkt und dem Passwort. Also mit base64_decode() (http://www.php.net/manual/en/function.base64-decode.php) lesbar machen, und dann am : auftrennen. Schon solltest du Username und Passwort haben. (bei Basic Auth)

                  PHP via CGI sollte genauso wenig ein Passwort zu sehen bekommen wie Perl
                  via CGI, denke ich mal. Ich wüßte zumindest nicht, woher die Information
                  stammen sollte.

                  Stimmt.

                  Wenn man jedoch das PHP-Modul benutzt, sollte man damit auch Digest-Auth machen können, man muss sich die benötigten Header bloss per Hand holen.

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

                  1. Hi Henryk,

                    (oder liegt das an Mozilla 0.9.6 ?),

                    in der Changes-Liste von Mozilla 0.9.7 ist "Digest" explizit als Neuheit
                    dieser Version erwähnt. (Ist also noch "heiß").

                    Wenn man jedoch das PHP-Modul benutzt, sollte man damit auch Digest-Auth
                    machen können, man muss sich die benötigten Header bloss per Hand holen.

                    Was spricht dagegen, Digest langsam mal in PHP einzubauen (wenn die schon
                    so eine API anbieten)?

                    RFC 2617 (ftp://ftp.isi.edu/in-notes/rfc2617.txt) ist von Juni 1999.

                    Apache meint dazu in (http://httpd.apache.org/docs/mod/mod_auth_digest.html):

                    "As of this writing (October 2001), the only major browsers which support
                       digest authentication are Opera 4.0, MS Internet Explorer 5.0 and Amaya.
                       Therefore, we do not yet recommend using this feature on a large Internet
                       site. However, for personal and intra-net use, where browser users can be
                       controlled, it is ideal."

                    Viele Grüße
                          Michael

  2. ReHi Michael+Henryk,

    ja, leider lange nix mehr voneinander gehört...
    Da hab' ich ja 'ne richtige diskussion angezettelt zwischen euch beiden und dabei traten ganz interessante dinge zu tage, danke dafür ;-)

    Bis (so hoffe ich) demnächst 'mal wieder...

    --Micha