Zugriff auf Dateien nur der Webseite selbst erlauben
frankie
- webserver
0 Frank (no reg)0 Patrick Andrieu0 Der Martin0 frankie0 RFZ0 Der Martin
0 EKKi
Hallo Zusammen,
ich habe in einem Verzeichnis "dir1" verschiedene *.txt Dateien liegen. Diese werden von der Webseite eingebunden/ausgelesen, sollen aber NICHT direkt aufrufbar sein.
Beispiel:
Die Datei /dir1/datei1.txt wird von einem PHP Script auf derselben Seite (und im selben Verzeichnis) über "include", "fopen" ... etc eingelesen - das soll funktionieren.
Wenn aber jemand im Browser www.domain.de/dir1/datei1.txt eingibt, soll er eine Fehlermeldung erhalten (bzw. Hauptsache, die Datei nicht sehen können).
Ich vermute-te es ginge über die .htaccess - aber die möchte dann einen konkreten "User" und "Passwd" - "User" soll aber hier die Webseite sein. Kann ich ggf. "User" und "passwd" in der .htaccess einstellen und dann auf der PHP-Seite an den Server schicken?
Oder ist sowas denkbar wie:
<Files *.txt>
Order allow,deny
Deny from all
Allow from www.domain.de
</Files>
Hoffe, das war einigermaßen verständlich formuliert?
Danke für Eure Ideen.
Frank
Hi,
warum versuchst du es nicht einfach mit deiner Idee hinsichtlich .htaccess?
Du könntest die zu inkludierenden Dateien ja auch ausserhalb des Document Roots plazieren, mindestens das lokale PHP auf dem Server sollte dann mit fopen immer noch da herankommen.
Hallo frankie!
ich habe in einem Verzeichnis "dir1" verschiedene *.txt Dateien liegen. Diese werden von der Webseite eingebunden/ausgelesen, sollen aber NICHT direkt aufrufbar sein.
Den Dateien die Rechte 600 zu geben hast Du schon probiert?
Viele Grüße aus Frankfurt/Main,
Patrick
Hallo,
ich habe in einem Verzeichnis "dir1" verschiedene *.txt Dateien liegen. Diese werden von der Webseite eingebunden/ausgelesen, sollen aber NICHT direkt aufrufbar sein.
kein Problem.
<Files *.txt>
Order allow,deny
Deny from all
Allow from www.domain.de
</Files>
Die Allow-From-Direktive kannst du dir hier gern schenken; ein simples "Deny from all" würde genügen.
Denn wenn du auf die Dateien nur mit einem PHP-Script (also über das lokale Filesystem) zugreifen willst, kannst du ja den Zugriff via HTTP generell verbieten.
So long,
Martin
Danke,
habe inzwischen festgestellt:
Be *.txt Dateien funktioniert obiges Vorgehen, sie werden per fopen, include eingelesen, aber nicht mehr per HTTP ausgegeben.
ABER:
Bei Bild-Dateien (*.jpg) nicht. Hier wird auch beim <img src=...> (relative Pfadangaben) der Zugriff verweigert (behandelt der Server das wie einen externen HTTP-Aufruf?)
Wie kann ich das umgehen?
Danke nochmal
Frank
Bei Bild-Dateien (*.jpg) nicht. Hier wird auch beim <img src=...> (relative Pfadangaben) der Zugriff verweigert (behandelt der Server das wie einen externen HTTP-Aufruf?)
Er behandelt ihn nicht als solchen, es ist einer... Der Browser muss das Bild ja irgendwie vom Server bekommen.
Er behandelt ihn nicht als solchen, es ist einer... Der Browser muss das Bild ja irgendwie vom Server bekommen.
Sorry, da habe ich mich wohl unklar ausgedrückt. Dass es ein HTTP-Aufruf ist, ist klar - aber wieso ein "externer"?
Durch das "Allow from www.domain.de" dachte ich, er lässt HTTP-Anfragen der Domain selbst durch...
Das ist meine .htaccess:
<Files>
Order allow,deny
Deny from all
Allow from www.domain.de
</Files>
Wie kann ich es anders lösen?
(PS: Zur Sicherheit, die Dateien liegen in einem gesonderten Verzeichnis, nicht im Root. CHMOD kommt nicht in Frage, da teilweise andere Benutzer selbst Dateien einstellen und ich die nicht jedes Mal "chmod'en" will...)
Mahlzeit,
Sorry, da habe ich mich wohl unklar ausgedrückt. Dass es ein HTTP-Aufruf ist, ist klar - aber wieso ein "externer"?
Weil der Browser das Bild anfordert?
Durch das "Allow from www.domain.de" dachte ich, er lässt HTTP-Anfragen der Domain selbst durch...
Eine Domain kann keine Anfragen stellen. :-)
(PS: Zur Sicherheit, die Dateien liegen in einem gesonderten Verzeichnis, nicht im Root.
Außerhalb des $DOCUMENT_ROOT? Wenn ja, brauchst Du dieses ganze .htaccess-Geraffel nicht ...
MfG,
EKKi
Hallo EKKi!
Außerhalb des $DOCUMENT_ROOT? Wenn ja, brauchst Du dieses ganze .htaccess-Geraffel nicht ...
Bei vielen Webhostern ist der DOCUMENT_ROOT leider die höchste Ebene, die man via FTP erreichen kann...
Viele Grüße aus Frankfurt/Main,
Patrick
Mahlzeit,
Bei vielen Webhostern ist der DOCUMENT_ROOT leider die höchste Ebene, die man via FTP erreichen kann...
Schon klar - aber falls das nicht so ist, wäre die Auslagerung der Dateien, die eben NICHT per HTTP ausgeliefert werden sollen, in ein Verzeichnis außerhalb des $DOCUMENT_ROOT immer noch die einfachste und sicherste Methode.
MfG,
EKKi
Hi,
Sorry, da habe ich mich wohl unklar ausgedrückt. Dass es ein HTTP-Aufruf ist, ist klar - aber wieso ein "externer"?
wie die anderen gesagt haben, weils der Browser anfordert. Du könntest das Bild aber über php ausliefern, und nur den Referer Deiner Seite freischalten. Sieht etwa so aus:
$imgsrc = $_SERVER["PATH_INFO"];
if (preg_match ("#..#", $imgsrc)) { // keine uerlaubten Zeichen, hier ".."
$imgsrc = false;
}
// regex für freizuschaltende referers
elseif (!preg_match ("#(DEINEDOMAIN|DEINEANDEREDOMAIN|google)#i", $_SERVER["HTTP_REFERER"])) {
$imgsrc = false;
}
if ($imgsrc) {
$imgsrc = $_SERVER["DOCUMENT_ROOT"] . "/DEIN_DIR/" . $imgsrc;
$content_type = "image/jpeg";
} else {
$imgsrc = $_SERVER["DOCUMENT_ROOT"] . "/DEIN_DIR/unfein.png";
$content_type = "image/png";
}
header("Content-Type: " . $content_type);
header("Content-Length: " . filesize ($imgsrc));
$cache = fopen($imgsrc, "rb");
fpassthru($cache);
exit;
Zum anzeigen des Bildes dann: .../img.php/DEINBILD.jpg
Gruesse, Joachim
Hi frankie,
Durch das "Allow from www.domain.de" dachte ich, er lässt HTTP-Anfragen der Domain selbst durch...
Überlege dir mal, was das heißt: „Erlaube Zugriffe von www.example.org” (für Beispiele bitte immer example.org/net/com verwenden), die Betonung liebt hierbei auf VON. In diesem Fall ist example.org also der Webserver, auf dem deine Seite liegt. Zugriffe werden also nur von deinem Webserver aus zugelassen.
Der Besuch jedoch greift ja von sich zu Hause aus auf deine Seite zu, also z.B. von pD9049Bxx.dip.t-dialin.net (für einen T-Online Kunden). Obige Allow-Regel könnte also nur greifen, wenn der Besucher VON deinem Server aus zugreift, das wird aber nie der Fall sein.
Wenn du also Dateien komplett vor Zugriffen von irgendwelchen Besuchern schützen willst, dann ist „Deny from All” der richtige Weg. In allen anderen Fällen, wo der Besucher die Datei bekommen (z.B. ein Bild sehen) können soll, lasse ihn dieses am besten direkt aufrufen.
Eventuelle Referrer-Prüfungen sind zwar möglich, suggestiveren aber einer Sicherheit, welche unter Betrachtung der verwendeten Methode nicht gegeben ist. Insofern kann man IHMO Referrer-Prüfungen auch gleich sein lassen.
Viele Grüße,
~ Dennis.
Hallo,
Be *.txt Dateien funktioniert obiges Vorgehen, sie werden per fopen, include eingelesen, aber nicht mehr per HTTP ausgegeben.
ABER:
Bei Bild-Dateien (*.jpg) nicht.
doch, auch da.
Hier wird auch beim <img src=...> (relative Pfadangaben) der Zugriff verweigert
Natürlich, dann fordert ja der Browser des Besuchers das Bild als eine eigenständige Ressource an.
(behandelt der Server das wie einen externen HTTP-Aufruf?)
Er behandelt es nicht nur so, es IST einer. Für den Server besteht kein Zusammenhang zwischen dem Abruf eines HTML-Dokuments und dem nachfolgenden Abruf eines Bildes, das möglicherweise in diesem HTML-Dokument referenziert wird.
Analogie: Du gehst in die Bücherei und fragst nach dem Gesundheitslexikon eines bestimmten Verlags. Das bekommst du, gehst damit nach Hause und fängst an, darin zu blättern. Dann verweist das Lexikon auf ein Fachbuch über Rheuma. Also gehst du nochmal zur Bibliothek und fragst nach dem gesuchten Fachbuch.
Die Bibliothekarin kann zwar ahnen, dass du vorher das Gesundheitslexikon ausgeliehen hast, wenn sie auf Zack ist und ihre Kunden (und ihre Bücher!) kennt. Normalerweise wird sie das aber als zwei separate Vorgänge verbuchen, ein Zusammenhang wäre Spekulation.
Wie kann ich das umgehen?
Indem du auch die Bilder über ein PHP-Script durchreichen lässt. Genau so, wie du es mit deinen Textdateien auch machst.
Ciao,
Martin
Mahlzeit,
ich habe in einem Verzeichnis "dir1" verschiedene *.txt Dateien liegen. Diese werden von der Webseite eingebunden/ausgelesen, sollen aber NICHT direkt aufrufbar sein.
Dateien, die vom Webserver nicht per HTTP ausgeliefert werden sollen, haben im $DOCUMENT_ROOT absolut nichts verloren.
Ausgehend davon, dass Du Apache benutzt: Lege parallel zu Deinem "/htdocs"-Ordner einen Ordner namens z.B. "includes" an und lege dort alle Dateien hinein, die nicht per HTTP erreichbar sein sollen. Dann musst Du ggf. lediglich noch Deinem PHP mitteilen, dass es auf Dateien, die dort liegen, auch zugreifen darf (Stichwort safe mode u.ä.) ...
Ich vermute-te es ginge über die .htaccess
Sicherlich kannst Du über den Äpfeln, die Du auf die Fensterbank gelegt hast, nachträglich auch noch ein Tuch ausbreiten, so dass niemand sie sehen kann - wäre es nicht aber besser, sie gar nicht erst auf die Fensterbank zu legen?
MfG,
EKKi