• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Download erzwingen

Iltis

Lounge-Member
Hallo zusammen,

ich glaube hier wurde schon mehrfach die Frage gestellt, ob man einen Download erzwingen kann. Ich habe heute auf http://www.pctipp.ch/helpdesk/kummerkasten/archiv/internet/27192.asp einen Hinweis gesehen:

Links direkt auf dem Computer speichern lassen
Meldung vom 24.04.2004
Ich möchte auf meiner Website Filme zum Download anbieten. Wenn ich jedoch einen Link zu der entsprechenden Datei setze, werden die Filme nicht heruntergeladen, sondern im Browser geöffnet. Was muss ich tun, dass die Filme (avi, mpg, mov, asf) wirklich auf dem Computer gespeichert werden?
Ob eine Filmdatei im Browser angezeigt wird, hängt von der Browser-Konfiguration des Besuchers ab. Wenn der Browser das entsprechende Plug-In besitzt, kann er den Film im Browserfenster abspielen lassen, andernfalls kommt die Aufforderung zum Speichern oder direkten Öffnen. Es gibt jedoch eine Möglichkeit, den Browser dazu zu bringen, dass er die Speicher-Aufforderung immer anzeigt. Mit CGI oder PHP können Sie den HTTP-Header verändern, der dem Browser Informationen über den Inhalt der kommenden Datei gibt. Das untenstehende Beispiel führt dazu, dass der Browser die Dateien immer herunterlädt. Ihr Webserver muss dazu die Skriptsprache PHP unterstützen, was heute bei den meisten Servern der Fall ist.

Erstellen Sie in einem beliebigen Editor eine neue Textdatei. Füllen Sie diese mit folgendem Code:

<?
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$file);
readfile($file);
?>

Speichern Sie die Datei im Verzeichnis, wo sich die Downloads befinden, unter dem Namen «download.php» ab.
Wenn Sie die Datei «meinfilm.mov» nun verlinken möchten, verwenden Sie «download.php?file=meinfilm.mov» als Linkadresse. Klickt man den Link an, erscheint das Fenster mit der Speicher-Aufforderung. Der Link funktioniert jedoch nur, wenn Sie ihn auf dem Webserver testen. (mb)
 
schön und gut, aber mit dem script öffnest du hackern tür und tor.

wie wärs mit download.php?file=../../etc/passwd
oder download.php?file=.htaccess
oder download.php?file=../../mysql.inc.php
 
Also ich würde da vorher noch ne Überprüfung reinbauen, ob die gewünschte Datei überhaupt vorhanden ist. Wir wollen ja schliesslich nicht den User verärgern, in dem wir ihm die .htaccess nicht schicken können, oder?
 
Nicht wenn ähm... weiß nicht wie das genau heißt...

Jedenfalls wenn das abgedreht ist, dann können Variablen nur per $_GET bzw $_POST empfangen und somit weiterverarbeitet werden!

Also müsste er es vorher überprüfen - aber grundsätzlich hast du recht rasputin!
 
natürlich funktioniert das nur mit register_globals=on, aber davon gibt es noch genug. ausserdem ist die zielgruppe des pctip-magazins nicht die professionelle, sondern eher die unerfahrene gruppe. und diese kennt die lücke nicht bzw könnte sie gar nicht selber schliessen.
 
ein sehr guter Einwand, aber du könntest ja eine Liste haben (Datenbank, ...) in der alle "guten" Dateien eingetragen sind.
 
Die können das bei pctipp.ch ja nicht wissen, die arbeiten ja mit active server pages..... ;)

Aber jetzt mal Spaß beiseite, wenn das Profis wären, dürften sie sowas nicht veröffentlichen, ohne entsprechende Hinweise auf die Sicherheits-Issues.

Ich denke wir sollten mal ein howto über dieses Thema erstellen, da es ja doch immer wieder auftaucht.

Was meint ihr?
 
Hallo,

ich habe mal ein sichereres Script gebaut (noch etwas überflüssigen Code, dafür sollte es jetzt sicher sein):

PHP:
<?php

$_GET['download'] = 0;
$_COOKIE['download'] = 0;
$_ENV['download'] = 0;
$_FILES['download'] = 0;
$_GET['download'] = 0;
$_POST['download'] = 0;
$_REQUEST['download'] = 0;
$_SESSION['download'] = 0;
$_SERVER['download'] = 0;
$download = 0;

$_GET['file'] = str_replace("../", "", $_GET['file']); //kein anderer Ordner ist erlaubt

$gute_dateien = array("test.txt", "test2.txt"); // weiterführen wie jetzt

$anzahl = count($gute_dateien);
for ($i=0; $i <= $anzahl; $i++) {
  if ($gute_dateien[$i] == $_GET['file']) {
    $download = 1;
  }

}
if ($download ==1) {
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=".$_GET['file']);
readfile($_GET['file']);
} else {
echo "Die gewünschte Datei ist nicht verfügbar!";
}

?>
 
Die von PCTipp haben ihren Artikel geändert und haben meine Skript noch ein bisschen verschönert.
(http://www.pctipp.ch/helpdesk/kummerkasten/archiv/internet/27192.asp)

PHP:
<?
$erlaubt = array("datei_1.avi", "datei_2.txt", "datei_3.mov");

if (in_array($_GET[file], $erlaubt)){
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=".$_GET[file]);
readfile($_GET[file]);
}else{
die("Datei nicht verfügbar");
}
?>
[EDIT] Natürlich erhielt ich kein Mail mit einem Danke zurück, noch wird irgendwo im Artikel darauf hingewiesen, dass diese Änderung nicht von Ihnen stammt. Undank ist der Welten Lohn. [/EDIT]
 
Zuletzt bearbeitet:
@rasputin: Das habe ich auch gesehen, ich habe mir aber gedacht, dass ich mir keinen Finger mehr für die krümme, bevor ich nicht etwas von denen höre.
Ansonsten habe ich mit verschönern gemeint, dass sie den unnötigen Code entfernt haben.
 
hm schon schlimm, wenn man keinen sauberen PHP Code produziert und sich trotzdem PC-Tip nennt. Ich würde sie auf den Fehler hinweisen, das ist Demütigung ;)

P.S.: Hach bin ich heut' wieder fieß
 
hm schon schlimm, wenn man keinen sauberen PHP Code produziert und sich trotzdem PC-Tip nennt. Ich würde sie auf den Fehler hinweisen, das ist Demütigung ;)

P.S.: Hach bin ich heut' wieder fieß

[edit]sorry zu dumm zum (einmal)klicken[/edit]
 
download erzwingen...

das mit dem ganzen php ist gut und interessant und man lernt hier echt was, aber wieso mit spatzen auf kanonen werfen?
wie wär´s mit download als .zip-Datei?
:D
 
Original geschrieben von digleu
hm schon schlimm, wenn man keinen sauberen PHP Code produziert und sich trotzdem PC-Tip nennt. Ich würde sie auf den Fehler hinweisen, das ist Demütigung ;)

P.S.: Hach bin ich heut' wieder fieß

@digleu: Gut du hast mich schon überzeugt. :D
 
Zurück
Oben