.htaccess mit PHP
Florian
- 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
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
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
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
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
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
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:
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
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
Mir fällt da noch eine Frage ein:
Dauert das Laden der Bilder merkbar länger, wenn ich sie über PHP-Lesen lasse?
Florian
Hallo,
Dauert das Laden der Bilder merkbar länger, wenn ich sie über PHP-Lesen lasse?
nein.
Gruß aus Berlin!
eddi
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.
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
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
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:
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
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
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
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
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.
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
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.
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
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.
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
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.
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
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.
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.