Honig Brot: Kann ich eine .htaccess-geschützte PHP-Datei durch ein Script ausführen?

Liebes Forum

Nochmals eine Frage:

Kann ich eine .htaccess-geschützte PHP-Datei, die auf einem Webserver liegt, durch ein lokales php-Script (auf meinem pc) aufrufen und zwar so, dass ich nicht jedesmal das Passwort eingeben muss? D.h. kann ich das Passwort irgendwie ins lokale Script schreiben und dann übergeben?

Vielen Dank für eure Hilfe

Grüsse
Honig

  1. Hi,

    Ich hab wenig Ahnung davon, aber vielleicht hilft dir das weiter:
    http://forum.fachinformatiker.de/showthread.php?t=67743
    {link:http://www.php-resource.de/forum/showthread/t-37847.html]

    MfG Hopsel

  2. Hallo Brot,

    D.h. kann ich das Passwort irgendwie ins lokale Script schreiben und dann übergeben?

    Ja - das ist machbar: Öffne mit fsockopen() eine Verbindung zu dem Server. Alles weitere läßt sich unter ftp://ftp.isi.edu/in-notes/rfc2617.txt erfahren (base64_encode() wirst Du auch benötigen ;).

    Gruß aus Berlin!
    eddi

    1. Hallo Eddi

      Ja - das ist machbar: Öffne mit fsockopen() eine Verbindung zu dem Server. Alles weitere läßt sich unter ftp://ftp.isi.edu/in-notes/rfc2617.txt erfahren (base64_encode() wirst Du auch benötigen ;).

      Tönt gut, vielen Dank. Nur bin ich etwas überfordert. In der Textdatei weiss ich nicht genau, wo ich suchen soll. fsockopen kommt dort nirgends vor. Hast du vielleicht gleich ein Beispiel zur Hand, wie das Script ungefähr aussehen könnte?

      Wie gesagt: ich möchte einfach auf meinem lokalen PC ein php-script laufen lassen, das ein anderes, auf dem serverliegendes .htaccess-geschütztes script aufruft.

      vielen dank.

      Grüsse
      Honig

      1. Re:

        Wie gesagt: ich möchte einfach auf meinem lokalen PC ein php-script laufen lassen, das ein anderes, auf dem serverliegendes .htaccess-geschütztes script aufruft.

          
        $f=fsockopen('eddi.to-grip.de',80);  
        fputs($f,"GET /eddi.php HTTP/1.1\r\n");  
        fputs($f,"Host: eddi.to-grip.de\r\n");  
        fputs($f,"Authorization: Basic ".base64_encode('eddi:eddi')."\r\n\r\n");  
        while (!feof($f))  
           {  
           echo fgets($f, 4096);  
           echo  
           }  
        fclose($f);  
        
        

        Allerdings bin ich wohl heute ein wenig mit dem Klammerbeutel gepudert. Natürlich funktioniert für den einfachen Aufruf auch readfiel('http://susi:sorglos@was.weiss.ich/'); unter der Voraussetzung allow_url_fopen ist mit "On" konfiguriert.

        Gruß aus Berlin!
        eddi

        1. In Berichtigung:

            
          
          > $f=fsockopen('eddi.to-grip.de',80);  
          > fputs($f,"GET /eddi.php HTTP/1.1\r\n");  
          > fputs($f,"Host: eddi.to-grip.de\r\n");  
          > fputs($f,"Authorization: Basic ".base64_encode('eddi:eddi')."\r\n\r\n");  
          > while (!feof($f))  
          >    {  
          
                echo fgets($f, 4096);  
          
          >    }  
          > fclose($f);  
          > 
          
          

          readfile('http://susi:sorglos@was.weiss.ich/');

          Gruß aus Berlin!
          eddi

        2. Hi,

          readfiel('http://susi:sorglos@was.weiss.ich/');

          Schade, daß Du das schon korrigiert hast, ich wollte gerade schreiben:
          Brille - Readfielmann ;-)

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        3. Hallo Eddi

          $f=fsockopen('eddi.to-grip.de',80);
          fputs($f,"GET /eddi.php HTTP/1.1\r\n");
          fputs($f,"Host: eddi.to-grip.de\r\n");
          fputs($f,"Authorization: Basic ".base64_encode('eddi:eddi')."\r\n\r\n");
          while (!feof($f))
             {
             echo fgets($f, 4096);
             echo
             }
          fclose($f);

            
          Danke. Leider verstehe ich das Script nicht ganz. Was passiert in der Schleife? Was wird da ausgelesen? (Das Script auf dem Server (bei dir wahrscheinlich eddi.php) soll nur ausgeführt werden).  
            
          Und was bedeutet \r\n ?  
            
          Vielen Dank. Grüsse  
            
          Honig
          
          1. Re:

            Leider verstehe ich das Script nicht ganz.

            fsockopen() Öffnet eine TCP-Verbindung und gibt einen sogenanten Resourcenhandler auf die Verbindung zurück. Eine Resouce kann dabei wie in den Funktionen des Dateisystems eine Datei auf der Festplatte sein, oder wie in diesem Fall eine Verbindung. Diese habe ich im Script in der Variable $f gespeichert. Beiden Resourcen (Datei und Verbindung) ist zu eigen, daß man aus ihnen lesen kann, aber auch in sie schreiben kann.

            fputs() "schreibt" also in diese Verbindung wie das Ablegen von Daten in eine Datei. Dabei sind die geschriebenen Daten nicht willkürlich, sondern haben einem Muster zu entsprechen. Dieses Muster wird Duch das Protokoll für Hypertexttransfer bestimmt (HTTP). Auch die Autentifizierung ist ein Teil - eine Erweiterung dieses Protokolls. Daher hatte ich Dich auch auf die entsprechende RFC verwiesen.

            Was passiert in der Schleife?

            Das oben beschriebene Öffnen der Verbindung und im Wesentlichen das Schrieben mit fputs() der Daten, also der sogenannte Header, stellen einen Request (Anfrage) dar. Der Server empfängt diesen Request und beantwortet ihn. Dafür klappert er seine Konfiguration ab und weiß, ACHTUNG die Dateiendung ".php" heißt jetzt, ich soll PHP beauftragen, nach der Datei "eddi.php" in %{DOCUMENT_ROOT}/eddi.php )¹ auf der Festplatte zu suchen und gegebenenfalls diese zu parsen.
            Jetzt kommt der wichtige Teil: PHP nimmt also seine Arbeit auf, findet das Script und arbeitet es ab. Somit hast Du remoted ein Script ausgeführt, oder anders ausgedrück das gemacht, was Dein Browser täglich machen muß ;)
            Die Daten, die PHP an den Server übergibt (üblicher Weise ein [x]HTML-Dokument) werden dem Server zur Verfügung gestellt, die dieser nun endlich servieren kann. Dazu schreibt dieser seinerseit einen Header (Response-Header) in die Verbindung und den auszuliefernden Inhalt (also das [x]HTML-Dokument).

            Was wird da ausgelesen?

            Wie oben beschreiben kann man aus einer Resouce -einer Datei gleich- lesen und schreiben. Wenn Du den Inhalt benötigst, der von PHP erstellt wurde, wirst Du den Inhalt, den der Server in die Verbindung geschreiben hat, auslesen wollen. Das geschieht in der Schleife. Dabei wird der Inhalt immer aus dem HTTP-Header am Anfang und den folgenden Inhalt bestehen - das wird also ausgelesen

            Das Script auf dem Server (bei dir wahrscheinlich eddi.php) soll nur ausgeführt werden.

            Wenn es nur um die alleinige Ausführung geht, dem (potentiell) von PHP zu erstellende Inhalt keinerlei Relevanz zukommt, kannst Du auf das Auslesen mit fgets() verzichten, wenn PHP mit ignore_user_abort() ausgeführt/konfiguriert wird.

            Und was bedeutet \r\n ?

            Das ist die zwingende, da vorgeschriebene, Endung einer HTTP-Header-Zeile (der String, der mit fputs() in die Verbindung geschrieben wurde) und bezeichnent die ACSII-Zeichen 13 und 10. Für PHP gesehen, sind dies Escape-Folgen und sind lediglich eine Erleichtrung, da man andernfalls mit chr() arbeiten müßte.

            Das klingt jetzt alles verworren und nicht gerade einfach, aber die eigentlichen Mechanismen dahinter sind es noch viel mehr ;)
            Eines solltest Du jedenfalls mitnehmen. Im Internet findest Du alles, was Du brauchst, weil sich viele Leute darum bemüht haben ihr Wissen weiter zu vermitteln. Es will aber auch gelesen werden!

            Gruß aus Berlin!
            eddi

            1. Die Schreibweise %{VARIABLE} ist die Syntax einer Servervariablen des apachen.
               In PHP würde es also $VARIABLE heißen. DOCUMENT_ROOT gibt dabei das oberste
               Verzeichnis des Webs auf der Festplatte an (vgl.: DocumentRoot
               in der Konfigurationsdatei des Servers)

            1. Hallo Eddi

              Soeben habe ich deine Antwort gelesen. Herzlichen Dank für diese sehr ausführliche und aufschlussreiche Erklärung! Jetzt ist es mir viel klarer. Ich hoffe ich finde heute abend noch Zeit, es auszuprobieren.

              Nochmals vielen Dank.

              Grüsse

              Honig Brot

            2. Hallo Eddi

              Mittlerweile habe ich dein Code ausprobiert, aber ich kriege noch nicht ganz das erhoffte Resultat.

              In meinem Browser erscheint folgendes:

              HTTP/1.1 302 Found Date: Fri, 11 Mar 2005 18:59:16 GMT Server: Apache/1.3.20 Sun Cobalt (Unix) mod_ssl/2.8.4 OpenSSL/0.9.6b PHP/4.1.2 mod_auth_pam_external/0.1 FrontPage/4.0.4.3 mod_perl/1.25 Location: http://www.domain.bla
              Transfer-Encoding: chunked Content-Type: text/html; charset=iso-8859-1 e9

              Found

              The document has moved here.

              0

              Hast du eine Ahnung woran das liegen könnte? ("The document has moved here" erscheint als Link und führt zu dem Script, das ausgeführt werden soll).

              Vielen Dank für deine Hilfe!

              Grüsse
              Honig

              1. Hallo Honig,

                HTTP/1.1 302 Found Date: Fri, 11 Mar 2005 18:59:16 GMT Server: Apache/1.3.20 Sun Cobalt (Unix) mod_ssl/2.8.4 OpenSSL/0.9.6b PHP/4.1.2 mod_auth_pam_external/0.1 FrontPage/4.0.4.3 mod_perl/1.25 Location: http://www.domain.bla
                Transfer-Encoding: chunked Content-Type: text/html; charset=iso-8859-1

                Das deutet für mich auf eine nicht korrekte Schreibweise Deines Scripts hin. (Das betrifft die erste Zeile, die mit fputs() gesendet wird.)

                Gruß aus Berlin!
                eddi

                1. Hallo Eddi

                  Das deutet für mich auf eine nicht korrekte Schreibweise Deines Scripts hin. (Das betrifft die erste Zeile, die mit fputs() gesendet wird.)

                  Hmmm... mein Script besteht eigentlich genau aus dem von dir geposteten Code (die Adressen habe ich natürlich angepasst).

                  Die folgende Zeile ist so korrekt, oder?

                  fputs($f,"Authorization: Basic ".base64_encode('benutzername:passwort')."\r\n\r\n");

                  Zu deinem anderen Vorschlag mit readfile:

                  readfile('http://susi:sorglos@was.weiss.ich/');

                  Ist susi hier der Benutzername und sorglos das Passwort?
                  Allerdings bin ich mir nicht sicher, ob bei meinem Server allow_url_fopen auf on ist. (mit phpinfo() zeigt es mir bei "local value" und "master value" eine 1 an.)

                  Grüsse
                  Honig

                  1. Re:

                    Das deutet für mich auf eine nicht korrekte Schreibweise Deines Scripts hin. (Das betrifft die erste Zeile, die mit fputs() gesendet wird.)
                    Hmmm... mein Script besteht eigentlich genau aus dem von dir geposteten Code (die Adressen habe ich natürlich angepasst).

                    Ich prezisiere mich: Das deutet für mich auf eine nicht korrekte Schreibweise Deines Scriptsname, also die aufzusuchende Pfandangabe, hin. Der Server antwortet mit "HTTP/1.1 302 Found" - ein sogenannter Redirect. Dieser Header kann auch von einem PHP-Script erzeugt werden (Beispiel: header('Location: http://was.weis.ich/');).

                    Die folgende Zeile ist so korrekt, oder?
                    fputs($f,"Authorization: Basic ".base64_encode('benutzername:passwort')."\r\n\r\n");

                    Ja.

                    readfile('http://susi:sorglos@was.weiss.ich/');
                    Ist susi hier der Benutzername und sorglos das Passwort?

                    Genau so, wie Du fragst, ist es.

                    Allerdings bin ich mir nicht sicher, ob bei meinem Server allow_url_fopen auf on ist.

                    Die Konfiguration allow_url_fopen betrifft nicht den anzusteuernden Server. Es betrifft die Konfiguration PHPs, welche für locale Ausführung des aufrufenden Scripts verantwortlich ist.

                    (mit phpinfo() zeigt es mir bei "local value" und "master value" eine 1 an.)

                    Die einzelnen Parameter, die für gewöhnlich in der php.ini angegeben werden können, sind für die Werte "On"/"Off" als boolsche Werte (TRUE/FALSE) implementiert. Sommit ist die Angabe "On" gleichbedeutent mit TRUE. if(1){echo 'huhu';} wird ebenfalls zu TRUE bei der Prüfung mit if().

                    Gruß aus Berlin!
                    eddi

                    1. Ich prezisiere mich: Das deutet für mich auf eine nicht korrekte Schreibweise Deines Scriptsname, also die aufzusuchende Pfandangabe, hin. Der Server antwortet mit "HTTP/1.1 302 Found" - ein sogenannter Redirect. Dieser Header kann auch von einem PHP-Script erzeugt werden (Beispiel: header('Location: http://was.weis.ich/');).

                      hmmm... ich weiss nicht mehr weiter. meiner meinung nach müsste die Schreibweise des Pfades korrekt sein.

                      readfile('http://susi:sorglos@was.weiss.ich/');
                      Ist susi hier der Benutzername und sorglos das Passwort?

                      Genau so, wie Du fragst, ist es.

                      Allerdings bin ich mir nicht sicher, ob bei meinem Server allow_url_fopen auf on ist.

                      Die Konfiguration allow_url_fopen betrifft nicht den anzusteuernden Server. Es betrifft die Konfiguration PHPs, welche für locale Ausführung des aufrufenden Scripts verantwortlich ist.

                      ach so. dann ist dies, kein problem, da ich bei meinem lokalen comp sowieso allow_url_fopen auf on stellen kann.
                      allerdings klappt es mit readfile trotzdem noch nicht. nicht-gschützte dateien kann ich mittlerweile ausführen, aber bei geschützten kriege ich nur folgendes:

                      Warning: readfile() [function.readfile]: HTTP request failed! HTTP/1.1 401 Authorization Required in c:...\test2.php on line 11

                      Ich weiss nicht, ob du weisst, woran das liegt. vielen dank auf jeden fall für deine bisherige hilfe!

                      grüsse
                      Honig

                      1. Re:

                        hmmm... ich weiss nicht mehr weiter. meiner meinung nach müsste die Schreibweise des Pfades korrekt sein.

                        Steht denn bei der 2. Header-Zeile (fputs($f,"Host: eddi.to-grip.de\r\n");) Dein Host? Oder besser Poste mal Deinen jetzigen Code.

                        Warning: readfile() [function.readfile]: HTTP request failed! HTTP/1.1 401 Authorization Required in c:...\test2.php on line 11

                        Ich weiss nicht, ob du weisst, woran das liegt. vielen dank auf jeden fall für deine bisherige hilfe!

                        Das ist eindeutig ein Schreibfehler entweder im Benutzernamen, oder im Passwort. Du must in readfile() die identischen Angaben, wie bei einem Login über den Browser eintragen...

                        Gruß aus Berlin!
                        eddi

                        1. Hallo Eddi

                          Steht denn bei der 2. Header-Zeile (fputs($f,"Host: eddi.to-grip.de\r\n");) Dein Host? Oder besser Poste mal Deinen jetzigen Code.

                          <?php
                          $f=fsockopen('mein_host.com',80);
                          fputs($f,"GET /verzeichnis/test.php HTTP/1.1\r\n");
                          fputs($f,"Host: mein_host.com\r\n");
                          fputs($f,"Authorization: Basic ".base64_encode('benutzername:passwort')."\r\n\r\n");
                          while (!feof($f))
                             {
                             echo fgets($f, 4096);
                             }
                          fclose($f);
                          ?>

                          Das ist eindeutig ein Schreibfehler entweder im Benutzernamen, oder im Passwort. Du must in readfile() die identischen Angaben, wie bei einem Login über den Browser eintragen...

                          Dieses Script sieht bei mir wie folgt aus:

                          <?php
                          readfile("http://benutzername:passwort@mein_host.com/verzeichnis/test.php");
                          ?>

                          Funktioniert wie gesagt nur, wenn test.php _nicht_ geschützt ist.

                          Vielen Dank.

                          Grüsse Honig

                          1. Moin Honig,

                            das ergibt für mich alles keinen Sinn. Ich glaube Dir auch, daß Du die Angaben alle richtig gesetzt hast...
                            Was mir jetzt spontan einfallen würde, ist eine falsche gesetzte Directive von mod_rewrite auf dem Server, der Deine Domain beherbergt, aber sonst endet hier mein Latein!

                            Gruß aus Berlin!
                            eddi

                            1. Guten Abend Eddi

                              das ergibt für mich alles keinen Sinn. Ich glaube Dir auch, daß Du die Angaben alle richtig gesetzt hast...
                              Was mir jetzt spontan einfallen würde, ist eine falsche gesetzte Directive von mod_rewrite auf dem Server, der Deine Domain beherbergt, aber sonst endet hier mein Latein!

                              Ja, es muss am Server liegen, der meine Domain beherbergt.
                              Auf einem anderen Server habe ich es mit readfile nun hingekriegt. Allerdings bei falschem Passwort stürtzt mein Apache gleich ab...

                              Beim Server, wo es nicht klappt, frag ich mal nach.

                              Nochmals vielen Dank für deine Hilfe.

                              Grüsse

                              Honig