tysk: WWW-Authenticate

Hallo Leute,

ich möchte gerne wissen, ob folgendes möglich ist?

Um dieser Fehlermeldung zu entgehen:
Warning: fopen(http://www.testserver.de/index.php): failed to open stream: HTTP request failed! HTTP/1.1 401 Authorization Required

wobei dieses Skript zum Einsatz kommt:
$PHP_AUTH_USER = "user1234";
$PHP_AUTH_PW = "1a2b3c4d";
// Test ob PW übergeben wird: echo $PHP_AUTH_PW;
$file = fopen ("http://www.testserver.de/index.php", "r");
if (!$file) {
    echo "<p>Datei konnte nicht geöffnet werden.\n";
    exit;
}

Nun verfüge ich ja über die Zugangsdaten und möchte die Datei per fopen öffnen - nur leider erhalte ich keinen Zugriff darauf mit meiner Lösung - wer kann halfen?

Thx,
tysk

  1. Moin!

    Um dieser Fehlermeldung zu entgehen:
    Warning: fopen(http://www.testserver.de/index.php): failed to open stream: HTTP request failed! HTTP/1.1 401 Authorization Required

    ...mußt du eine HTTP-Authentifizierung an den externen Server schicken.

    wobei dieses Skript zum Einsatz kommt:

    Das Skript sende KEINE Authentifizierung an den externen Server.

    $PHP_AUTH_USER = "user1234";
    $PHP_AUTH_PW = "1a2b3c4d";

    Diese beiden Variablen enthalten die Authentifizierungdaten dann, wenn DEIN SKRIPT passwortgeschützt ist.

    Sie haben aber keinerlei Bedeutung für fopen() mit HTTP.

    Nun verfüge ich ja über die Zugangsdaten und möchte die Datei per fopen öffnen - nur leider erhalte ich keinen Zugriff darauf mit meiner Lösung - wer kann halfen?

    Guck dir die diversen Beispiele von fsockopen() an, bei denen von externen Servern mittels HTTP eine Datei abgefordert wird. Ergänze dann noch die HTTP-Authentifizierung im HTTP-Teil, und es sollte eigentlich gehen. Das Problem wird sein, dass du dich dabei mit nacktem, puren HTTP beschäftigen mußt, und obendrein auch noch mit der nicht ganz so trivialen Authentifizierung.

    Vielleicht solltest du dann doch versuchen, das Problem anderweitig zu umgehen. Würdest du beispielsweise FTP-Zugang kriegen können, wäre fopen() wieder im Rennen.

    - Sven Rautenberg

  2. Hallo tysk,

    ich möchte gerne wissen, ob folgendes möglich ist?

    So nicht, aber so ähnlich ;)

    Um dieser Fehlermeldung zu entgehen:
    Warning: fopen(http://www.testserver.de/index.php): failed to open stream: HTTP request failed! HTTP/1.1 401 Authorization Required

    wobei dieses Skript zum Einsatz kommt:

    $US="user1234";
     $PW="1a2b3c4d";

    ;
     if (!$file=@fopen("http://".$US.":".$PW."@testserver.de/index.php","r"))
               exit("<p>Datei konnte nicht geöffnet werden.\n");

    Gruß aus Berlin!
    eddi

    1. Gruß aus Berlin!
      eddi

      Es ist doch immer wieder toll, so schnelle und professionelle Hilfe hier im Forum zu erhalten ;-) Viele Grüsse in die Hauptstadt von einem Ehemaligen aus dem Wedding

    2. Hallo XaraX,

      if (!$file=@fopen("http://".$US.":".$PW."@testserver.de/index.php","r"))

      Wobei hier zu erwähnen ist, dass obiges Konstrukt kein gültiger HTTP-URI ist, sondern lediglich eine Konstruktion, die die PHP-Funktionen aus Einfachheit akzeptieren (bei FTP ist die Syntax nämlich wirklich so: ftp://benutzer:passwort@rechner:port/pfad). Vor allem sollte so ein Link auf keinen Fall an einen Browser geschickt werden, weil man sich nicht sicher sein kann, wie dieser reagiert, siehe dazu auch das Archiv.

      Viele Grüße,
      Christian

      1. Hallo Christian,

        if (!$file=@fopen("http://".$US.":".$PW."@testserver.de/index.php","r"))

        Wobei hier zu erwähnen ist, dass obiges Konstrukt kein gültiger HTTP-URI ist,

        Bitte was ist ein HTTP-URI?

        sondern lediglich eine Konstruktion, die die PHP-Funktionen aus Einfachheit akzeptieren (bei FTP ist die Syntax nämlich wirklich so:

        fopen() akzeptiert der Einfachheit halber einem etwaigen HTTP-URI der Form fopen("http://".base64_encode($US.":".$PW)."@testserver.de/index.php","r") (vgl.: http://www.w3.org/Protocols/rfc1945/rfc1945 zu http://de2.php.net/manual/en/wrappers.http.php) so rein gar nicht.

        Gruß aus Berlin!
        eddi

        1. Hallo XaraX,

          Wobei hier zu erwähnen ist, dass obiges Konstrukt kein gültiger HTTP-URI ist,

          Bitte was ist ein HTTP-URI?

          HTTP weißt Du ja sicherlich; URI == Uniform Resource Identifier. Siehe:  http://de.selfhtml.org/html/allgemein/referenzieren.htm#uri

          sondern lediglich eine Konstruktion, die die PHP-Funktionen aus Einfachheit akzeptieren (bei FTP ist die Syntax nämlich wirklich so:

          fopen() akzeptiert der Einfachheit halber einem etwaigen HTTP-URI der Form fopen("http://".base64_encode($US.":".$PW)."@testserver.de/index.php","r") (vgl.: http://www.w3.org/Protocols/rfc1945/rfc1945 zu http://de2.php.net/manual/en/wrappers.http.php) so rein gar nicht.

          Wo bitteschön hast Du das base64_encode her?

          Ich wollte lediglich folgendes sagen:

          - Bei FTP kann man dem Client-Programm über die Syntax ftp://benutzer:passwort@rechner:port/pfad den Benutzernamen und das Passwort gleich mitteilen.
           - Bei HTTP ist ein Konstrukt http://benutzer:passwort@rechner:port/pfad ungültig. (Siehe http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.2 - dort steht nichts von Benutzernamen oder Passwort)
           - PHP akzeptiert dennoch (der Einfachheit halber) Konstrukte der Form http://benutzer:passwort@rechner:port/pfad, da man sonst für den HTTP-Benutzernamen und das HTTP-Passwort in die Funktion Extra-Parameter hätte einbauen müssen.

          Viele Grüße,
          Christian

          1. Hallo Christian,

            Bitte was ist ein HTTP-URI?

            HTTP weißt Du ja sicherlich; URI == Uniform Resource Identifier. Siehe:  http://de.selfhtml.org/html/allgemein/referenzieren.htm#uri

            Ach so :) Ich dachte, jetzt in eine ganz andere Richtung.

            sondern lediglich eine Konstruktion, die die PHP-Funktionen aus Einfachheit akzeptieren (bei FTP ist die Syntax nämlich wirklich so:

            fopen() akzeptiert der Einfachheit halber einem etwaigen HTTP-URI der Form fopen("http://".base64_encode($US.":".$PW)."@testserver.de/index.php","r") (vgl.: http://www.w3.org/Protocols/rfc1945/rfc1945 zu http://de2.php.net/manual/en/wrappers.http.php) so rein gar nicht.

            Wo bitteschön hast Du das base64_encode her?

            RFC 1945 zu HTTP 1.0 Abschnitt 11 "Access Authentication" nicht gelesen?

            Ich wollte lediglich folgendes sagen:

            • Bei FTP kann man dem Client-Programm über die Syntax ftp://benutzer:passwort@rechner:port/pfad den Benutzernamen und das Passwort gleich mitteilen.
            • Bei HTTP ist ein Konstrukt http://benutzer:passwort@rechner:port/pfad ungültig. (Siehe http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.2 - dort steht nichts von Benutzernamen oder Passwort)

            Laut http://de2.php.net/manual/en/wrappers.http.php ist die auch irrelevat; was Deinem Gedankengang zwecks User:Passwd nicht berührt.

            • PHP akzeptiert dennoch (der Einfachheit halber) Konstrukte der Form http://benutzer:passwort@rechner:port/pfad, da man sonst für den HTTP-Benutzernamen und das HTTP-Passwort in die Funktion Extra-Parameter hätte einbauen müssen.

            Der Einfachheit halber - hört sich für mich an, als hätte man bei fopen() eine schwerere Alternative.
            Schlußendlich stimme ich Dir zu, wenn Du Dich auf Browser beziehst, in Ermangelung einer Alternative beim Gebrauch von fopen() stört mich aber gerade das "der Einfachheit halber" ;)

            Gruß aus Berlin!
            eddi

            1. Hallo eddie,

              Wo bitteschön hast Du das base64_encode her?

              RFC 1945 zu HTTP 1.0 Abschnitt 11 "Access Authentication" nicht gelesen?

              Doch. Und in RFC 2617 (die Spezifikation zur Authentifizierung in HTTP/1.1) steht auch etwas von wegen base64, allerdings verstehe ich Deinen Bezug nicht?

              Laut http://de2.php.net/manual/en/wrappers.http.php ist die auch irrelevat;

              Hmmm? Wo steht da, dass die irrelevant ist? RFC2616 ist der RFC, der offiziell spezifiziert, wie ein HTTP-URI auszusehen hat. Wenn ich davon spreche, dass irgendwas kein gültiger URI ist, dann führe ich die Betrachtung rein theoretisch durch (d.h. ich vergleiche den URI mit dem Standard); natürlich weiß ich, dass diverse Programme diese Art von "Erweiterung" trotzdem verstehen.

              Der Einfachheit halber - hört sich für mich an, als hätte man bei fopen() eine schwerere Alternative.

              Ja, beispielsweise fopen ('http://.../', 'r', $user, $passwort); - was allerdings ziemlich inkonsistent gegenüber anderen Protokollen wäre.

              Schlußendlich stimme ich Dir zu, wenn Du Dich auf Browser beziehst, in Ermangelung einer Alternative beim Gebrauch von fopen() stört mich aber gerade das "der Einfachheit halber" ;)

              Ich habe nicht gesagt, dass ich das Verhalten von PHP schlecht finde und "der Einfachheit halber" habe ich absolut nicht abwertend, sondern in diesem Fall eher aufwertend gemeint. Ich wollte in meiner Antwort auf Dein Posting nur zusätzlich drauf hinweisen, dass man diese Konstruktion bei PHP zwar bedenkenlos verwenden kann, bei etwas anderem aber tunlichst die Finger davon lassen sollte.

              Viele Grüße,
              Christian

              1. Guten Morgen Christian, :)

                Wo bitteschön hast Du das base64_encode her?

                RFC 1945 zu HTTP 1.0 Abschnitt 11 "Access Authentication" nicht gelesen?

                Doch. Und in RFC 2617 (die Spezifikation zur Authentifizierung in HTTP/1.1) steht auch etwas von wegen base64, allerdings verstehe ich Deinen Bezug nicht?

                Das erklärt sich aus:

                Ach so :) Ich dachte, jetzt in eine ganz andere Richtung.

                Laut http://de2.php.net/manual/en/wrappers.http.php ist die auch irrelevat;

                Hmmm? Wo steht da, dass die irrelevant ist?

                Das ist das zweite mal, daß ich den Eindruck habe, Du liest die von mir referenzierten Dokumente nicht. Lese bitte und vergleiche welche HTTP-Version Du im Gegensatz zu PHP zugrunde legst...

                Der Einfachheit halber - hört sich für mich an, als hätte man bei fopen() eine schwerere Alternative.

                Ja, beispielsweise fopen ('http://.../', 'r', $user, $passwort); - was allerdings ziemlich inkonsistent gegenüber anderen Protokollen wäre.

                Welche Beispiele hast Du denn noch so? Das Beispiel jedenfall läßt sich auf Linux mit apache2 PHP 4.3.4 als Handler NICHT nachvollziehen:

                Fehlermeldung:

                Warning: fopen() expects parameter 4 to be resource, string given in t.php on line 2

                Warning: fread(): supplied argument is not a valid stream resource in t.php on line 2

                t.php

                <?php
                echo fread(fopen('http://eddi/read.php','r','eddi','susi'),50000);
                ?>

                read.php

                <?php
                  if (!isset($_SERVER['PHP_AUTH_USER'])) {
                       Header("WWW-Authenticate: Basic realm="My Realm"");
                       Header("HTTP/1.0 401 Unauthorized");
                       echo "Text to send if user hits Cancel button\n";
                       exit;
                       } else {
                   echo "Hello {$_SERVER['PHP_AUTH_USER']}";
                   echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
                  }
                ?>

                Folgende Ausgabe ergibt sich jedoch im ursprünlichen Beispiel:

                Hello eddi

                You entered susi as your password.

                t.php

                <?php
                echo fread(fopen('http://eddi:susi@eddi/read.php','r'),50000);
                ?>

                Schlußendlich stimme ich Dir zu, wenn Du Dich auf Browser beziehst, in Ermangelung einer Alternative beim Gebrauch von fopen() stört mich aber gerade das "der Einfachheit halber" ;)

                Ich habe nicht gesagt, dass ich das Verhalten von PHP schlecht finde

                Ich habe nicht behauptet, Du hättest dies behauptet.

                und "der Einfachheit halber" habe ich absolut nicht abwertend, sondern in diesem Fall eher aufwertend gemeint.

                Es tut mir leid, ich kann darin KEINE Wertung erkennen. So habe ich es auch nicht verstanden ;)

                Gruß aus Berlin!
                eddi

                1. Hallo eddie,

                  Das ist das zweite mal, daß ich den Eindruck habe, Du liest die von mir referenzierten Dokumente nicht. Lese bitte und vergleiche welche HTTP-Version Du im Gegensatz zu PHP zugrunde legst...

                  Ich wollte nur sagen, dass in RFC 1945 (HTTP/1.0) und RFC 2617 (HTTP/1.1) das gleiche steht: Wenn Benutzername und Passwort im Header mitgesendet werden, dann sind sie mit Base64 zu kodieren.

                  Ja, beispielsweise fopen ('http://.../', 'r', $user, $passwort); - was allerdings ziemlich inkonsistent gegenüber anderen Protokollen wäre.

                  Welche Beispiele hast Du denn noch so? Das Beispiel jedenfall läßt sich auf Linux mit apache2 PHP 4.3.4 als Handler NICHT nachvollziehen:

                  Klar, das war ja auch nur ein Beispiel, wie die von PHP das theoretisch hätten machen _können_, ich habe nie behauptet, das funktioniert.

                  Viele Grüße,
                  Christian

                  1. Hallo Christian,

                    Klar, das war ja auch nur ein Beispiel, wie die von PHP das theoretisch hätten machen _können_, ich habe nie behauptet, das funktioniert.

                    Kurz: Das stellt sich für mich völlig anders da, da zumindest von meiner Seite aus die Rede von Alternativen war. Da sind theoretische Beispiele, die nicht als solche zu erkennen sind, denkbar ungeeignet das Wort "aus Einfachheit" zu beleuchten.

                    Da Deine Antwort nicht in meine grundlegenden Gedanken zum Kontext passen, wiederhole ich es gerne nochmal:

                    Schlußendlich stimme ich Dir zu, wenn Du Dich auf Browser beziehst, in Ermangelung einer Alternative beim Gebrauch von fopen() stört mich aber gerade das "der Einfachheit halber" ;)

                    Und um auch das noch kurz zu klären, ich sehe einfach nicht, wenn Du HTTP-URI schreibst, was das mit einem string in PHP zu tun haben soll, der lediglich wrapper-gerecht sein muß und daher einen Vergleich zu einem URI schlichtweg spottet...

                    Gruß aus Berlin!
                    eddi

                    1. Hallo XaraX,

                      Und um auch das noch kurz zu klären, ich sehe einfach nicht, wenn Du HTTP-URI schreibst, was das mit einem string in PHP zu tun haben soll, der lediglich wrapper-gerecht sein muß und daher einen Vergleich zu einem URI schlichtweg spottet...

                      Jetzt verstehe ich endlich, was Du mit Deinen Antworten meintest. Genau das, was Du hier gesagt hast, dass das nichts anderes als ein String in PHP ist und _kein_ URI, wollte ich mit meiner ersten Antwort sagen. Denn in Deinem Ausgangsposting stand nur (ohne Kommentar):

                      if (!$file=@fopen("http://".$US.":".$PW."@testserver.de/index.php","r"))

                      Daraus hätte man als Leser schließen _können_, dass das nicht nur bei PHP so gilt, sondern auch in Browsern verwendet werden kann. Und das wollte ich lediglich um genau diese Zusatzinformation ergänzen, dass das halt nur bei PHP so ist. Deine Reaktion auf meine Antwort hat mich so derart verwirrt, dass wir beide uns dann verrannt haben.

                      Viele Grüße,
                      Christian

  3. Moin,

    Nun verfüge ich ja über die Zugangsdaten und möchte die Datei per fopen öffnen - nur leider erhalte ich keinen Zugriff darauf mit meiner Lösung - wer kann halfen?

    Wie in fast allen Fällen: Das Manual. http://de2.php.net/manual/en/wrappers.http.php

    --
    Henryk Plötz
    Grüße aus Berlin
    ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
    ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~