heinetz: File Upload und Sicherheit

Beitrag lesen

Hallo Forum,

Das Plugin, dass ich einsetzen will bedient sich der HTML5 Javascript File Api. Damit ist es möglich, dem User direkt nach der Auswahl seiner Datei(en) mit dem Dateibrowser Informationen zu diesen im Browser darzustellen. Bspw. Thumbnails von ausgewählten Bildern. Mit meinem Upload-Skript sollen aber nur PDFs hochgeladen werden können.

Folgendes habe ich bis hierher verstanden:

  1. Vom User hochgeladene Files landen grundsätzlich erstmal im upload_temp_dir.
  2. Sämtliche Informationen zu dem hochgeladenen File, die vom Browser mitgesendet werden sind unsicher.

Daraus folgt m.E.

  1. Dass hochgeladene Files auf dem Server erst dann Schaden anrichten können, wenn Sie aus dem upload_temp_dir herausgeholt werden. Voraussetzung ist natürlich, dass die über die php.ini definierten Direktiven (upload_tmp_dir, upload_max_filesize etc.) den Server nicht schon gefährden.

  2. Sämtliche Behandlung der hochzuladenden Files im Frontend ist im Grunde irrelevant für die Sicherheit des Servers, sondern dient nur dem GUI.

  3. Sobald ich die hochgeladenen Dateien aus dem upload_tmp_dir verschiebe, muss ich sie mit PHP prüfen.

Weil die Dateien aber natürlich nicht im upload_tmp_dir verbleiben sollen, sondern ich damit etwas machen möchte, stellen sich die nächsten Fragen:

Geplant ist, die hochgeladenen Daten nicht dauerhaft zu speichern, sondern per Mail zu verschicken. Ganz naiv würde ich denken, dazu muss ich die Datei garnicht aus dem upload_tmp_dir herausholen, sondern:

  1. nehme ich die notwendigen Prüfungen an $_FILES['mein_upload']['tmp_name'] vor
  2. versende ich $_FILES['mein_upload']['tmp_name'] dann als Anhang in einer Mail. Etwa so:
$email = new PHPMailer();
$email->From      = 'you@example.com';
$email->FromName  = 'Your Name';
$email->Subject   = 'Message Subject';
$email->Body      = $bodytext;
$email->AddAddress( 'destinationaddress@example.com' );
$email->AddAttachment($_FILES['mein_upload']['tmp_name'], 'NameOfFile.pdf' );

return $email->Send();

Habe ich etwas vergessen oder gibt's nen Grund, die Hände über'm Kopf zusammenzuschlagen?

gruss, heinetz