Downloadlink absichern
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
banner
code
datei
disposition
fehler
file
frage
funktionieren
header
http
kopie
kram
leute
pfad
private header
speichern
spenden
type
url
verwenden
-
Hallo @all,
ich möchte gern bestimmt Downloads anbieten. Dabei sollt man die Datei erst downloaden können wenn man wirklich auf der Seite ist, und man auf den Button gedrückt hat.
Freue mich auf eine Lösung
schöne grüße -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Da gibt es viele Möglichkeiten:
1: Die Dateien liegen irgendwo, wo keiner hinkommt. Beim Anfordern des Downloads werden sie ins Downloadverzeichnis kopiert und dann darauf verlinkt. Dann noch die Session überprüfen. Die Datei dort nach einem Zeitfenster (10 min oder was) wieder löschen.
2: Professionel macht man das z.B. mit Servlets, die die Zieldatei binär auslesen und an den Client den Oktetstream mit passendem MIME-Header schicken. Der Link lautet dann z.B. http://meinserver.de/Downloader?id=123456, wobei Downloader ein Servlet ist. -
Jetzt kommt die Frage wie mache ich das?
-
simsobjekts schrieb:
Jetzt kommt die Frage wie mache ich das?
So, ist aber ungetestet:
Die herunterzuladende Datei sollte einen Pfad haben, auf den man normalerweise nicht kommt.
Beispiel: media/4a761fab1da62/n3m4Htbz9iySVpJ8kiLrEER.pdf
Du solltest nun auf der Downloadseite einen Hash generieren und diesen in einen Cookie oder in eine Sessionvariable legen. Prinzipiell gibt es (hier!) dabei keinen Unterschied.
Angenommen, das passiert tatsächlich in einer Datei mit Namen downloadseite.php. Ich verwende jetzt den Ansatz mit dem Hash im Cookie.
downloadseite.php
<?php $hash = md5(uniqid(mt_rand(1,time()),TRUE)); //Hash generieren $_COOKIE['dlhash'] = $hash; //den Kram in einen Cookie speichern ?> <a href="download.php?id=<?php echo $hash?>">Datei downloaden</a>
Diesen Hash musst du jetzt über den Downloadlink dem Script übergeben. Das passiert, wie du siehst, in der downloadseite.php mit dem Link.
Das Script ist das, welches die Datei einliest und wieder ausgibt. Nennen wir sie download.php.
Hier muss überprüft werden, ob der im Cookie abgelegte Hash genau der ist, der mit der URL (id=...) übergeben wurde.
Wenn ja, dann kann die Datei heruntergeladen werden.
Der Dateiname der heruntergeladenen Datei muss ebenfalls festgelegt werden. Das passiert in der 8. Zeile dieser download.php:
download.php
<?php $file = "media/4a761fab1da62/n3m4Htbz9iySVpJ8kiLrEER.pdf"; $id = $_GET['id']; if($_COOKIE['dlhash'] == $id){ header("Cache-Control: private"); header("Content-type: application/octet-stream"); header("Content-disposition: attachment; filename="dateiname_der_datei.pdf"); readfile($file); exit(); } ?>
Wie gesagt, nur schnell zusammengebastelt und ungetestet.
Noch Fragen?
gruß
ferdinand24
-
download.php
<?php $file = "media/4a761fab1da62/n3m4Htbz9iySVpJ8kiLrEER.pdf"; $id = $_GET['id']; if($_COOKIE['dlhash'] == $id){ header("Cache-Control: private"); header("Content-type: application/octet-stream"); header("Content-disposition: attachment; filename="dateiname_der_datei.pdf"); readfile($file); exit(); } ?>
Wie gesagt, nur schnell zusammengebastelt und ungetestet.
Noch Fragen?
ferdinand24
Danke Ich bin Baff
habe leider denn Fehler bekommen Parse error: parse error, unexpected T_STRING line 8
habe es dann so gelöst:
<?php $file = "http://download.lima-city.de/simsobjekts/banner.zip"; $id = $_GET['id']; if($_COOKIE['dlhash'] == $id){ header("Cache-Control: private"); header("Content-type: application/octet-stream"); header("Content-disposition: attachment; filename=\"Banner.zip\""); readfile($file); exit(); } ?>
Und geht leider auch nicht bekomme zwar keine Fehler aber nichts passiert.
Ich kenne denn Fehler nicht und weis auch nicht wie ich ihn beheben
Wenn ich mehrere Dateien habe muss ich dann jedesmal eine neues Skript machen oder kann man es auch mit nur einem?
PS: Ich habe auf deiner Seite den PPbutton gefunden Siehe info@ferdinand-malcher.de
lg
Beitrag zuletzt geändert: 9.8.2009 1:02:58 von simsobjekts -
simsobjekts schrieb:
habe leider denn Fehler bekommen Parse error: parse error, unexpected T_STRING line 8
habe es dann so gelöst:
<?php $file = "http://download.lima-city.de/simsobjekts/banner.zip"; $id = $_GET['id']; if($_COOKIE['dlhash'] == $id){ header("Cache-Control: private"); header("Content-type: application/octet-stream"); header("Content-disposition: attachment; filename=\"Banner.zip\""); readfile($file); exit(); } ?>
Und geht leider auch nicht bekomme zwar keine Fehler aber nichts passiert.
Ich kenne denn Fehler nicht und weis auch nicht wie ich ihn beheben
Da sind für den Dateinamen die falschen Quotes verwendet. Mein Fehler. Muss so heißen:
header("Content-disposition: attachment; filename='Banner.zip'");
Ich weiß allerdings nicht genau (müsste aber eigentlich funktionieren), ob es klappt, eine Datei direkt über HTTP einzulesen.
Probier es ggf. mal mit einer lokalen (also dort wo auch das Script liegt) Datei und einem relativen oder absoluten Pfad.
Ich empfehle dir außerdem noch, den Dateinamen kryptischer zu machen. Wer den Pfad zur Datei kennt, kann sie natürlich trotzdem direkt herunterladen.
Wenn ich mehrere Dateien habe muss ich dann jedesmal eine neues Skript machen oder kann man es auch mit nur einem?
Du kannst das Script natürlich entsprechend abwandeln, aber das ist dann eine (jetzt und hier) komplexere Angelegenheit.
Du müsstest dann in einer Datenbank oder einem Array die verfügbaren Datein mit einer zugehörigen ID speichern und die ID der herunterzuladenden Datei z.B. per Cookie ebenfalls übergeben.
Ich denke, für deine Zwecke ist es okay, das Script einfach mehrfach zu verwenden.
PS: Ich habe auf deiner Seite den PPbutton gefunden Siehe info@ferdinand-malcher.de
Danke ;)
gruß
ferdinand24
Beitrag zuletzt geändert: 9.8.2009 11:06:55 von ferdinand24 -
ferdinand24 schrieb:
Ich weiß allerdings nicht genau (müsste aber eigentlich funktionieren), ob es klappt, eine Datei direkt über HTTP einzulesen.
Probier es ggf. mal mit einer lokalen (also dort wo auch das Script liegt) Datei und einem relativen oder absoluten Pfad.
Ich empfehle dir außerdem noch, den Dateinamen kryptischer zu machen. Wer den Pfad zur Datei kennt, kann sie natürlich trotzdem direkt herunterladen.
Wenn ich mehrere Dateien habe muss ich dann jedesmal eine neues Skript machen oder kann man es auch mit nur einem?
Du kannst das Script natürlich entsprechend abwandeln, aber das ist dann eine (jetzt und hier) komplexere Angelegenheit.
Du müsstest dann in einer Datenbank oder einem Array die verfügbaren Datein mit einer zugehörigen ID speichern und die ID der herunterzuladenden Datei z.B. per Cookie ebenfalls übergeben.
Ich denke, für deine Zwecke ist es okay, das Script einfach mehrfach zu verwenden.
gruß
ferdinand24
Habe ich jetzt ausprobiert aber leider kommt die Datei nicht an sprich keine Downloadfenster.
Ich möchte gerne so ein Membersytem machen und da wäre es super wenn die Leute die auch nur Member sind die Datei Downloaden können.Daher war die Idee Super mit dem Cookie. Ich plane in Zukunft mehere Dateien für Member bereit zustellen und daher glaube ich das diese Skript immer wieder zu verändern Platzfressend & seher schnell durcheinander wird kann.
schöne Grüße -
simsobjekts schrieb:
Habe ich jetzt ausprobiert aber leider kommt die Datei nicht an sprich keine Downloadfenster.
Aaaargh, natürlich kann man Cookies nicht einfach so zuweisen, ohne die Funktion setcookie() zu verwenden... Total confusion...
Ersetze
durch$_COOKIE['dlhash'] = $hash; //den Kram in einen Cookie speichern
setcookie("dlhash",$hash); //den Kram in einen Cookie speichern
Außerdem nimm mal die Anführungszeichen beim zugewiesenen Dateinamen weg, also:
header("Content-disposition: attachment; filename=Banner.zip");
Jetzt sollte alles funktionieren.
Ich möchte gerne so ein Membersytem machen und da wäre es super wenn die Leute die auch nur Member sind die Datei Downloaden können.Daher war die Idee Super mit dem Cookie. Ich plane in Zukunft mehere Dateien für Member bereit zustellen und daher glaube ich das diese Skript immer wieder zu verändern Platzfressend & seher schnell durcheinander wird kann.
Das ist richtig. Aber solange du auf jemanden angewiesen bist, der dir das alles programmiert, solltest du die Variante "Script mehrfach verwenden" nutzen.
Klar, es ist kein sauberer Programmierstil, aber ich habe keine Muße, das jetzt zusammenzubasteln (von Spenden abgesehen) und du scheinst es ja wegen mangelnden Wissens auf dem Gebiet nicht selbst hinzubekommen..
Gegen ein entsprechendes Angebot lässt sich das alles machen, aber das dann ggf. per PN.
gruß
ferdinand24
Beitrag zuletzt geändert: 9.8.2009 13:31:33 von ferdinand24 -
ferdinand24 schrieb:
Klar, es ist kein sauberer Programmierstil, aber ich habe keine Muße, das jetzt zusammenzubasteln (von Spenden abgesehen) und du scheinst es ja wegen mangelnden Wissens auf dem Gebiet nicht selbst hinzubekommen..
Gegen ein entsprechendes Angebot lässt sich das alles machen, aber das dann ggf. per PN.
gruß
ferdinand24
Jetzt funktioniert es. Leider funkt hier jetzt Lima zwischen:-) denkt wäre eine zip von der Wespace. Ist es aber nicht. Ist die eine datenaufrufe? Kann man nicht zur Datei Umleiten?
Klar, es ist kein sauberer Programmierstil, aber ich habe keine Muße, das jetzt zusammenzubasteln (von Spenden abgesehen)
Das sollte gar nicht so ausehen sondern viel Leute wissen was das für eine Arbeit ist und Ich schätze es damit was die Leute sehen wollen:-)
lg -
simsobjekts schrieb:
Jetzt funktioniert es. Leider funkt hier jetzt Lima zwischen:-) denkt wäre eine zip von der Wespace. Ist es aber nicht. Ist die eine datenaufrufe? Kann man nicht zur Datei Umleiten?
Die Originaldatei liegt auf dem Downloadserver, aber die Kopie wird über das PHP-Script über den Webspaceserver ausgeliefert.
Deshalb schaltet sich die Dateiformatbeschränkung dazwischen.
Eine weitere Möglichkeit wäre:
Das Script loggt sich per FTP auf dem Downloadserver ein, erstellt eine Kopie der Datei mit einem kryptischen Namen und gibt diesen Link zum Download aus. Mittels Cronjob (z.B. http://www.cronjob.de) wird die Kopie der Datei z.B. nach einer halben Stunde gelöscht.
Das ist allerdings nicht mal eben in 10 Minuten gebastelt...
gruß
ferdinand24
Beitrag zuletzt geändert: 9.8.2009 14:34:47 von ferdinand24 -
Haben wir als Nutzer die Möglichkeit auf dem Lima-Web-Host cron jobs zu planen und auszuführen?
-
census schrieb:
Haben wir als Nutzer die Möglichkeit auf dem Lima-Web-Host cron jobs zu planen und auszuführen?
Nein, aber es besteht die Möglichkeit, externe Cronjob-Services zu nutzen, z.B. http://www.cronjob.de/.
gruß
ferdinand24 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage