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();
}