curb47
Goto Top

Datei-Download per PHP wird mit 0Byte geladen

Hallo zusammen,

ich versuche gerade einige Downloads auf meiner Seite per PHP-Script anzubieten. Warum ich das mache?
Damit die Dateien nicht direkt verlinkt werden können und auch nur die Dateien geladen werden von denen ich es auch möchte.
Per PHP-FAQ konnte ich mir etwas passendes ummodellieren.

Script:
<?php 

$download = $_GET['download'];  
$basedir = "/srv/www/vhosts/DOMAIN.DE/files";  

//Liste der vorhandenen Dateien
$filelist = array (
"file1" => "file1.zip",  
"file2" => "file2.rar",  
 "file3" => "file3.rar"  
);
 
// Einbruchsversuch abfangen.
if (!isset($filelist[$download]))
die("there is no $download.");  

//Vertrauenswürdigen Dateinamen basteln.
$filename = sprintf("%s/%s", $basedir, $filelist[$download]);  

//Passenden Datentyp erzeugen
header("Content-Type: application/octet-stream");  

//Passenden Dateinamen im Download-Requester vorgeben
$save_as_name = basename($filelist[$download]);
header("Content-Disposition: attachment; filename=\"$save_as_name\"");  

//Datei ausgeben
readfile ($filename);

?>
Nun zum problem.
Rufe ich einen Download auf, z.b. (.....download.php?download=file1) kommt auch wie gewohnt das Download Fenster mit allem drum und dran ;).
Öffne oder speichere ich die Date ist sie gerade mal 0 Byte (also nix) groß. Woran könnte das liegen?
Habe mir auch mal ein echo von dem Pfade geben lassen, dieser müsste stimmen mit (/srv/www/vhosts/DOMAIN.DE/files/file1).

Ich hoffe jemand kennt das Problem und man kann mir helfen

Schon mal vielen Dank im vorraus.

Gruß

Content-ID: 117318

Url: https://administrator.de/contentid/117318

Ausgedruckt am: 05.11.2024 um 18:11 Uhr

kaiand1
kaiand1 02.06.2009 um 18:22:57 Uhr
Goto Top
Moin
ganz einfach du liest die Datei zwar ein für dein PHP Script...
Gibts die Daten jedoch nciht an den Browser aus für den Download
Abgesehen davon solltes du auch beachten das die anderen auch einen Timeout beim Download bekommen.
Maximale Scriptlaufzeit wird überschritten...
Curb47
Curb47 02.06.2009 um 19:02:49 Uhr
Goto Top
Und wie behebe ich das Problem, kannst du mir da helfen, bin in Sachen php nicht so bewandert face-smile.
Kleine Scriptfetzen als anreiz würden mir helfen...

Gruß
nxclass
nxclass 02.06.2009 um 20:18:38 Uhr
Goto Top
aus dem PHP Handbuch:
header('Content-type: application/pdf');  
header('Content-Disposition: attachment; filename="downloaded.pdf"');  
readfile('original.pdf');  

evtl. kann man noch den Header 'Content-length' hinzufügen
header('Content-length: '.filesize('original.pdf'));  

der Pfad: "/srv/www/vhosts/DOMAIN.DE/files/file1" .. da fehlt doch '.php' - oder so ?

... sehe deshalb nicht unbedingt einen Fehler in deinem Script - evtl. kann die Datei nicht gelesen werden ?
dog
dog 02.06.2009 um 20:22:25 Uhr
Goto Top
kaiand1s erster Punkt ist Quark.
readfile gibt eine Datei direkt auf stdout wieder aus.

Der zweite Punkt stimmt hingegen.

Ich kann an deinem Code auf Anhieb keinen Fehler erkennen, darum wie immer:

<?php
error_reporting(E_ALL|E_NOTICE);
ini_set('display_errors','On');  
?>

Am Anfang des Scripts hinzufügen und die Apache Log oder heruntergeladene Datei beobachten.

Grüße

Max
Curb47
Curb47 02.06.2009 um 20:56:24 Uhr
Goto Top
Also das mit dem Content-length hab ich auch noch hinzugefügt mit der richtigen Syntax meiner meinung nach

header('Content-Length: ' . filesize($filename));

so sieht das jetzt aus. Evtl. hab ich es falsch..
Wenn es richtig sein sollte, hat es aber dennoch zu keiner Änderung geführt.

Bei dem Pfad geb ich ja den Pfad an, in welchem Verzeichnis die Datei sich auf dem rootserver befindet und woher sich das Script die Datei holen soll.
Aber trotzdem Danke. Bin für jeden Tipp oder Anregung dankbar face-smile
dog
dog 02.06.2009 um 23:11:43 Uhr
Goto Top
Ach, ignoriert mich doch alle :'(

Zitat von @dog:
Ich kann an deinem Code auf Anhieb keinen Fehler erkennen, darum wie
immer:

> <?php
> error_reporting(E_ALL|E_NOTICE);
> ini_set('display_errors','On');  
> ?>
> 

Am Anfang des Scripts hinzufügen und die Apache Log oder
heruntergeladene Datei beobachten.
Curb47
Curb47 03.06.2009 um 11:31:51 Uhr
Goto Top
Oh danke für den Tip dog...


Jetzt bekomm ich eine ausführliche Fehlerbeschreibung face-smile.

Das hier kam dabei raus.

Warning: filesize(): open_basedir restriction in effect. File(/srv/www/vhosts/DOMAIN.DE/files/file1.zip) is not within the allowed
path(s): (/srv/www/vhosts/DOMAIN.DE/subdomains/downloads/httpdocs:/tmp) in /srv/www/vhosts/DOMAIN.DE/subdomains/downloads
/httpdocs/download.php on line 36

Warning: readfile(): open_basedir restriction in effect. File(/srv/www/vhosts/DOMAIN.DE/files/file1.zip) is not within the allowed
path(s): (/srv/www/vhosts/DOMAIN.DE/subdomains/downloads/httpdocs:/tmp) in /srv/www/vhosts/DOMAIN.DE/subdomains/downloads
/httpdocs/download.php on line 39

Warning: readfile(/srv/www/vhosts/DOMAIN.DE/files/file1.zip): failed to open stream: Operation not permitted in /srv/www/vhosts
/DOMAIN.DE/subdomains/downloads/httpdocs/download.php on line 39

Also fehlt da irgendwie die Berechtigung, oder ist da ein Fehler in der Pfadangabe??? *confused*

Gruß
Curb47
Curb47 03.06.2009 um 12:19:24 Uhr
Goto Top
Problem behoben.

Im Apache war eine open_basedir direktive eingetragen. Diese hab ich mal temporär auskommentiert.
Nun funktioniert der Download...

Besteht nun eine Sicherheitslücke ohne diese direktive???

Gruß
dog
dog 03.06.2009 um 14:18:47 Uhr
Goto Top
Zumindest besteht ohne die Regel ein Sicherheitsrisikio!

Nimm die Regel wieder rein, aber füg deinen files Pfad hinzu:

php_admin_value open_basedir /srv/www/vhosts/DOMAIN.DE/subdomains/downloads/httpdocs:/tmp:/srv/www/vhosts/DOMAIN.DE/files

Grüße

Max
Curb47
Curb47 03.06.2009 um 17:09:46 Uhr
Goto Top
Vielen Danke für die schnelle Hilfe.

Funktioniert immer noch, und jetzt sogar ohne Sicherheitsrisiko face-smile

Gruß