Hello Christian,
»» So wie es dort im Beispielcode mit $_SERVER['PHP_SELF'] gemacht wird, sollte man es nicht machen. Ich habe das gerade im Bugtracker eingetragen, damit das jemand korrigiert. Gut, dass du aufgepasst hast :-)
Danke für den Hinweis, ist korrigiert.
Das Beispiel enthält allerdings noch mehr fragwürdige Stellen:
$_FILES['thefile']['name'] Der Name der Datei, wie sie auf dem Clientsystem genannt wurde.
Eventuelle Verzeichnisangaben werden nicht mitgesendet.
$_FILES['thefile']['size'] Die Größe der Datei in Bytes
$_FILES['thefile']['type'] Der Mime-Type der Datei, wie der Client sie lieferte (z.B. image/gif).
Diese Angaben sind sämtlich fälschbar. In einem Musterscript auf SelfHTML dann damit weiterzuarbeiten, ohne die passenden Hinweise zu geben, halte ich ich für nicht seriös.
Die einzigen nicht fälschbaren Werte im Files-Array sind die Fehlernummer
$_FILES['thefile']['error']
und der temporäre Dateiname
$_FILES['thefile']['tmp_name']
da sie beide vom eigenen Server des Scriptes ermittelt/vergeben werden
Speziell an dieser Passage störe ich mich:
<?php
if(isset($_FILES['thefile']['tmp_name']) && $_FILES['thefile']['type']=="application/msword"){
// weiter mit der Verarbeitung
}else{
if(isset($_FILES['thefile']['tmp_name'])){
die("Dieses File ist kein MS-Word Dokument sondern hat den Mime-Type ".$_FILES['thefile']['type']);
}else{
die("Kein File übertragen")
// man muss hier nicht zwingenderweise abbrechen,
// das File kann auch freiwillig übermittelt worden sein,
// je nach Anforderung
}
}
?>
Es wird hier nicht als erstes nach dem Fehlerwert gefragt, wie es richtig wäre
if (isset($_FILES[$myfieldname]) and $_FILES[$myfieldname]['error'] === 0)
{
## weitermachen
}
else
{
## Fehlerbehandlung
}
und es wird eine vermeintliche Sicherheit vorgegaukelt, was ich für BESONDERS SCHLIMM halte, indem man den vom Client mitgelieferten MIME-Type durch einen Stringvergleich "überprüft".
Er wird eben hierdurch NICHT ÜBEPRÜFT, sondern es wird nur den Angaben des Client vertraut. Und diese Methode wird hier auch noch als Sicherheitsfeature des Scriptes dargestellt. Das ist unseriös und zwar deshalb, weil die Verantwortlichen es besser wissen.
Ich möchte die generelle Überarbeitung des Scriptes daher nochmals hier im Forum zur Diskussion stellen, bevor ich selber dann den Bugtracker bemühe.
Wie man einen Fileupload einigermaßen vernünftig absichert, habe ich hier oft genug ausfühlich beschrieben und auch erwähnt, dass ich mich sehr darüber ärgere, dass es (immer noch) keine (mehr) erprobte Funktion für die Feststellung des MIME-Types in PHP gibt.
Liebe Grüße
Tom vom Berg
Nur selber lernen macht schlau