Download
Zingsta
- php
Tag die Herren und Damen!
Ich hab da mal ne Frage bzgl. eines Download-Skripts:
<? $download = $_GET['bild']; //$_GET['bild'];
$basedir = "xxx";
$filelist = array(
$_GET['bild'] => "Test.jpg" );
if (!isset($filelist[$download]))
die("Datei $download nicht vorhanden.");
$filename = sprintf("%s/%s", $basedir, $filelist[$download]);
header("Content-Type: application/octet-stream");
header("Content-type: application/force_download");
header("Cache-control: private");
$save_as_name = basename($filelist[$download]);
header("Content-Disposition: attachment; filename="$save_as_name"");
readfile($filename);
?>
So sieht's aus. So nun ist folgendes, dass ich ja den Dateinmaeper $_GET übergebe und deshalb nicht immer Test.jpg wieder manuell eingeben möchte, sondern der soll sich halt auch immer ändern. Wie geht das? Könnt ihr mir helfen.? Das wäre echt prima.
hi,
So nun ist folgendes, dass ich ja den Dateinmaeper $_GET übergebe und deshalb nicht immer Test.jpg wieder manuell eingeben möchte, sondern der soll sich halt auch immer ändern. Wie geht das?
den übergebenen parameter bild fragst du doch hier schon ab, wieso verwendest du ihn nicht?
<? $download = $_GET['bild']; //$_GET['bild'];
stattdessen machst du sowas hier:
$filelist = array(
$_GET['bild'] => "Test.jpg" );
was m.E. absoluter unsinn ist.
bedenke bei einer solchen parameterübergabe auch die sicherheit, dass man nicht durch manipulation des parameters eventuell auch datein runterladen könnte, die du dafür eigentlich gar nicht vorgesehen hast ...
gruss,
wahsaga
hi,
So nun ist folgendes, dass ich ja den Dateinmaeper $_GET übergebe und deshalb nicht immer Test.jpg wieder manuell eingeben möchte, sondern der soll sich halt auch immer ändern. Wie geht das?
den übergebenen parameter bild fragst du doch hier schon ab, wieso verwendest du ihn nicht?
<? $download = $_GET['bild']; //$_GET['bild'];
stattdessen machst du sowas hier:
$filelist = array(
$_GET['bild'] => "Test.jpg" );was m.E. absoluter unsinn ist.
bedenke bei einer solchen parameterübergabe auch die sicherheit, dass man nicht durch manipulation des parameters eventuell auch datein runterladen könnte, die du dafür eigentlich gar nicht vorgesehen hast ...
gruss,
wahsaga
Wie kann ich das Problem mit der Sicherheit denn umgehen? Sicher muss es nämlich sein! Wie geht das denn sicherer? Soll ich vielleicht nicht den Bildernamen, sondern nur eine id üerbmitteln?
hi,
So nun ist folgendes, dass ich ja den Dateinmaeper $_GET übergebe und deshalb nicht immer Test.jpg wieder manuell eingeben möchte, sondern der soll sich halt auch immer ändern. Wie geht das?
den übergebenen parameter bild fragst du doch hier schon ab, wieso verwendest du ihn nicht?
<? $download = $_GET['bild']; //$_GET['bild'];
stattdessen machst du sowas hier:
$filelist = array(
$_GET['bild'] => "Test.jpg" );was m.E. absoluter unsinn ist.
bedenke bei einer solchen parameterübergabe auch die sicherheit, dass man nicht durch manipulation des parameters eventuell auch datein runterladen könnte, die du dafür eigentlich gar nicht vorgesehen hast ...
gruss,
wahsaga
Wie kann ich das Problem mit der Sicherheit denn umgehen? Sicher muss es nämlich sein! Wie geht das denn sicherer? Soll ich vielleicht nicht den Bildernamen, sondern nur eine id üerbmitteln?
Inwiefern ist es denn auch besser, dass ich $_POST benutze anstelle von $_GET? KAnn man denn $_POST auch so leicht manipulieren?
hi,
Soll ich vielleicht nicht den Bildernamen, sondern nur eine id üerbmitteln?
das wäre eine denkbare möglichkeit.
Inwiefern ist es denn auch besser, dass ich $_POST benutze anstelle von $_GET? KAnn man denn $_POST auch so leicht manipulieren?
ja. GET oder POST macht kaum unterschied.
generell solltest du dir angewöhnen, daten vom client niemals blind zu vertrauen, egal auf welchem wege sie kommen.
btw: bitte lies mal http://learn.to/quote, und zitiere das nächste mal _sinnvoll_.
gruss,
wahsaga
hi,
Soll ich vielleicht nicht den Bildernamen, sondern nur eine id üerbmitteln?
das wäre eine denkbare möglichkeit.
Was hälst du denn von der Möglichkeit, dass ich beim Upload eine Zufallszahl generieren lasse, die auch in die DB eingetragen wurde und beim Auslesen/Download wird zuerst geprüft ob z.B. id, Bildname und Zufallszahl zusammen passen?
Inwiefern können Sessions die Sicherheit bei solchen Sachen erhöhen?
Mit Gruß,
Zingsta
Hello,
Was hälst du denn von der Möglichkeit, dass ich beim Upload eine Zufallszahl generieren lasse, die auch in die DB eingetragen wurde und beim Auslesen/Download wird zuerst geprüft ob z.B. id, Bildname und Zufallszahl zusammen passen?
Das hält aber trotzdem niemanden davon ab, als Bildernamen "/etc/passwd" einzugeben.
Diese Lücke fängst Du auch durch dein $basedir nicht ab. Man muss dann nur etwas mehr probieren:
Bildname = "../../../../../../../../../etc/passwd"
sollte fürs erste genügen.
Solche Einträge finde ich Zuhauf in meinem Error-Log.
Allerdings kommen die nicht sehr weit, weil ich mindestens mit der Funktion basename() http://de3.php.net/manual/de/function.basename.php den Filenamen aus dem Parameter extrahiere. Da interessieren die Rückschritte dann gar nicht mehr.
Deine $_filelist solltetst Du so aufbauen:
$_filelist["externer_name1"] = interner_name1;
$_filelist["externer_name2"] = interner_name2;
$_filelist["externer_name3"] = interner_name3;
Das wolltest Du sicher mit dem $_GET['bild'] => $name erreichen. Aber überleg mal, wenn der User den externen Namen selber festlegen darf, dann passt doch jeder!
Und dann passt auch Deine Abfrage:
if (!isset($_filelist[$_GET["bild"]])
{
echo "Böder Bube, Du...";
exit;
}
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo Tom!
Könntest du mal das komplette Download-Skript ( so wie du es sicher machen würdest) posten. Ich komme einfach nicht auf einen grünen Zweig. Dazu habe ich einfach zu wenig Kenntnisse :-)
Das wäre echt nett von dir.
Danke
Hello,
Hallo Tom!
Könntest du mal das komplette Download-Skript ( so wie du es sicher machen würdest) posten. Ich komme einfach nicht auf einen grünen Zweig. Dazu habe ich einfach zu wenig Kenntnisse :-)
Das wäre echt nett von dir.
Habe ich im Moment leider keine Zeit dazu, aber unter http://bitworks.de/~selfHTML/speichern.php findest Du eine Anwendung, in der eine Funktion steckt ( sendscript() ). Die kannst Du verwenden.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hey Tom!
Ich bin da echt zu doof für. Wie soll ich den deine Funktion umwandeln? Ich krieg das nicht gebacken... :-?
Hello,
... du hast die Variable $filename aus dem Parameter $_GET['file'] gewonnen z.B. durch:
$filename = basename($_GET["file"]);
Dann kannst Du als nächstes nachschauen, ob $filename in Deiner Liste enthalten ist:
$_filelist = array("bild1" => "rosen123.jpg",
"bild2" => "tulpen007.png",
"grafik2" => "rosen_blink.gif",
"broken" => "nichts_da.jpg");
Nur so als Beispiel. Dieses Array sollte man bei mehr als zehn Bildern und wechselnden Bildern lieber aus einer CSV-Datei erzeugen. dann könnte die dritte Spalte z.B. den Text für das Title-Attribut enthalten usw.
if (!isset($_filelist[$filename]))
{
sendpic(PICPATH, "dudu_bild.jpg");
}
elseif(!file_exists(PICPATH.$_filelist[$filename]))
{
sendpic(PICPATH, "nichts_da.jpg");
}
else
{
sendpic(PICPATH, $_filelist[$filename]);
}
PICPATH ist eine von Dir definierte Konstante mit dem Bilderverzeichnis
sendpic baust Du die aus der Sendfile()-Funktion, denn der passende Mime-Type sollte schon gesendet werden --> getimagesize().
Was ich interessant fand war
header("Content-type: application/force_download");
Kannte ich bisher auch noch nicht.
Ich hoffe, dass Du jetzt klar kommst.
Liebe Grüße aus http://www.braunschweig.de
Tom