Geschütze Download-Url OHNE Timeout

[...] trägt der Code die Bezeichnung "Musterlösung".

Gut, dass du das jetzt für uns alle entschieden hast.

Eine Musterlösung ist für mich jedenfalls von der Allgemeinheit her annehmbar, fehlerfrei, sauber und übersichtlich, unkompliziert (sofern möglich) .
Gerade im Informatikbereich empfinde ich es als angenehm eine solche Lösung, vor allem beim öffentlichen Posten, so zu programmieren, das eigene Anpassungen (wie Domainname, Gültigkeitsdauer, besonders hier: Tabellenname/Ordnername) sehr simpel zu realisieren sind und ich nicht den ganzen Code durchwühlen muss. (Dazu noch die Anregungs eines Installationsscriptes, was einem die Arbeit des Tabelleerstellens und Ordnererstellens abnimmt).

Weiterhin: eine IP-Sperre mit 20 Tagen Gültigkeit... IPs ändern sich leider ;)

Schließlich habe ich auch noch nicht ganz den Nutzen davon verstanden. Wenn ich einen Downloadlink ala http://www.example.de/download.php?file=kflL3sfAnflkj_31lkasf erstelle, ist der an sich auch nicht öffentlich zugängig, sondern nur bei bekanntem Link.

Wenn man öffentlich etwas postet, sollte man auch mit Kritik, gerade wenn sie wie hier konstruktiv ist, umgehen können :)

Gruß,
timestamp
 
Hi

Solange hier niemand eine bessere Methode kennt,...trägt der Code die Bezeichnung "Musterlösung".
Er trägt nicht mal mehr "Lösung" im Titel...

Und Punkte, warum das alles Andere als sicher ist, wurden dir ja schon genannt.

vA., dass das Dateisystem nunmal keine threadsichere etc. Datenbank ist.
Und bei einer problematischen .htaccess verweigert der Server übrigens komplett,
nicht nur der Download...

Lobenswert, dass du was Zeigen/Beibringen willst, aber im Internet wirds immer Verbesserungsvorschläge geben, egal wie gut man schon ist.
Pros, die in ihrem Gebiet wirklich Weltspitze sind, gibts nicht viele...
 
@saftmeister

Vielen Dank für den HTTP_X_FORWARDED_FOR Vorschlag. Werd ich gleich mal einbauen...

Zur Race-Condition: In meinem Beispiel werden die IPs von User1 und User2 für 3 Stunden in eine Datenbank geschrieben. Anschließend wird die .htaccess mit allen IPs der Datenbank erstellt. Also haben beide User/IPs Zugriff auf die Datei.

Bei Downloadabbruch: Der Download-Link (download.php?code=....) ist trotzdem gültig. Der Download kann erneut, auch mit neuer IP, gestartet werden. Mit gültigem Timestamp von 3 Wochen ist das kein Problem.

Statt .htaccess: Bei deinem Beispiel wird es über den header gelöst. War auch mein Grundgedanke. Allerdings gibt es Browser und Programme, die den header ändern bzw. einfach entfernen.

Mit statischem Verzeichnisschutz wäre es natürlich besser - aber wie? Der Download soll nicht öffentlich zugänglich sein und es sollen keine PHP Timeout Probleme bei großen Dateien bzw. langsamer Internetverbindung kommen und eine Downloadberechtigung von beispielsweise 2 Wochen muss auch sein.

Wenn jemand eine bessere Lösung hat soll er doch bitte den kompletten Code hier posten....
 
Wie kann man einen Header, der serverseitig abgesendet wird, ändern? Würde ich gern mal sehen.

Zur Race-Condition: Weißt du wie genau eine Race-Condition zustande kommt, welche Rahmenbedingungen dabei herrschen und was das Resultat ist? Ich vermute mal nicht, nach dem, was du geantwortet hast.

Es geht hier auch nicht darum, dir ein funktionierendes System zu liefern, die gibt's wie Sand am Meer im Netz - mehr oder weniger gut/schlecht.

Du wolltest hier DIE Musterlösung präsentieren und sie ist alles andere, nur nicht das.

