blog.bartlweb - a technologist's external brain

Datei-Download mittels PHP erzwingen

Das folgende PHP-Skript zwingt den Browser dazu den Download-Dialog auch für unterstützte Dateiformate anzuzeigen und ist somit eine Möglichkeit den Download von Dateien zu erzwingen. Des weiteren bietet es die Möglichkeit den ursprünglichen Speicherort von Dateien zu verschleiern.

GET-Parameter

  • action -> ruft die Funktion auf, sobal der Wert download zugewiesen wird
  • file -> der Dateiname ohne Pfad
  • secure -> MD5-Wert aus der Kombination Dateiname und Salt
  • name (optional) -> alternativer Dateiname für den Download, wird dieser nicht angegeben wird der Dateinamen der Originaldatei verwendet

Funktion

$basepath = '/wwwroot/downloads/';
$downloadSecureSalt = '7JHI63%$"§§2hgHJKBi2g342&%$§dfh3g2jfk4gHGTR%DCvvdbszifgVKJGCFD';

if($_GET['action'] == 'download') {
    if($_GET['file'] && $_GET['secure']) {
        $file = $_GET['file'];
        if($_GET['name']) {
            $name = $_GET['name'];
        } else {
            $name = $_GET['file'];
        }
                        
        if(!preg_match('/\.\./', $file)) {
            $secure = md5($file . $downloadSecureSalt);
            
            if($_GET['secure'] == $secure) {
                $path = $basepath . $file;

                if(is_file($path)) {
                    if($fileHandler = fopen ($path, "r")) {
                        $fileSize = filesize($path);
            
                        header("Content-type: application/octet-stream");
                        header("Content-disposition: filename=\"" . $name. "\"");
                        header("Content-length: " . $fileSize);
                        header("Cache-control: private");
                        
                        while(!feof($fileHandler)) {
                            $buffer = fread($fileHandler, 2048);
                            echo $buffer;
                        }
                        
                        fclose($fileHandler);
                    } else {
                        echo "download-error: file exists but is not readable";
                    }
                } else {
                    echo "download-error: file does not exist";
                }                        
            } else {
                echo "download-error: secure token does not match";
            }
        } else {
            echo "download-error: path traversal attack";
        }
    } else {
        echo "download-error: wrong parameters";
    }        
    
    exit();
}

Dieser Artikel hat dir deinen Tag gerettet?
... und mühevolles Probieren, Recherchieren und damit Stunden an Zeit gespart? ... oder einfach nur dein Problem gelöst?

Dann würde ich mich freuen, wenn Du meine Zeit für die Erstellung dieses Blogartikels mit einer kleinen Spende honorierst:

Kommentare

Noch kein Kommentar vorhanden.
Sei der Erste - ich freue mich über deine Anmerkungen, Kritik und Fragen.

Kommentar schreiben

Deine E-Mailadresse wird nur für Benachrichtigungen und Rückfragen verwendet und wird nicht veröffentlicht.

Benachrichtigungen können jederzeit wieder abbestellt werden.

Bitte tippe die Zahlenkombination "1049" ein, nur dann kann ich deinen Kommentar entgegennehmen.

Bitte fülle dieses Feld nicht aus, nur dann kann ich deinen Kommentar entgegennehmen.