Florian: .htaccess mit PHP

Hallo,
ich habe ein Verzeichnis mit einer .htaccess-Datei geschützt, was auch einwandfrei funktioniert. Aber immer wenn man das Verzeichnis aufruft kommt dann ja dieses Benutzername und Passwort Eingabefenster. Kann man Benutzername und Passwort irgendwie mit PHP übergeben, so das das Eingabefenster wegbleibt?
MfG
Florian

  1. Hello,

    man kann mittels PHP Host-lokal darauf zugreifen; aus einem  anderen Verzeichnis.
    Die Aufforderung zur Authentifizierung kommt immer nur, wenn man direkt mit HTTP darauf zugreift.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. Hallo,
      danke für deine Antwort. Aber es geht nicht darum mit PHP darauf zuzugreifen, sondern darum, dass eine Seite aus dem geschützten Verzeichnis geöffnet werden soll, die Passworteingabe aber auf einer Seite erfolgen kann und nich ein Alert erscheint.
      Hat vielleicht jemand dafür eine Lösung?
      MfG,
      Florian

      1. Hallo Florian,

        es geht schlichtweg nicht _sauber_:

          
        header('Location: http://'.$user.':'.$pass.'@domain/'.$path,true,302);  
        
        

        Du solltest aber dabei bedenken, daß Browser dies nicht interpretieren müssen!

        Gruß aus Berlin!
        eddi

        --
        Frei nach Goethe: ... Ich bin ein Teil jener Kraft die stets das Gute will... ]:þ
        1. Schade, dass es nicht geht. Dann werde ich es so lassen oder mir doch noch MySQL angucken und das mit Sessions lösen. Trotzdem Danke für deine Antwort, dann muss ich es nicht mehr versuchen.
          MfG Florian

          1. Hallo,
            jetzt habe ich das probiert wie in Toms Antwort beschrieben:

            Das Verzeichnis sieht jetzt wie folgt aus:

            Galerie
             I-galerie.php
             I-Bilder
                 I-.htaccess
                 I-.htgroup
                 I-.htpasswd
                 I-bild1.jpg
                 I-...
                 I-Thumbnails
                        I-thumbnail1.jpg
                        I-...

            Die Datei galerie.php ist in dem nicht geschützten Verzeichnis "Galerie".
            Diese Datei zeigt Bilder aus dem geschützten Verzeichnis
            "Bilder/Thumbnails" an. Wenn ich nun die Datei galerie.php aufrufe wird der ungeschützte Teil aufgebaut. Wenn die Bilder geladen werden öffnet sich die .htaccess-Passwortabfrage. Wenn ich Toms Posting richtig verstanden habe, sollte dass ja nicht sein.
            Woran liegt das, dass trotzdem die Abfrage erscheint??
            MfG,
            Florian

            1. Hi,

              ich glaube du hast da entweder das Konzept hinter der entstehenden HTML-Seite noch nicht durchblickt und/oder Toms Vorschlag:
              Deine Lösung macht im Moment folgendes:

              1. gallery.php liefert eine HTML-Seite aus, in der sich verschiedene Image-Tags befinden
              2. Der Browser nimmt sich jedes der Images-Tags und fordert vom Server die Ressource an.
              3. Der Server sagt "oh, Passwortschutz" und fordert das Passwort an
                --> Die Bilder sind ja _nicht_ Teil des PHP-Skripts

              Was du machen musst ist wirklich mit PHP diese Dateien auszuliefern, siehe z.B. PHP-FAQ: Datei lesen bzw. PHP-FAQ: Dateidownload mit PHP (aber nur wegen der Art wie man Dateien an den Client weiterliefert).
              Statt in deinem PHP-Skript ein Tag <img src="{...}Bilder/bild1.jpg"> zu erzeugen, erzeugst du stattdessen <img src="imageloader.php?bild=bild1.jpg"> und das Skript liest dann die entsprechende Datei aus und liefert sie zurück.
              MfG
              Rouven

              --
              -------------------
              ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
              1. Hallo Rouven,
                danke für deine Erklärung.
                Das ist natürlich logisch, hätte ich selber drauf kommen müssen. Das PHP-Script macht ja nichts anderes als eine HTML-Datei zu erzeugen.
                MfG,
                Florian

              2. Mir fällt da noch eine Frage ein:
                Dauert das Laden der Bilder merkbar länger, wenn ich sie über PHP-Lesen lasse?
                Florian

                1. Hallo,

                  Dauert das Laden der Bilder merkbar länger, wenn ich sie über PHP-Lesen lasse?

                  nein.

                  Gruß aus Berlin!
                  eddi

                  --
                  Frei nach Goethe: ... Ich bin ein Teil jener Kraft die stets das Gute will... ]:þ
                  1. Hi eddi,

                    Dauert das Laden der Bilder merkbar länger, wenn ich sie über PHP-Lesen lasse?

                    nein.

                    Allerdings wird es den Server geringfügig mehr belasten, da für jedes Bild ein PHP-Prozess gestartet werden muss und dieser die Bilddatei einlesen und ausgeben muss. Aber solange es sich nicht um eine Seite mit 200 Bildern handelt, welche pro Sekunde von 20 Besuchern aufgerufen wird, dürfte sich das auch nicht wirklich bemerkbar machen ;-)

                    MfG, Dennis.

                    1. Hello,

                      Allerdings wird es den Server geringfügig mehr belasten, da für jedes Bild ein PHP-Prozess gestartet werden muss und dieser die Bilddatei einlesen und ausgeben muss. Aber solange es sich nicht um eine Seite mit 200 Bildern handelt, welche pro Sekunde von 20 Besuchern aufgerufen wird, dürfte sich das auch nicht wirklich bemerkbar machen ;-)

                      Das wird sich nicht bemerkbar machen. Es handelt sich bei den PHP-Scripten um _zusätzliche_ laufzeiten im 100-Nanosekunden-Bereich

                      Ruf mal meine Seite http://harzzeitung.de/maps/showmap.php#ID8.8 auf, und schau mal in die Statuszeile Deines Browsers. Das Bild als ganzes zu laden, geht ruckszuck.
                      siewh http://annerschbarrich.de/harzkarten/grossraum_x2.html

                      Der Einzelrequest schluckt so um die 0,1 bis 0,2 Sekunden zuzüglich Übertragungszeit. Da kommt es auf die ca. 0,0001 Sekunden für die zusätzliche Scriptladezeit nicht mehr an.

                      Selbst wenn Dein Browser die Bilder schon im Cache hat, und Du nicht "allways Cache only" eingestellt hast, dauert es. Get-Request mit last modified und Response brauchen eben ihre Zeit.

                      Harzliche Grüße vom Berg
                      http://www.annerschbarrich.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau

                      1. Vielen Dank nochmal,
                        kann mir vielleicht jemand ein Script posten, das den Bild namen als GET -Variable aus der Adresse erhält und es einfach ausgibt, so das ich es z.B. über <img src="show.php?id=0001.jpg"> einbinden kann??
                        Ich hab das leider nicht ganz verstanden, wie das Script aussehen muss...
                        Florian

                        1. Hello,

                          kann mir vielleicht jemand ein Script posten, das den Bild namen als GET -Variable aus der Adresse erhält und es einfach ausgibt, so das ich es z.B. über <img src="show.php?id=0001.jpg"> einbinden kann??
                          Ich hab das leider nicht ganz verstanden, wie das Script aussehen muss...

                          Ein einfaches, aber noch gefährliches Script würde so aussehen:

                          <?php   ###show.php###

                          if (!isset($_GET['id']))
                            {
                              $bild = 'standardbild.jpg';
                              header('Content-type: image/jpeg');
                            }
                            else
                            {
                              $bild = $_GET['id'];
                              $mimetype = mime_content_type('$bild');
                              header("Content-type: $mimetype");
                            }

                          readfile($bild);

                          ?>

                          Probleme:

                          • Die Existenz des Files muss garantiert sein
                          • Durch Angabe eines realen relativen Pfades kann so jede Datei auf dem Server
                              abgefragt werden, die für das PHP-Runtime lesbar ist.
                          • Die Funktion mime_content_type() ist nicht auf allen Systemen verfügbar

                          Harzliche Grüße vom Berg
                          http://www.annerschbarrich.de

                          Tom

                          --
                          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                          Nur selber lernen macht schlau

                          1. Hi Tom,
                            vielen Dank für das kleine Script.
                            Ich hab es leicht verändert um die Gefahren zu entfernen:

                            <?php

                            if (!isset($_GET['id']))
                              {
                                $bild = "standardbild.jpg";
                                header("Content-type: image/jpeg");readfile($bild);
                              }
                              else
                              {
                                $bild = $_GET['id'].".jpg";
                                header("Content-type: image/jpeg");

                            if(!file_exists($bild)) {
                                $bild = "standardbild.jpg"; readfile($bild);}

                            else {readfile($bild);}
                              }

                            ?>

                            Das File muss nicht mehr existieren, dann erscheint auch das Standardbild. Die Funktion mime_content_type() muss nicht verfügbar sein, weil nur jpegs ausgegeben werden. Übrigens wäre die Funktion auch verfügbar gewesen. Die Variable $bild werde ich so anpassen, dass sie aus einem festgelegten Verzeichnisnamen und dem übergebenen Namen besteht. Z.B. werde ich einbauen $bild = $folder.$GET['id'].".jpg". So kann man nicht alle Dateien auslesen, weil ja ein Bestimmtes Verzeichnis vorgegeben ist und überprüft wird ob die Datei existiert. Bei mir läuft das Script so einwandfrei.
                            Könnte es noch irgendwelche Probleme geben??
                            Florian

                            1. hi,

                              Die Variable $bild werde ich so anpassen, dass sie aus einem festgelegten Verzeichnisnamen und dem übergebenen Namen besteht. Z.B. werde ich einbauen $bild = $folder.$GET['id'].".jpg". So kann man nicht alle Dateien auslesen, weil ja ein Bestimmtes Verzeichnis vorgegeben ist

                              Dann überlege dir mal, was ein oder mehrere ../ im "Bildnamen" bewirken könnten.

                              gruß,
                              wahsaga

                              --
                              /voodoo.css:
                              #GeorgeWBush { position:absolute; bottom:-6ft; }
                              1. Hi,

                                Dann überlege dir mal, was ein oder mehrere ../ im "Bildnamen" bewirken könnten.

                                das hab ich mir auch vorhin überlegt. Dann ist mir jedoch aufgefallen, dass noch ".jpg" an das Ergebnis gehängt wird, es würde also in jedem Fall egal in welchem Verzeichnis nach einer .jpg-Datei gesucht, es sei denn es gäbe eine Möglichkeit in den String so etwas wie einen Dateinamens-Trennzeichen einzuschmuggeln, so dass man plötzlich zwei Dateien anspricht...

                                MfG
                                Rouven

                                --
                                -------------------
                                ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
                                1. Lieber Rouven,

                                  Dann überlege dir mal, was ein oder mehrere ../ im "Bildnamen" bewirken könnten.
                                  ... es sei denn es gäbe eine Möglichkeit in den String so etwas wie einen Dateinamens-Trennzeichen einzuschmuggeln, so dass man plötzlich zwei Dateien anspricht...

                                  http://bla.de/blubb/show.php?bild=../../../mein_boeses_script.php&pseudo=1234

                                  Jetzt klar?

                                  Liebe Grüße aus Ellwangen,

                                  Felix Riesterer.

                                  1. Hello,

                                    Dann überlege dir mal, was ein oder mehrere ../ im "Bildnamen" bewirken könnten.
                                    ... es sei denn es gäbe eine Möglichkeit in den String so etwas wie einen Dateinamens-Trennzeichen einzuschmuggeln, so dass man plötzlich zwei Dateien anspricht...

                                    http://bla.de/blubb/show.php?bild=../../../mein_boeses_script.php&pseudo=1234

                                    Jetzt klar?

                                    Das wird wohl nicht so funktionieren, da am & der nächste Parameter abgetrennt wird.
                                    Aber wenn Du ein Leerzeichen oder ein # in den Parameter einbaust, dann könntest Du (leider) Erfolg haben.

                                    Außerdem ist ja nicht besprochen, was die fopen-Wrapper anrichten könnten.

                                    Harzliche Grüße vom Berg
                                    http://www.annerschbarrich.de

                                    Tom

                                    --
                                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                    Nur selber lernen macht schlau

                                    1. Hi Tom,

                                      Außerdem ist ja nicht besprochen, was die fopen-Wrapper anrichten könnten.

                                      Eigentlich dürfte nicht zu viel passieren, da ja "nur" readfile() und kein include() verwendet wird - die Möglichkeit fremden Code einzuschleusen ist damit ausgeschlossen.

                                      Die einzige Gefahr könnte dann eben nur noch sein, dass Dateien vom lokalen System ausgegeben werden, die eigentlich nicht dafür gedacht sind - aber durch das .jpg im Namen ist das auf JPEG-Bilder beschränkt.

                                      MfG, Dennis.

                                      1. Hello,

                                        Die einzige Gefahr könnte dann eben nur noch sein, dass Dateien vom lokalen System ausgegeben werden, die eigentlich nicht dafür gedacht sind - aber durch das .jpg im Namen ist das auf JPEG-Bilder beschränkt.

                                        <korintenKmodus>...auf Dateien, die die Endung .jpg haben, das müssen ja keine Bilder sein. Dafür müsste man dan besser mit getimagesize() nachgucken lassen. Das irrt sich eigentlich nicht.</korintenKmodus>

                                        Und dann wäre die Verwendung eines basename() empfehlenswert, in Zusammenhang mit einem festen Pfad.

                                        Harzliche Grüße vom Berg
                                        http://www.annerschbarrich.de

                                        Tom

                                        --
                                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                        Nur selber lernen macht schlau

                                        1. Hi Tom,

                                          <korintenKmodus>...auf Dateien, die die Endung .jpg haben, das müssen ja keine Bilder sein. Dafür müsste man dan besser mit getimagesize() nachgucken lassen. Das irrt sich eigentlich nicht.</korintenKmodus>

                                          Korrekt - es wäre mir allerdings neu, dass eine Datei wie /etc/passwd jetzt /etc/passwd.jpg heißt ;-) Soll heißen, es gibt standardmäßig keine System-Datei auf die das zutrifft würde ich mal so sagen.

                                          Gefahr würde allerdings noch bestehen, wenn es dem Angreifer erst gelingen würde einen symbolischen Link namens foobar.jpg auf /etc/passwd (oder die entsprechende, gewünschte Datei) anzulegen - dann könnte er die Datei übers Web abrufen.

                                          MfG, Dennis.

                                          1. Hallo Dennis.

                                            Gefahr würde allerdings noch bestehen, wenn es dem Angreifer erst gelingen würde einen symbolischen Link namens foobar.jpg auf /etc/passwd (oder die entsprechende, gewünschte Datei) anzulegen - dann könnte er die Datei übers Web abrufen.

                                            Hm, und? Außer root darf sowieso niemand diese Datei einsehen.
                                            Und selbst wenn, die Passwörter sind dort sowieso nicht gespeichert.

                                            Einen schönen Sonntag noch.

                                            Gruß, Ashura

                                            --
                                            sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                                            „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
                                            [HTML Design Constraints: Logical Markup]
                                            1. Hi Ashura,

                                              Hm, und? Außer root darf sowieso niemand diese Datei einsehen.

                                              Ach ja?

                                              driehle@v-10040 ~ $ ls -la /etc | grep passwd
                                              -rw-r--r--   1 root root     1783 2006-04-02 15:26 passwd

                                              Und selbst wenn, die Passwörter sind dort sowieso nicht gespeichert.

                                              Nur bei installierter Shadow-Suite (was aber eigentlich Standard sein sollte) - ist ja auch egal, Fakt ist, dass es dem Angreifer gelungen ist, eine System-Datei zur Ansicht zu bekommen, das ist definitiv zu viel - denn aus der Datei könnte er z.B. sehen, welche System-Accounts existieren und sich so für einen SSH-Angriff "vorbereiten".

                                              Abgesehen davon war /etc/passwd auch nur ein Beispiel - es kann ja auch eine beliebige andere Datei ausgegeben werden, wenn man den Symlink hinbekommen hat.

                                              MfG, Dennis.

                                              1. Hallo Dennis.

                                                Hm, und? Außer root darf sowieso niemand diese Datei einsehen.

                                                Ach ja?

                                                driehle@v-10040 ~ $ ls -la /etc | grep passwd
                                                -rw-r--r--   1 root root     1783 2006-04-02 15:26 passwd

                                                Man (ich) sollte sich (mich) wirklich nicht auf die Overlay-Icons der DE verlassen. Hätte ich gleich gecated, hätte ich mir obiges gespart.

                                                Einen schönen Sonntag noch.

                                                Gruß, Ashura

                                                --
                                                sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                                                „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
                                                [HTML Design Constraints: Logical Markup]
                                                1. Hi Ashura,

                                                  Man (ich) sollte sich (mich) wirklich nicht auf die Overlay-Icons der DE verlassen. Hätte ich gleich gecated, hätte ich mir obiges gespart.

                                                  Gratulation - wunderschönes Denglisch ;-)

                                                  MfG, Den*scnr*nis.

                        2. Lieber Florian,

                          kann mir vielleicht jemand ein Script posten

                          Du bist doch nun lange genug hier im Forum unterwegs, um zu wissen, dass das hier niemand so ohne weiteres freiwillig tut, wenn von Dir keine bisherigen Lösungsansätze erkennbar sind...

                          den Bild namen als GET -Variable aus der Adresse erhält und es einfach ausgibt, so das ich es z.B. über <img src="show.php?id=0001.jpg"> einbinden kann

                          Dann wollen wir doch einmal schauen, was es mit der Variablen $_GET so auf sich hat.

                          Weitere Funktionen und Variablen sind für Dich wichtig:

                          header(), file_get_contents(), $_SERVER (vor allem der Index 'SCRIPT_NAME' könnte wertvoll sein) und für eine Sicherheitsprüfung is_file()

                          Liebe Grüße aus Ellwangen,

                          Felix Riesterer.