2012-11-19 9 views
5

Ich mache eine Website, wo Sie Dateien für virtuelle Punkte kaufen können, und laden Sie sie dann. Ich möchte nicht, dass Benutzer die Dateien herunterladen, ohne sie zu kaufen, also muss ich sie verstecken. Ich lege alle Dateien in einen Ordner ohne Erlaubnis für irgendjemanden außer Host, das Problem ist, wenn jemand eine Datei kauft und sie herunterladen will.Sichere Datei-Download in PHP, verweigern Benutzer ohne Erlaubnis

Ich entschied mich, einen Datei-Getter zu machen, der die Berechtigungen des Benutzers überprüft und dann den Dateiinhalt ausgibt. Mein Code so weit:

<?php 
    require_once('content/requirements.php'); //mysql connections 
    secure(1); //disconnect unlogged users 

    if (!isset($_GET['id'])) //if no file id provided 
     die(); 

    $fid=mysql_real_escape_string($_GET['id']); //file id 

    $query="SELECT * FROM files WHERE user_id = "$_SESSION['user_id']." AND file_id = ".$id; 

    $q=mysql_query($query); 

    if (mysql_num_rows($q)!=1) //if no permission for file or multipe files returned 
     die(); 

    $file=mysql_fetch_array($q); //file id 
    $sub=mysql_fetch_array(mysql_query("SELECT * FROM sub WHERE id = ".$file['file_id'])); //payment id 
?> 

Nun, wenn ich bin sicher, der Benutzer dies zu tun ist ermächtigt, phpScript sollte den Inhalt der Datei schreiben und Appropiate Header senden Benutzer es zu lassen, herunterladen.

Wie Datei byteweise zu lesen und zu drucken, und was soll ich in header() schreiben, um die Datei herunterladbar zu machen (so müssen Sie seinen Inhalt nicht kopieren).

Vielleicht ist dies nicht der beste Weg, um dies zu tun, aber es war das Beste, was ich in einer Weile dachte.

Danke für jede Hilfe.

+0

Mit google. Dafür gibt es Millionen von Erklärungen. – arkascha

+1

Versuchen Sie, während Sie dort sind, nach SQL Injection zu suchen. – symcbean

Antwort

9

von readfile php doc

if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} 
+0

Am einfachsten und funktioniert :) Danke! –

5

Es gibt viele Skript auf Google verfügbar, Im Folgenden sind einige Links:

http://www.tutorialchip.com/php-download-file-script

http://www.webinfopedia.com/php-file-download-script.html

+1

Ich habe das Tutorial des Chips implementiert, und es funktioniert wie Charme. Vielen Dank – IberoMedia

+1

Hallo, ich bekam eine korrupte Zip-Datei, und nach dem Picken und Pocken fand ich die Lösung. Auch aus tutorialchip Klasse, fügt ob_start() irgendwann vor der ob_clean Zip-Datei mit Fehlern "
Hinweis zu verhindern: ob_clean() [ref.outcontrol.]: Fehlgeschlagen Puffer löschen Kein Puffer in /some/Raster löschen/Server ... on line
" – IberoMedia

+0

@IberoMediaim nur ungültige Datei Antwort bekommen ... helfen .. –