Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] HEADER Downloadweiterleiter einer Datei (https://www.delphipraxis.net/130312-%5Bphp%5D-header-downloadweiterleiter-einer-datei.html)

sarte 6. Mär 2009 10:03


[PHP] HEADER Downloadweiterleiter einer Datei
 
Hallo Leute,
ich habe ein kleines Problem:
Wenn jemand auf meine Website geht und z.b. ein Programm runterladen möchte dann ist z.b. das Archiv einer RAR-Datei zerstört bzw. man läd nur 0 KB runter.
Damit der User das Programm erhält muss er natürlich auf einen Link klicken. Dieser Link führt dann zu 'download.php'. Über get erhalte ich dann den Namen der Datei:
Delphi-Quellcode:
<?php
[...]
$file = 'prog/'; //Pfad der Datei
$file .= $_GET['prog']; // z.b. hallo.rar
  // Dateityp
  header( 'Content-type: application/octet-stream' );
  // Größe der Datei
 header( 'Content-Length: ' . filesize( $file ) );
  // Dateiname
  $dateiname = basename( $file );
  header( 'Content-Disposition: attachment; filename="' . $dateiname . '"' );
  // Ausgeben der Datei
 readfile( $file );
   }

Hab ich dort einen Fehler gemacht?
Ich sehe es nicht...

Matze 6. Mär 2009 10:24

Re: [PHP] HEADER Downloadweiterleiter einer Datei
 
Hi,

ich kann dir ja mal zeigen, wie ich es mache:

Code:
$filename = '...';
$filename = $config_main['root'] . $filename; // absoluter Pfad
$file_size = filesize($filename);

header('Content-Type: ' . get_mime_type());
header('Content-Disposition: attachment; filename=' .
   basename($config_main['root'] . $filename));
header('Content-Length: ' . $file_size);

readfile($config_main['root'] . $filename);
Die Funktion get_mime_type() ist diese:

Code:
// get mime type for the different browsers
function get_mime_type()
{
   $agent = $_SERVER['HTTP_USER_AGENT'];

   if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $agent))
   {
      $return = 'application/octetstream';
   }
   else if (ereg('MSIE ([0-9].[0-9]{1,2})', $agent))
   {
      $return = 'application/octetstream';
   }
   else
   {
      $return = 'application/octet-stream';
   }

   return $return;
}
Grüße, Matze

Florian H 6. Mär 2009 10:52

Re: [PHP] HEADER Downloadweiterleiter einer Datei
 
Zitat:

Zitat von sarte
Über get erhalte ich dann den Namen der Datei:
Delphi-Quellcode:
<?php
[...]
$file = 'prog/'; //Pfad der Datei
$file .= $_GET['prog']; // z.b. hallo.rar
  // Dateityp
  header( 'Content-type: application/octet-stream' );
  // Größe der Datei
 header( 'Content-Length: ' . filesize( $file ) );
  // Dateiname
  $dateiname = basename( $file );
  header( 'Content-Disposition: attachment; filename="' . $dateiname . '"' );
  // Ausgeben der Datei
 readfile( $file );
   }

Würde ich in der Form sowieso nicht verwenden ... es dürfte nicht lange dauern, bis jemand auf Ideen "?file=../config.inc.php" oder "?file=../db.inc.php" (wie auch immer die Dateien heißen) kommt - wenn dann der Server nicht sicher konfiguriert ist (kein Zugriff auf .inc*-Dateien) oder das Script anderweitig doof ist, kommt man schnell an Config-Dateien oder DB-Zugangsdaten ...

alcaeus 6. Mär 2009 20:41

Re: [PHP] HEADER Downloadweiterleiter einer Datei
 
Zitat:

Zitat von Florian H
Würde ich in der Form sowieso nicht verwenden ... es dürfte nicht lange dauern, bis jemand auf Ideen "?file=../config.inc.php" oder "?file=../db.inc.php" (wie auch immer die Dateien heißen) kommt - wenn dann der Server nicht sicher konfiguriert ist (kein Zugriff auf .inc*-Dateien) oder das Script anderweitig doof ist, kommt man schnell an Config-Dateien oder DB-Zugangsdaten ...

Sagen wirs so: damit die Datei eingebunden werden kann, muss PHP sie lesen koennen. In dem Fall kann man die Datei auch ueber readfile() auslesen. Am geschicktesten ist es, die Sache ueber eine ID zu loesen, und nicht den Dateinamen zu uebergeben.

Greetz
alcaeus

Florian H 6. Mär 2009 21:06

Re: [PHP] HEADER Downloadweiterleiter einer Datei
 
Zitat:

Zitat von alcaeus
Zitat:

Zitat von Florian H
Würde ich in der Form sowieso nicht verwenden ... es dürfte nicht lange dauern, bis jemand auf Ideen "?file=../config.inc.php" oder "?file=../db.inc.php" (wie auch immer die Dateien heißen) kommt - wenn dann der Server nicht sicher konfiguriert ist (kein Zugriff auf .inc*-Dateien) oder das Script anderweitig doof ist, kommt man schnell an Config-Dateien oder DB-Zugangsdaten ...

Sagen wirs so: damit die Datei eingebunden werden kann, muss PHP sie lesen koennen.

Hast recht, da hab' ich völlig falsch gedacht...
Also entweder ID oder eine sichere Parameter-Prüfung (z.b. nur [\.a-zA-Z0-9_-] als erlaubte Zeichen) - ersteres ist aber schöner und sicherer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz