Download serverseitig überwachen/kontrollieren

  • geschlossen

  • Solitary Man
  • 1302 Aufrufe 17 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Download serverseitig überwachen/kontrollieren

    Hallo.

    Ich weißt nicht genau, ob sich das ganze mit php realisieren lässt; es müsste aber in diese Richtung gehen...:

    Ich möchte einem Nutzer erlauben eine Datei einmalig von meinem Webspace herunterzuladen. Dazu soll überwacht werden, ob der Download gestartet, erfolgreich beendet oder fehlgeschlagen ist.

    Hat jemand eine Idee, wie so etwas möglich ist ?

    MfG Solitary Man

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Solitary Man ()

  • Hmm, du könntest die IP des Benutzers speichern, und wenn er mit der IP wieder laden möchte blockierst du das.
    Doch das Problem ist das sich die IP fast immer ändert somit kannst du dich nicht darauf verlassen.
    Und eine andere Information die du über den Nutzer speichern könntest, um das zu überprüfen kenne ich nicht.

    Deshalb ist es schwer das zu verhindern.
    Gibts keine andere Möglichkeit dein Problem zu lösen, ohne das man die DL-Anzahl beschränkt?
  • es gibt ne möglichkeit:

    jeder user muss sich ein benutzerkonto anlegen und jedes konto darf die datei nur ein mal downloaden
    klar kann sich ein user erneut registrieren, aber der aufwand ist eventuell manchen dann zu groß

    ip bringt nichts, wie philipp schon sagt, die ändert sich bei jedem reconnect (spätestens alle 24h)
    Gruß
    Kam3L
  • Es lässt sich nur über ein Benutzerkonto realisieren, dabei kannst du aber nur prüfen, wie oft derjenige den Download auch wirklich gedownloadet hat. Eine Statusinformation ala: "Benutzer brach Download bei 33% ab" ist in PHP nicht zu realisieren.

    EIne Sperre nach X Downloads ist möglich, wenn du nen Codeschnipsel brauchst, geb dir gern meinen, mit dem ich sowas schon realisiert hab.

    MfG thomo
  • Also das mit dem Bentutzerkonto habe ich mir auch schon überlegt...nur reicht mir das nicht so ganz, weil wenn ich z.B. eine Datei bereitstelle, die von einem bestimmten Nutzer nur einmal heruntergeladen werden darf habe ich trotzdem keine Sicherheit, dass die die Datei auch wirklich nur einmal heruntergeladen wird...

    Warum das Ganze?
    Wenn ich z.B. selbst produzierte Musik der Öffentlichkeit zugänglich machen will und diese als Datei zum Download bereitstelle, will ich sichergehen, dass die Musik von einem Nutzer nur einmal (evtl. bei Downloadschwierigkeiten gibts einen 2ten Versuch) heruntergeladen werden kann, weil sonst könnte der User den Link ja weitergeben...

    Wäre es denn evtl. in einer anderen Sprache möglich, sowas zu realisieren ?

    MfG Solitary Man
  • Wäre da nicht sinnvoller den link zeitlich zu begrenzen?
    1tag oder 1 woche oder so^^

    aber was ich nicht ganz verstehe
    Öffentlichkeit zugänglich

    User den Link ja weitergeben...

    was willst du nun eigentlich?
    entweder ihn kann jeder haben,
    oder du verteilst ihn bloß per mail oder so an bestimmte leute, und da du willst das es niemand anders bekommt, begrenzt du "den link" so das es nichts bringen würde das er ihn weiter gibt o_0
    Alle Uploads sind auf Down gestellt keine Anfragen mehr!
    R.I.P. N0Nam€-Crew

  • Geb dir mal ein paar Zeilen Code von mir. Ich habe allerdings noch weitere Sachen gemacht, dazu aber gleich mehr:

    PHP-Quellcode

    1. require_once('inc/config.inc.php');
    2. if(isset($_POST['dl_submit'])){
    3. $form_tk = $_POST['tk'];
    4. $form_pw = $_POST['dl_pw'];
    5. $res = mysql_query("SELECT * FROM <tabelle> WHERE dl_token='$form_tk'");
    6. while($row = mysql_fetch_array($res)) {
    7. $db_tk = $row['dl_token'];
    8. $db_pw = $row['password'];
    9. $can_download = $row['can_download'];
    10. $downloads = $row['downloads']+1;
    11. }
    12. if($form_tk == $db_tk && $form_pw == $db_pw && $can_download == '1'){
    13. mysql_query("UPDATE <tabelle> Set downloads = '$downloads' WHERE dl_token = '$form_tk'");
    14. header("Location: http://www.domain.de/download/archive.rar");
    15. exit();
    16. }
    Alles anzeigen


    Auf meiner Website funktioniert das so:

    Kunde entscheidet sich mein Produkt (welches es ausschließlich als Download gibt) zu kaufen, er füllt ein Formular aus (Name, Adresse, EMail usw).

    Sobald er das Formular abgeschickt hat (und die Felder alle korrekt ausgefüllt sind), wird ein Download-Token sowie ein Passwort generiert. Das wird zusammen mit den restlichen Eingaben des Kunden in einer DB gespeichert. Dann bezahlt der Kunde (PayPal) und wird wieder auf meine Seite geleitet.

    Wurde der korrekte Betrag gezahlt (Überprüfung ob das PayPal-Formular nicht manipuliert wurde => gaaaaanz wichtig!), bekommt er eine E-Mail mit seinem Download-Link und dem dazugehörigen Passwort. Er klickt nun den Link aus seiner MAil und muss das Passwort eingeben, stimmt das Passwort mit dem in der Db hinterlegten überein, wird der Download freigegeben.

    Im obigen Script sind viele Codeteile entfernt, es dient auch nur der Anschauung und für Ideen.

    Man könnte zB. die Anzahl der Downloads mitloggen und vor dem Download dann jeweils prüfen, ob noch gedownloadet werden kann.

    Bsp: Ein weiteres Feld in der Tabelle mit dem Standard-Wert "0". Nach erfolgreichem Download ein Update des Feldes auf "1" und dann einfach vor der Downloadfreigabe prüfen, ob der Wert des Feldes 0 oder 1 ist, bei 0 darf er downloaden, bei 1 nicht.

    Da du dir aber selber nicht ganz sicher bist, wie du es realisieren solltst, kann ich dir leider net wirklich was anderes anbieten.

    Wenn du es nicht alleine kannst, programmier ich dir gern was passendes, allerdings nicht kostenlos. Preis würde sich nach Art und Umfang des Projektes richten.

    Ansonsten ist die Hilfe hier im FSB natürlich for free, du musst dir einfach nur klar werden wie es realisiert werden soll. Vielleicht kannst du auch paar Angaben machen, ob du Erfahrung in PHP hast bzw wieviel.

    Dann kann dir auch besser geholfen werden.

    MfG thomo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von thomo ()

  • @mpx2k: Klar kann ich mir den Aufwand sparen, nur muss ich dann mit erheblich mehr Traffic auf meinem Server rechnen und das sehe ich nicht ein. Ich werde diesen Aufwand nicht scheuen, aber derjenige muss sich noch entscheiden, ob er den Aufwand in Kauf nimmt, die Daten wieder bei RS oder so hochzuladen ;)

    @thomo: Vielen Dank für den Quelltext und die Erklärung. Meine PHP/MySQL-Kenntnisse sollten ausreichen, sowas selbst zu programmieren (ich bin zwar kein Profi, aber Daten an eine Datenbank übergeben/ändern/löschen mit Formularen kann ich ziemlich gut).
    Das Einzige was mich nur stört ist, dass es keine wirkliche Kontrolle gibt, ob eine Datei gedownloadet wird. Weil in deinem Beispiel könnte man den Downloadlink (archive.rar) einfach aus der heruntergeladenen Datei ablesen und diesen dann so oft nutzen wie man will...das läuft ja dann nicht über PHP/mySQL und ist damit nicht an ein Benutzerkonto gebunden.

    Ich habe mir jetzt einen halben Nachmittag Gedanken gemacht, wie ich vllt mit htaccess bzw. mod_rewrite irgend etwas sinnvolles dazu basteln könnte, aber ich packs leider nicht. Die Zeitbeschränkung als Idee wäre auch nicht schlecht, allerdings bleibt dort das Problem, dass man trotzdem per Direktlink uneingeschränkten Zugriff auf die Datei hat.

    Naja, danke für euere Hilfe, aber ich muss wohl passen. Für meine Wunschlösung gibt es scheinbar keinen Lösungsweg.

    mfg Solitary Man
  • Solitary Man schrieb:


    Das Einzige was mich nur stört ist, dass es keine wirkliche Kontrolle gibt, ob eine Datei gedownloadet wird. Weil in deinem Beispiel könnte man den Downloadlink (archive.rar) einfach aus der heruntergeladenen Datei ablesen und diesen dann so oft nutzen wie man will...


    Kuck dir mal PHP: readfile - Manual an.
    Mit readfile kannst du den Dateinamen ändern und vieles mehr.

    Gruß
    Broken Sword
    Auf dem Abstellgleis sah man ihn liegen,
    Auf dem Abstellgleis zwischen Schwelle und Gestein,
    Auf dem Abstellgleis im strömenden Regen,
    Auf dem Abstellgleis allein.
  • Solitary Man schrieb:


    @thomo:
    Das Einzige was mich nur stört ist, dass es keine wirkliche Kontrolle gibt, ob eine Datei gedownloadet wird. Weil in deinem Beispiel könnte man den Downloadlink (archive.rar) einfach aus der heruntergeladenen Datei ablesen und diesen dann so oft nutzen wie man will...das läuft ja dann nicht über PHP/mySQL und ist damit nicht an ein Benutzerkonto gebunden.


    Eben genau das kannst du nicht.

    Erstell mal spasseshalber eine Datei namens download.php und setzt dort als einzigstes ein header("Location: http://www.domain.de/xyz.rar");

    Du kannst den URL des header(); nicht auslesen :)

    Kleiner Test gefällig?

    Der kleine Test

    Sag mir in welchem Verzeichnis das RAR-Archive liegt und du bekommst von mir 5€.

    Das Einzigste was du siehst ist der Name der Datei, aber nicht den genauen URL Dieser!


    Broken Sword schrieb:


    Mit readfile kannst du den Dateinamen ändern und vieles mehr.


    Eine Datei wird in PHP mit rename(); umbenannt, nicht mit readfile();

    thomo

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von thomo ()

  • Das hatte ich zunächst auch gedacht, aber ich habe jetzt nochmal eine Testdatei erstellt und konnte die URL auslesen. Der Downloadlink zu deiner Datei müsste folgender sein:

    Quellcode

    1. http://www.tomdome.de/de/dasisteintestverzeichnis/archive.rar

    Das Umbenennen mit PHP bringt auch nicht so wirklich was. Wenn mehrere Nutzer auf die gleiche Datei zugreifen, gibt das ein Chaos...

    mfg Solitary Man

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Solitary Man ()

  • Solitary Man schrieb:

    Der Downloadlink zu deiner Datei müsste folgender sein:

    Quellcode

    1. http://www.tomdome.de/de/dasisteintestverzeichnis/archive.rar




    oO Das ist leider völlig korrekt! Wie zum Teufel hast du das auslesen können?

    thomo

    PS: Schick mir deine PayPal-Addi eben per PN, die 5,-€ für meine grosse Fresse bekommst du natürlich von mir xD
  • Meines Wissens geht das per mod_rewrite.
    Allerdings kenn ich mich damit sehr schlecht aus, das heißt ich kanns lesen und verstehen aber nicht erklären oder selber schreiben.

    Hier mal ein Tutorial zu Mod_Rewrite: modrewrite.de | mod_rewrite & .htaccess (Apache Server) oder das hier, wobei ich das erste besser fand: Mod_Rewrite Tutorial
    Hier was offizielles von Apache: URL Rewriting Guide - Apache HTTP Server

    mfg
    snip3r

    PS: Rapidshare macht das ähnlich.
    Rechteübersicht * Forenregeln * F.A.Q. * Lexikon
    Suchfunktion * Chat * User helfen User
    Patrioten reden nur davon, dass sie für ihr Land sterben, niemals davon, dass sie für ihr Land töten. (Bertrand Russell)
  • thomo schrieb:


    Eine Datei wird in PHP mit rename(); umbenannt, nicht mit readfile();


    Lesen bildet (auch an dich, Solitary Man!)

    Natürlich sollte man die header()-Befehle, die im Beispiel aufgeführt werden beachten.
    Mit

    Quellcode

    1. header("Content-Disposition: attachment; filename=\"peter.rar\";");

    wird jede Datei als peter.rar an den Browser gesendet. Als "Quelle" wird die PHP-Datei angezeigt.

    Gruß
    Broken Sword

    @thomo: omg... Natürlich sollte das nur ein Wink mit dem Zaunpfahl sein
    Auf dem Abstellgleis sah man ihn liegen,
    Auf dem Abstellgleis zwischen Schwelle und Gestein,
    Auf dem Abstellgleis im strömenden Regen,
    Auf dem Abstellgleis allein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Broken Sword ()

  • Auch so wird im FF der korrekte Downloadlink bzw. der gesamte Pfad zur Datei angezeigt. Aber dank deines Hinweises habe ich nochmal ein bisschen gegoogelt und eine Lösung gefunden:

    Quellcode

    1. $file = 'pfad/verzeichnis/archive.rar';
    2. header( 'Content-type: application/octet-stream' );
    3. header( 'Content-Length: ' . filesize( $file ) );
    4. $dateiname = basename( $file );
    5. header( 'Content-Disposition: attachment; filename="' . $dateiname . '"' );
    6. readfile( $file );


    Das funktioniert (mein obiges Testbeispiel wurde entsprechend angepasst).

    Gefunden bei PHPBAR

    MfG thomo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von thomo ()