Eine Musterlösung sollte für sich beanspruchen

- nicht nur auf einem System zu laufen (ist bei dir nicht erfüllt)
- möglichst fehlerfrei sein (ist bei dir auch nicht erfüllt)
- selbsterklärend sein (öhm, naja, yaslaw hat schon ein bisschen Erfahrung, wie ich meine... ;-))
- möglichst einfach anzuwenden zu sein

Nochmal: Du postest deine zugegeben im Ansatz gute Lösung als DIE LÖSUNG für alle in einem Forum, in dem schon einige fähige Leute unterwegs sind. Erstellst dafür extra einen Account - was einen faden Beigeschmack auslöst. Versteh uns nicht falsch, aber das ist einfach eine Steilvorlage um Kritik los zu werden.

Nimm es nicht persönlich. Die Leute hier sind alle sehr nett. :-)
 
Dann blicke ich jetzt überhaupt nicht mehr durch. Dann kann doch wieder jeder sich etwas herunterladen? Dann brauche ich doch gar nicht den Umweg über die IP zu nehmen.
 
Hier mal ein Lösungsansatz ohne .htaccess, allerdings auch auf *nix-only.

- Die download-fähigen Daten liegen außerhalb (oberhalb, daneben, irgendwo anders) des DOCUMENT_ROOT.
- Beim Anfordern des Downloads wird ein symbolischer Link erstellt, der auf den jeweiligen Download zeigt.
=> Der symbolische Link wird nach x Tagen durch cronjob oder den Aufruf des Download-Scripts (was halt als erstes kommt) entfernt

Wie du siehst, es geht auch ohne htaccess.

Einziges Problem: Apache muss FollowSymLinks gestatten.

Damit haben wir auch einige Einschränkungen, und auch hier können unvorhergesehene Dinge auftreten (Race-Conditions, Zugriffsprobleme, etc. pp.)

Was ich damit eigentlich sagen will: Wir können hier verschiedene Lösungsansätze zusammen tragen, was an und für sich eine prima Sache ist. Aber DIE Lösung gibt's offensichtlich nicht.

Mit PHP 5.4 gibts keinen Safe-Mode mehr, das heißt, set_time_limit(0) dürfte problemlos funktionieren und damit auch readfile(). Noch besser könnte die Verwendung von virtual() sein, den dies ist eine Unteranfrage an den Apache-Webserver.

PS: Ich habe auch schon einiges über mod_xsendfile gelesen.
 
@saftmeister

erwischt, die Race-Condition ist nicht mein Fachgebiet... Sicherheit auch nicht unbedingt... funktionieren muss es halt.

Natürlich gibt es einen gewissen Hintergedanke mich hier extra anzumelden und den Code mit der Bezeichnung Musterlösung zu posten. Könnte ja sein, dass die Bezeichnung jemand provoziert die Musterlösung zu toppen - ich weiß, eine schwierige, ja fast unmögliche Aufgabe.

Danke für dein Lösungsansatz ohne .htaccess - klingt auch nicht schlecht...

PHP 5.4 wäre perfekt!
 
Hab ich es doch geahnt, dass du trollen willst :-)

Die Zeit, eine fertige Lösung zu bauen, die dann auch noch fehlerfrei funktioniert, habe ich leider nicht. Sowas kostet einfach ein paar Manntage und die könnte man allenfalls im Rahmen eines Projektes was an das Thema grenzt, aufwenden.

Mir persönlich würde eine Lösung gefallen, die sich quasi aus allen hier genannten Möglichkeiten einen passenden Weg raus sucht, abhängig davon, was am verwendeten System möglich ist. Aber da sind sehr viele Fallstricke.

Du hast jetzt jedenfalls ein paar Gedanken hier aufsammeln können, jetzt ist es an dir, es zu verbessern.

Zum Thema RC: Eine mögliche Lösung, das Problem zu umgehen: Verwende Locks und ggf. einen Redirect auf PHP_SELF. Das ist zwar auch nicht der Weisheit letzter Schluss verhindert aber schon mal das schlimmste.
 
Zurück