Direktzugriff auf Dateien verhindern
keinBlase
- webserver
Hallo
Ich habe auf meiner Webseite eine Downloadliste welche mir Dateien (PDF usw) des Servers anzeigt. Nach dem Klicken auf ein Listen eintrag, kann man sich die dazugehörige Datei herunterladen. Nun möchte ich dass man diese Dateien nur herunterladen kann, wenn man über die Downloadliste / Webseite kommt, aber nicht wenn man die URL der Datei direkt aufruft (ohne über die Downloadliste / Webseite gekommen zu sein).
Wie könnte ich sowas machen?
Ich benutze: Apache, Windows BS auf Server, und PHP
Danke und gruss
Hi,
Subject: Direktzugriff auf Dateien verhindern
*jeder* Zugriff auf einen HTTP-Server ist ein "Direktzugriff". Es gibt nichts anderes: HTTP ist zustandslos.
Nun möchte ich dass man diese Dateien nur herunterladen kann, wenn man über die Downloadliste / Webseite kommt, aber nicht wenn man die URL der Datei direkt aufruft (ohne über die Downloadliste / Webseite gekommen zu sein).
Wie könnte ich sowas machen?
Du könntest mit einer Session arbeiten. Aber warum den Besuchern einen Umweg aufzwingen, wenn die Daten doch frei zugänglich sind?
Cheatah
_> Du könntest mit einer Session arbeiten. Aber warum den Besuchern einen Umweg aufzwingen, wenn die Daten doch frei zugänglich sind?
Weil ich gerne den Download für mich registieren möchte, d.h. sehen möchte wann wieviel heruntergeladen wird. Gibt es keine Möglichkeit den Aufruf einer Datei via Browser zu verhindern, so dass die Datei nur erscheint wenn der Benutzer von einer bestimmten URL kommt?
Gibt es mit HtAccess eine möglichkeit?
Thx
Hallo!
Weil ich gerne den Download für mich registieren möchte, d.h. sehen möchte wann wieviel heruntergeladen wird.
Warum nicht einfach die Logfiles auswerten? Dort wird im Normalfall jeder Request protokolliert. Du kannst dann genau auswerten welche Datei wie oft angefordert wurde.
mfg
frafu
Hi,
Weil ich gerne den Download für mich registieren möchte,
siehe FraFus Antwort.
Gibt es keine Möglichkeit den Aufruf einer Datei via Browser zu verhindern, so dass die Datei nur erscheint wenn der Benutzer von einer bestimmten URL kommt?
Es gibt in HTTP kein "von". Ob man auf einen Link klickt, einen Bookmark öffnet, die Adresse per Hand eintippt oder sonstwas tut, das alles spielt nicht die geringste Rolle. Die Requests verfügen über keinerlei Unterschiede, die Dir nützen.
Gibt es mit HtAccess eine möglichkeit?
Es gibt mit HTTP keine Möglichkeit.
Cheatah
Hi
Weil ich gerne den Download für mich registieren möchte, d.h. sehen möchte wann wieviel heruntergeladen wird.
Wenn dir Logfileanalyse nicht reicht, dann schalte ein CGI vor, das ausliefert. (Hotte hats explizit erläutert)
Gibt es keine Möglichkeit den Aufruf einer Datei via Browser zu verhindern, so dass die Datei nur erscheint wenn der Benutzer von einer bestimmten URL kommt?
Theoretisch mit "Refer(r)er", praktisch nein.
Bye
Kurt
Hi
Ich habe auf meiner Webseite eine Downloadliste welche mir Dateien (PDF usw) des Servers anzeigt. Nach dem Klicken auf ein Listen eintrag, kann man sich die dazugehörige Datei herunterladen. Nun möchte ich dass man diese Dateien nur herunterladen kann, wenn man über die Downloadliste / Webseite kommt, aber nicht wenn man die URL der Datei direkt aufruft (ohne über die Downloadliste / Webseite gekommen zu sein).
Referrer arbeitet leider nicht so zuverlässig, d.h. sowas bekommst du IMHO nur durch Programmierung hin, indem du die rechte der Downloaddateien so setzt, das CGI's darauf zugreifen können aber keine "others".
Außerdem müssten deine Links ständig neucodiert werden.
CGI1 aktualisiert ständig die Downloadliste und kodiert den searchstring der links neu, die auf CGI2 weisen.
CGI2 dekodiert die links und liefert sie aus.
(CGI1 und 2 können natürlich auch ein Programm sein)
Außerdem müsstest du eine maximale Lebensdauer einer Kodierung einstellen, ist sie überschritten führt ein Downloadlink direkt wieder auf die Downloadliste.
Hört sich scheißkompliiert an, bin mal gespannt was die anderen vorschlagen...
Kurt
hallali
Ups, hab wohl das Sessionrad neu erfunden :)
Gruß
Kurt
Hallo,
Ich habe auf meiner Webseite eine Downloadliste welche mir Dateien (PDF usw) des Servers anzeigt. Nach dem Klicken auf ein Listen eintrag, kann man sich die dazugehörige Datei herunterladen. Nun möchte ich dass man diese Dateien nur herunterladen kann, wenn man über die Downloadliste / Webseite kommt, aber nicht wenn man die URL der Datei direkt aufruft (ohne über die Downloadliste / Webseite gekommen zu sein).
Sorge dafür, dass die Dateien nicht per URL erreichbar sind, also außerhalb der Webroot liegen.
Die Downloadliste erstellst Du dynamisch mit einem CGI. Ein Klick zum Download startet einen CGI-Prozess, der gibt den entsprechenden Content-type aus als header, liest die Datei im Binmode und gibt die auf STDOUT.
Viele Grüße,
Hotte
Hi
Die Downloadliste erstellst Du dynamisch mit einem CGI. Ein Klick zum Download startet einen CGI-Prozess, der gibt den entsprechenden Content-type aus als header, liest die Datei im Binmode und gibt die auf STDOUT.
hmmm das war die erste Hälfte meines Vorschlags, aber wie verhinderst du jetzt, dass die Leute das CGI direkt aufrufen statt über die Downloadliste zu gehen?
Viele Grüße,
Kurt
Hi,
Die Downloadliste erstellst Du dynamisch mit einem CGI. Ein Klick zum Download startet einen CGI-Prozess, der gibt den entsprechenden Content-type aus als header, liest die Datei im Binmode und gibt die auf STDOUT.
hmmm das war die erste Hälfte meines Vorschlags, aber wie verhinderst du jetzt, dass die Leute das CGI direkt aufrufen statt über die Downloadliste zu gehen?
Mit einer entsprechenden Kontrollstruktur über die Parameter UND deren erlaubte Werte.
Wenn es jedoch so sein soll, dass diese Liste unbedingt in einen Browser vorher geladen werden muss, bevor geklickt werden kann, würde ich einen Cookie einsetzen.
Viele Grüße,
Horst Haselhuhn
Eine Lösung für die mich warscheinlich einige Schlagen würden wäre, dass du deine PDF's in ein geheimes verzeichnis irgendwo im system legst und bei einem download eine PHP-Funktion die angeforderte Datei (ein ID-Wert z.B. dem in einer datenbank ein Dateiname zugeordnet wurde) kopiert und temporär an einen ort kopiert wo die datei dann für 30 minuten bereitliegt und danach via einer Cleanup-Funktion gelöscht wird.
Das sähe dann so aus:
Request user mit GET ID=001
Datenbank-Lookup 001=meinpdf.pdf
kopiere meinpdf.pdf nach pfad/session_meinpdf.pdf
Eintrag in die Datenbank: Session X, File meinpdf.pdf
downlod
chronjob/workarount checkt alle x minuten für abgelaufene daeien.
Ob die PDF dann allerdings in den 30 Minuten 1 mal oder 100 mal geladen wurde ist imo nicht möglich zu erfassen.
grüsse