Tom: Upload script

Beitrag lesen

Hello,

<?php
error_reporting(E_ALL);
ini_set('display_errors',1);

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>

<head>
  <title>upload</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form enctype="multipart/form-data" action="" method="post">
<input name="datei" type="file" />
<input type="submit" value="Datei speichern" />
</form>

<?php

if(isset($_FILES['datei']['error']) and $_FILES['datei']['error'] === 0)
  {
      $datei = basename($_FILES['datei']['name']);
      $dateityp_client = $_FILES['datei']['type'];

$max_byte_size = 60;

$mimearray = array("image/gif","image/jpeg","image/pjpeg");

$upload_verzeichnis = dirname($_SERVER['SCRIPT_FILENAME']) . '/upload/';

if(in_array($dateityp_client, $mimearray))
    {
        if($_FILES['datei']['size'] <= $max_byte_size)
        {
            if (move_uploaded_file($_FILES['datei']['tmp_name'],"$upload_verzeichnis/$datei"))
            {
                echo "Datei erfolgreich hochgeladen!<br>";
                echo "Name: " . htmlspecialchars($_FILES["datei"]["name"]) . "<br>";
                echo "Größe: " . $_FILES["datei"]["size"] . " Byte<br>";
                echo "MIME-Type: " . $_FILES["datei"]["type"] . "<br>";

und hier wird es dann spätestens kriminell:

echo "Link: <a href="" . $_FILES["file"]["name"] . "">" . $_FILES["datei"]["name"] . "</a>";
}
else { echo "Datei konnte nicht hochgeladen werden."; }
}
else { echo "Die Datei darf nur " . $max_byte_size . " Byte gross sein."; }
}

Nach der Endung hast Du doch gar nicht gefragt, sondern nach dem vom Client übermittelten MIME-Type.

else { echo "Die Datei besitzt keine gültige Endung."; }

Der MIME-Type kann aber gelogen sein. Die Datei könnte dann durchaus die Endung *.php haben. Stell Dir mal vor, irgendjemand schickt Dir eine solche PHP-Datei, für den der Client (anderer Host) den  MIME-Type 'image/gif' vorlügt und Du bietest dann sogar noch den dirketen Request der Ressource an durch Hyperlink an.

Fragt sich nun, wieviel Schadsoftware man in 60 Bytes unterbringen könnte.
(Ich frage mich auch, was Du mit 60 Bytes großen Bildern anfangen willst)

Ich könnte mir vorstellen, dass man auch mit 60 Bytes PHP-Code schon viel anfangen kann.

Außerdem hattest Du auf Variablen zugegriffen, deren Existenz noch nicht geklärt war.

datei = $_FILES['datei']['name'];

kannst Du erst zuweisen, wenn das $_FILES-Array auch belegt ist. Das ist aber erst dann der Fall, wenn PHP als error===0 eingetragen hat. (Wenn das Element dann trotzdem nicht da sein sollte, ist PHP kaputt.)

Außerdem ist auch 'name' ein Parameter, der vom Client kommt und sollte daher nie direkt übernommen werden. Ich frage mich gerade, was wäre, wenn der '.htaccess' lauten würde?

Zum Glück lässt sich die PUT-Methode nicht in einer .htaccess einschalten, sondern "nur" in einer VirtHost-Konfiguration oder der Stammkonfiguration des Servers. Sonst würden 60 Bytes auf jeden Fall reichen!

Das Umkopieren    datei = $_FILES['datei']['name']    ist auch nicht notwendig, wenn man mit der Variablen aus dem Array sonst nichts weiter macht. Sie steht ja die ganze Scriptlaufzeit zur Verfügung.

Die Übernahme des MIME-Type vom Client ist die schlimmste Lücke, die Du gerissen hast.
Den solltest Du auf jeden Fall auf dem Server mit einem Programm überprüfen. Leider hat PHP die Funktion dafür für die Zukunft herausgenommen und eine aus dem PEAR oder PECL-Paket dafür empfohlen, die nachweislich nichts taugt. Die alte PHP-Funtktion war besser. Noch ist sie aber drin im Paket, also nutze sie.

http://de3.php.net/manual/de/function.mime-content-type.php

Außerdem sollte man aus Sicherheitsgründen das Verzeichnis, in dem man die Bilder stapelt, die dann dort direkt über HTTP erreichbar sind, vom Parsen ausnehmen. Das ist leider nicht bei jedem Hoster möglich. Es wäre aber eine gute Empfehlung an Hoster, solch ein Verzeichnis standardmäßig mit anzubieten beim Webhosting.

Versuch mal, ob Du Dir selber so eines bauen kannst.

Das Apache-Manual gibt Aufschluss darüber:

http://httpd.apache.org/docs/2.2/mod/core.html#forcetype
und
http://httpd.apache.org/docs/2.2/mod/core.html#filesmatch

Ein harzliches Glückauf

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de