PHP MP3 download nicht abspielen

ClocxHD

Lt. Junior Grade
Registriert
Aug. 2014
Beiträge
376
Hallo,

kurz gesagt: Ich möchte, dass man, wenn man auf deinen Link klickt, die MP3 nicht abgespielt wird, sondern heruntergeladen.

Das habe ich auch schon mit einer PHP-Datei geregelt, und die funktioniert auch soweit:
PHP:
<?php
$downloadfile = "../downloads/".$_GET['file'];
$filename = $_GET['file'];
$filesize = filesize($downloadfile);

header("Content-Type: audio/mpeg3");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Length: $filesize");

readfile($downloadfile);
exit;
?>

Jedoch funktioniert das nur, wenn in dem Dateinamen der MP3 keine Sonderzeichen und Leerzeichen enthalten sind.
Ist es irgendwie möglich (außer zip etc.), dass es auch mit Sonder- und Leerzeichen im Dateinamen funktioniert?

p.s.: Als Webserver verwende ich nginx.

LG,
ClocxHD
 
Einmal so unter uns Pastoren-Töchtern: Das was du da machst ist so, wie es da steht hochgeradig unsicher, weil ich damit einfach mal jede Datei ansprechen kann, die da irgendwo rumlungert ;)
Was du machen kannst um das grundsätzliche Problem zu lösen: entweder du machst händisch nen replace von Leerzeichen durch "_" o.ä. oder du speicherst die Dateinamen raw_url_encoded.
 
Danke für den Hinweis, habe ich gerade auch gemerkt...
Ich kann z.B. auch download.php?file=../anderesVerzeichnis/datei.php machen :o
Anderen Vorschlag, wie ich es sicher machen kann?
 
Nun, du könntest als aller erstes deinen GET-Parameter bereinigen. Entsorge alles, was irgendwie nach ".", ".." oder "/" aussieht. Du könntest zusätzlich eine Liste der erlaubten Dateitypen führen. Hat die angeforderte Datei den falschen Typ -> äääk.
 
Wie kann ich damit dann Dateien herunterladen?
Ich kann ja jetzt nicht mehr download.php?file=test.mp3 machen, da er, wenn ich das jetzt richtig verstanden habe, die Anfrage nicht mehr über GET bekommt.
Script: http://pastebin.com/UQAGAyZL
 
Wenn das dein Script ist, dann sehe ich da nach wie vor mehrere Variante, wie ich das aushebel.
Die Get-Parameter kannste natürlich weiterhin abgreifen. Ich würde das ganze aber bereinigen. Sprich das, was Daaron sagt. "../" rauswerfen etc. da dadurch nicht in andere Pfade navigiert werden können. Bzw. kannste basename() verwenden.
 
Am Ende kann ich dir aber nur ans Herz legen, was ich allen anderen vor dir auch schon geraten habe:
- Such dir ein gutes CMS und erweitere es nach deinen Bedürfnissen.
ODER:
- Such dir ein gutes Framework, und bau deine Anwendung auf diesem auf.
Schreib doch nicht jeden Scheiß selbst. Das ist doch vollkommen beknackt. Nicht nur ist so etwas Zeitverschwendung, es öffnet Sicherheitslücken Tür und Tor.

Du willst einen Ordner mp3s zum Download verfügbar machen? Hey, in Contao kann ich das mit ner Handvoll Klicks. Download-Contentelement anlegen, auf mp3-Ordner verweisen, evtl. Rechte nur auf registrierte Mitglieder beschränken, fertig.
 
Zurück
Oben