kostenloser Webspace werbefrei: lima-city


Dateien vor direktzugriff via Link schützen.

lima-cityForumDie eigene HomepageSicherheit im Internet

  1. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    Hey ;)

    Ich möchte gerne ein kleines Datei-Verwaltungs CMS (Homepage mit PHP) erstellen, bei dem eine Partei Dateien hoch laden und Rechte vergeben kann, und die andere Partei (mit den entsprechenden Read-Rechten) die Datei downloaden kann.

    Das ist soweit nicht schwer. Es wäre mir aber ein Anliegen, dass die Datei nicht einfach via Link an Unautorisierte weiter gegeben werden kann.
    (Dass die Datei selbst weiter geschickt wird, kann ich nicht mehr überwachen, schon klar...)

    Szenario, dass nicht gehen soll:
    User bekommt Rechte für Datei, kopiert Link, und gibt diesen weiter.
    User ohne Rechte geht auf Link, und lädt Datei direkt herunter.

    Also so, wie man es bei RapidShare und Co. kennt. Man hat zwar einen Link, die Datei bekommt man aber trotzdem nur über den umständlichen Warte (oder Premium Acc) Link. In meinem Fall bräuchte ich halt keine Warte-Zeit, sondern nur eine Authentifizierung.

    Geht das mit PHP?
    Wenn ja, wie? Kann mir jem. eine Anleitung geben, hat jem. ein Tutorial?
    Wenn nein: Wie kann ich es sonst machen?

    Alternativ: Hat jemand einen besseren Vorschlag? Wie kann ich dafür sorgen, dass Dateien nur für bestimmte Personen zugänglich sind?

    Danke schon im voraus ;)
    Sincer

    =========================================================================
    =========================================================================

    Danke an zazu und reimann :)
    Problem gelöst!

    Mein funktionierender Beispiel Code:
    index.php
    <html>
    <head><title>Download Demo</title></head>
    <body>
    	<h1>Das ist eine Demo.</h1>
    	<br />Download: <a href="validate.php?file=hashWert">klick mich</a>
    </body>
    </html>

    Also in dem Fall einfach nur eine Seite mit Link zu einer PHP File, die mir eine bestimmte Datei zurück liefert.

    validate.php
    <?php
    // Hier findet eine validierung statt.
    // Wenn alles passt, wird folgender Code ausgeführt -> User erhält datei.
    
    $filepath = "./test.rar"; // Der Dateipfad. (Muss später durch LookUp in DB ersetzt werden.
    $filename = "test.rar"; // Der Dateiname. (Muss später von $filepath abgeleitet werden.
    
    $fi = new finfo(FILEINFO_MIME); // finfo = bessere Alternative zu mime_content_type()
    $mime_type = $fi->buffer($filepath); // Ermittelt den Mime-Type der Datei.
    
    header('Cache-Control: public'); // Wird für den IE benötigt.
    header('Content-Type: '.$mime); // Setzt den Content-Type.
    
    header('Content-Disposition: attachment; filename="'.$filename.'"'); // Öffnet den Open/Save Dialog des Browsers und bietet Datei mit Namen $filename zum Download an.
    
    readfile($filepath); // Liest die Datei aus. (-> Datei wird an User gesendet)
    
    // FRAGE: Wie sieht das mit Ressourcen aus? Wie sehr belastet dieser Vorgang den Server bei großen Dateien?
    
    exit; // Script stoppen, da selbst Leerzeilen hier zum Problem werden könnten.
    ?>

    In diesem Fall ist alles HardCoded, es gibt eine test.rar Datei im gleichen Verzeichnis, in dem sich auch die validate.php befindet. Aber ich kann diese Methodik ja auf einen geheimen Pfad anwenden, und wenn das stimmt, sollte keiner mehr drauf kommen, wo die Datei nun tatsächlich liegt, so dass ich volle Kontrolle darüber habe, wer die Datei herunterladen darf und wer nicht.

    Danke für die Hilfe :)

    Beitrag zuletzt geändert: 11.7.2011 18:51:12 von sincer
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. z**u

    Hallo sincer,

    Da würde ich ganz einfach mit Sessions arbeiten, dann gibts du einer Variable einen boolean Wert, die die Rechte auf den Link spiegeln, und wenn die Variable in der Session nicht gesetzt ist (sprich; Der Benutzer nicht angemeldet ist) kann er die Datei auch nicht runterladen.

    Für nähere Ausführungen kann ich dir gerne ein Beispiel machen, falls du nicht weisst, was ich meine :thumb:
  4. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    Hey ;)

    zazu schrieb:
    Für nähere Ausführungen kann ich dir gerne ein Beispiel machen, falls du nicht weisst, was ich meine :thumb:


    Ja, ein Beispiel wäre klasse xD

    lg
    Sincer
  5. z**u

    Okay, aber ich garantiere für keine verwirrungsfreie Lösungen und warne dich vor Kopfschmerzen und sonstigen Nebenwirkungen:

    <?php
    session_start();
    //Hier muss die Anmeldung überprüft worden sein, zum Beispiel indem ein Passwort abgefragt wurde:
    if ( $strPasswort == PASSWORT) {
    $_SESSION['berechtigung'] = true;
    }
    
    if ($_SESSION['berechtigung'] = true;) {
    echo '<a href="link/zur/dateioderURL">Link klickbar</a>';
    } else {
    echo 'Kein Link';
    }
    
    ?>


    Das Ganze ist im Schnellverfahren entstanden, sorry für Tipp- und Denkfehler :thumb:

    Schritt 1:
    Anmeldung prüfen.

    Schritt 2:
    Berechtigung in Form einer Session-Variable setzen.

    Schritt 3:
    Text bzw Bild oder Medium mit Link versehen - oder nicht.
  6. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    Hey ;)

    Danke für deine Bemühungen, aber das löst mein Problem leider nicht.

    Dass die Seite (und damit der Link) grundsätzlich nur Sichtbar für angemeldete User ist, setze ich voraus. (Vil. habe ich das oben schlecht klar gemacht.)

    In deinem Beispiel kann ich mich als registrierter User einloggen, und den Link, den ich dann sehe, in ein öffentliches Forum posten.
    Jeder, der nun auf den Link "<a href="link/zur/dateioderURL">Link klickbar</a>" klickt, kann die Datei downloaden, ohne ein im CMS angemeldeter User zu sein.

    Ich suche ein Verfahren, bei dem der User den Link "nicht kennt". D.h. er kann drauf klicken, und dann wird die Session überprüft und die Datei an den User gegeben. Wenn der Link aber veröffentlicht wird, und ein anderer (nicht registrierter User) auf den Link klickt, soll bloß "Keine Berechtigung die verlinkte Datei herunter zu laden." zu lesen sein.

    Ich hoffe, jetzt ist ein wenig klarer, was ich suche.

    Danke weiterhin für Tipps :)
    Sincer
  7. z**u

    Hmmm... nein :D

    Guck:

    if ($_SESSION['berechtigung'] = true;) {
    echo '<a href="link/zur/dateioderURL">Link klickbar</a>';
    } else {
    echo 'Kein Link';
    }


    Hier wird nur ein effektiver Link erstellt und per HTML dem Benutzer angezeigt, wenn er auch angemeldet ist. Das echo im else-Teil zeigt nur einen Text, mit dem der Benutzer / Gast gar nichts anfangen kann :thumb:

    Beispiel:

    Benutzer: Google
    Gast: Google
  8. schreib dir doch einfach nen kleines Programm das überprüft ob ein User eingeloggt ist oder nicht.
    Ist der User eingeloggt wird ihm der Inhalt angezeigt, wenn nicht dann wird eine Meldung ausgegeben und er wird automatisch zur Registrierung weitergeleitet.

    Wenn du beim einloggen z.B ein Cookie setzt (Cookiename = logged) kannst du dich darauf beziehen.

    Also schreibste ihn dein Script:
    if(!isset($_COOKIE['logged']{
    echo 'Keine Berechtigung zum download';
    exit;
    }
    else{
    // Anzeige des Inhalts
    }


    Das ganze speicherst dir als z.B. logincheck.php und rufst es in deinem Downloadbereich mit include/require auf.

    Beitrag zuletzt geändert: 11.7.2011 16:11:30 von trickdieb
  9. z**u

    trickdieb schrieb:
    Wenn du beim einloggen z.B ein Cookie setzt (Cookiename = logged) kannst du dich darauf beziehen.

    Mit Sessions wird ja auch ein Cookie erstellt, von da her ist das ungefähr das gleiche.


    Unsere zwei Schnippsel sind ziemlich gleich :wink:
    if ($_SESSION['berechtigung'] = true;) {
    echo '<a href="link/zur/dateioderURL">Link klickbar</a>';
    } else {
    echo 'Kein Link';
    }

    if(!isset($_COOKIE['logged']{
    echo 'Keine Berechtigung zum download';
    exit;
    }
    else{
    // Anzeige des Inhalts
    }

    Von daher; die Methode wird sich sicher bewähren. Wenn du Hilfe bei der Umsetzung brauchst kann ich bzw. vielleicht auch trickdieb gerne helfen :thumb:
  10. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    Hey ;)

    trickdieb schrieb:
    Ist der User eingeloggt wird ihm der Inhalt angezeigt, wenn nicht dann wird eine Meldung ausgegeben und er wird automatisch zur Registrierung weitergeleitet.


    In dem Fall will ich aber keinen Seiteninhalt anzeigen, sondern eine Datei (z.B. PDF, oder ZIP) senden.
    Trotzdem danke ;)

    Ich habe weiterhin ein offenes Ohr für Vorschläge :D
    Sincer


    PS: Danke zazu, aber ich weiß, wie ein Session Login funktioniert.

    Hier noch ein Szenario zur Erklärung:
    Ich bin ein registrierter User, der das Recht hat, eine Datei ("Geheim.pdf") herunter zu laden.
    Du, zazu, hast dieses Recht nicht.
    Wir beide befinden uns in einem Forum (Lima City) und nun fragt mich "Mr.X", der Grundsätzlich auch die entsprechenden Rechte hat, nach der PDF. Er will die Datei im CMS nicht suchen, und so poste ich einfach den Link zur Datei.

    Hier ist der Knackpunkt:
    Ich will, dass nur bestimmte User, die nun auf diesen Link klicken, die Datei auch tatsächlich herunterladen können. Welche User das sind, bestimmt mein CMS. Jeder klickt also auf den gleichen Link (z.B. "mySite.com/files/Geheim.pdf") aber nur manche (registrierte User mit entsprechenden Rechten) bekommen die Datei. Andere sehen nur "Nicht genügend Rechte" am Bildschirm.

    In diesem konkreten Beispiel, klickt Mr.X auf den Link, und bekommt die Datei. Du klickst auch auf den selben Link, bekommst die Datei aber nicht.

    Ich hoffe, jetzt ist klarer, was ich mir vorstelle. Mir gehen schon die Ideen aus, wie ich es beschreiben soll xD
  11. z**u

    Achso, alles klar.

    Ja das wird ganz schön schwer. Spontan kommt mir da nur die Idee, für jeden Download ein .php zu erstellen (das kann ja automatisch ablaufen) auf welches der Link zeigt, und welches dann die Berechtigung prüft. Der Inhalt dieses Files wäre sehr gering, von daher sollte das kein Problem der Performance bieten.

    Ich habe jetzt auf jeden Fall kappiert wie du das ganze meinst, aber einen Login mit Sessions habe ich nie versucht zu erklären ^^

    Also zur Zusammenfassung:

    Entweder du erstellst nur dann einen Link, wenn der Benutzer registriert ist (wie in der ersten Methode) oder aber du erstellst für jede Datei ein separates File. Oder eine Funktion, die entsprechend... komplex werden dürfte. Auf jeden Fall keine einfache Angelegenheit, aber definitiv interessant :lol:

    EDIT:

    Geistesblitz:
    Du kannst natürlich mit dem Hyperlink eine get Variable mitgeben, jedem Download einen Integer als ID verpassen und auf ein .php verweisen, dann wird dieses php mit einer Funktion die Berechtigung prüfen und bei einem Erfolg die Datei mit der entsprechenden ID zum Download anbieten. Oder so. *sich am Kopf kratzt*

    Beitrag zuletzt geändert: 11.7.2011 16:57:02 von zazu
  12. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    Hey ;)

    zazu schrieb:
    Geistesblitz:
    Du kannst natürlich mit dem Hyperlink eine get Variable mitgeben, jedem Download einen Integer als ID verpassen und auf ein .php verweisen, dann wird dieses php mit einer Funktion die Berechtigung prüfen und bei einem Erfolg die Datei mit der entsprechenden ID zum Download anbieten. Oder so. *sich am Kopf kratzt*


    Genau, das habe ich mir nun auch gedacht.

    z.B. link.com/?file=irgendEinHashWert

    Der HashWert kann in der Datenbank einer Datei zugeordnet werden. Wenn der User validiert wurde, wird ihm die Datei gesendet, ansonsten halt nicht.

    Und hier kommt meine Frage: Wie geht das? ^^
    Datei zum Download anbieten = Download Dialog des Browsers öffnet sich, Datei wird gesendet / vom User gespeichert. Danach kann der User auf der Seite nach weiteren Dateien suchen.

    Wie macht man das mit PHP?

    lg
    Sincer
  13. z**u

    Oh Käse.
    Dann pappst du aber die Funktion mit dem Download in die Seite rein, denn läuft das so:

    1. Seite neu laden, nach dem Klick auf den Link
    2. Berechtigung auf der selben Seite überprüfen
    3. Wenn die Berechtigung stimmt, den mit Hashwert gekennzeichneten Download in einer neuen DIV-Box mit einem Link oder Button zum Download anbieten. (Die Divbox mit dem z-index nach vorne heben und mit css das Umfeld bisl einfärben, aber transparent lassen)
    4. Nach dem Klick auf den Link die Datei herunterladen und zur ursprünglichen Seite zurückleiten

    Bei Schritt 4 kann ich dir nicht garantieren, ob das Script nach dem Download noch weiter ausgeführt wird, das müsste ich (oder du) erst prüfen.

    EDIT:
    Tippselkorrektur :thumb:

    Beitrag zuletzt geändert: 11.7.2011 17:13:55 von zazu
  14. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    Hey ;)

    zazu schrieb:
    4. Nach dem Klick auf den Link die Datei herunterladen und zur ursprünglichen Seite zurückleiten


    Das klingt gut, wie geht das PHP-Code-Technisch?

    thx
    Sincer
  15. z**u

    uhm äh...

    Der Link in Textform wäre dann sowas hier:
    echo '<a href="downloads/'.$_GET['strHash'].'">Download</a>';

    Oder als Button:
    echo '<input type="submit" name="btnDownload" value="Download" onclick="window.open('downloads/'.$_GET['strHash'].','_blank')" />';


    Und die Weiterleitung wäre dann auch wieder mit einen Javascript oder aber mit der PHP-Funktion:
    header('Location:index.php?site=forum&&thread=banane');


    EDIT:
    Schon wieder Tippselfehler :spammer:

    Beitrag zuletzt geändert: 11.7.2011 17:25:22 von zazu
  16. Wenn du den MIME-Typ kennst kannst du auch direkt die Datei zurückgeben in der php-Datei.
    Aber Achtung einige Downloadmanager bringen das nicht, Browser sollten das alle unterstützen.

    if( $_SESSION['right'] == true ) {
        header( 'Content-Type: ' . $mime );
        readfile( $filename );
    }
    else {
        echo 'Sie haben keine Berechtigung!';
    }


    Der grade diskutierte Ansatz ist auch möglich, aber du musst darauf achten die Dateien dann regelmäßig per Cronkob oder ähnlichem zu löschen, ansonsten bleiben sie zumindest bis zum nächsten Aufruf der php-Datei bestehn.

    Beitrag zuletzt geändert: 11.7.2011 17:41:50 von reimann
  17. Autor dieses Themas

    sincer

    Kostenloser Webspace von sincer

    sincer hat kostenlosen Webspace.

    Hey ;)

    zazu schrieb:
    uhm äh...


    Das trifft's in etwa :D

    Ok, gehen wir davon aus, dass ich eine PHP Datei habe: validate.php
    In dieser Datei werden die Rechte des User überprüft. Weiters wird dieser PHP Datei als Get Parameter übergeben, welche Datei dem User geschickt werden soll.

    Ich mache als einen Link zu mySite.com/validate.php?file=HashWert

    Soweit so gut, die Rechte stimmen, und der User wird via header("Location:./files/Geheim.rar"); zur Datei weiter geleitet. Der Download Dialog des Browsers öffnet sich, User klickt auf speichern, und nun?!
    Der User befindet sich auf einer weißen Seite. In der URL Leiste des Browsers steht "mySite.com/files/Geheim.rar".

    Wie kann ich es nun schaffen, dass der User den Download Dialog vom Browser angeboten bekommt, und dann wieder auf der Ursprungsseite landet? Bzw. diese Seite optisch merkbar niemals verlässt?


    Mir ist dazu eine Idee gekommen, aber ich weiß nicht, ob sich das umsetzen lässt. Vil. weißt du ja mehr.

    Ich könnte ja via AJAX diese Seite "mySite.com/validate.php?file=HashWert" rein laden. Hier funktioniert aber dann die header(Location) Geschichte nicht mehr, da der Header ja bereits gesendet wurde.
    Aber vielleicht geht das ja so ähnlich?!
    Dem User via Ajax die Datei zukommen lassen? kA... Ich Google mal :D


    Falls dir (oder auch jemanden anderes) eine andere / bessere Lösung einfällt, bin ich noch immer dafür zu haben :P
    Bzw. falls mir jem. ein wenig Demo Code reichen kann, mit dem das funktioniert... Den würde ich auch nicht ablehnen :)

    Thx
    Sincer


    // Last Minute Edit:
    reimann schrieb:
    Wenn du den MIME-Typ kennst kannst du auch direkt die Datei zurückgeben in der php-Datei.
    Aber Achtung einige Downloadmanager bringen das nicht, Browser sollten das alle unterstützen.


    Ok, es müsste nur im Browser laufen, andere Anforderungen gibt es nicht.

    D.h. in der URL Leiste stünde dann "mySite.com/validate.php?file=HashWert" und es öffnet sich der Download Dialog im Browser?
    Aber auch dann, sofern ich das richtig verstehe, befindet sich der User auf eine weißen Seite. Schließlich handelt es sich dann nicht mehr um eine html Seite, sondern um einen .rar oder whatever Content.
    header(Location) geht ja nach dem Aufruf von readfile() nicht mehr...

    Oder sehe ich das falsch?

    Das Ziel: Der User bekommt die Datei, und befindet sich danach wieder auf der Seite, auf der er den Download Link geklickt hat.

    =========================================================

    // Final Edit:
    Problem gelöst. Lösung -> erster Post.

    Thx @ zazu & reimann :)

    Beitrag zuletzt geändert: 11.7.2011 18:52:30 von sincer
  18. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!