为了让客户端的用户能够上传文件,我们必须在用户界面中提供一个表单用于提交上传文件的请求。由于上传的文件是一种特殊数据,不同于其它的post数据,所以我们必须给表单设置一个特殊的编码:
以上的enctype属性,你可能不太熟悉,因为这常常会被忽略掉。但是,如果http post请求中既有常规数据,又包含文件类数据的话,这个属性就应该显示加上,这样可以提高针对各种浏览器的兼容性。
上述文件字段在各种浏览器中可能表现会有所不同。对于大多数的浏览器,上述字段都会被渲染成一个文本框加上一个浏览按钮。这样,用户既可以自行输入文件的路径到文本框中,也可以通过浏览按钮从本地硬盘上选择所要上传的文件。但是,在苹果的Safari中,貌似只能使用浏览这种方式。当然,你也可以自定义这个上传框的样式,使它看起来比默认的样式优雅些。
提示:可以通过php.ini中的upload_max_filesize来设置允许上传文件的最大值。另外,还有一个post_max_size也可以用来设置允许上传的最大表单数据,具体意思就是表单中各种数据之和,所以你也可以通过设置这个字段来控制上传文件的最大值。但是,注意后者的值必须大于前者,因为前者属于后者的一部分表单数据。
Abbildung 1. In Firefox angezeigtes Upload-Formular
Wenn dieses Formular abgeschickt wird, wird die http-Anfrage an upload.php gesendet. Um genau zu zeigen, welche Informationen in upload.php verfügbar sind, drucke ich sie in upload.php aus:
Lassen Sie uns unten ein Experiment durchführen Klicken Sie auf das obige Formular, um ein Logo dieses Blogs auf meinen lokalen Server www.360weboy.me/upload.php hochzuladen und zu sehen, welche Informationen in upload.php ausgegeben werden:
Okay. Wenn ich nun diese Textdatei hochlade, wird sie in upload.php ausgegeben:
[name] => test.tx t
[type] => text/plain
— 🎜> . )
Sehen wir uns die http-Post-Anfrage an, die von gesendet wurde der entsprechende Browser (ich habe einige optionale Header weggelassen):
Code kopieren
Der Code lautet wie folgt:
POST /upload.php HTTP/1.1
Host: www.360weboy.me
Referrer: http://www.360weboy.me/
multipart/form-data ; border=-----------24464570528145
Inhaltslänge: 234
----- -------------------------24464570528145
Content-Disposition: form-data; filename="test.txt". "
Inhaltstyp: Text/Plain
360weboy
360days
Life Of A Web Boy
----------- -- ----------------24464570528145--
Es gibt mehrere Felder im obigen Anfrageformat, auf die wir achten müssen, nämlich Name, Dateiname und Inhaltstyp: Sie stellen jeweils den Feldnamen des Upload-Dateifelds im Formular dar – Anhang, den Namen der vom Benutzer von der lokalen Festplatte hochgeladenen Datei – test.txt, und das hochgeladene Dateiformat – text/ plain (stellt eine Textdatei dar). Dann sehen wir unten eine leere Zeile, die den spezifischen Inhalt der hochgeladenen Datei darstellt.
2. Sicherheitsverbesserung
Um die Sicherheit beim Datei-Upload zu erhöhen, müssen wir den tmp_name und die Größe im globalen Array $_FILES überprüfen. Um sicherzustellen, dass die Datei, auf die tmp_name verweist, tatsächlich die Datei ist, die der Benutzer gerade auf den Client hochgeladen hat, und nicht auf etwas wie /etc/passwd verweist, können Sie die Funktion is_uploaded_file() in PHP verwenden, um eine Beurteilung zu treffen:
$filename = $_FILES[' attachment']['tmp_name'];
if (is_uploaded_file($filename)) {
/* Ist eine hochgeladene Datei */
}
In In einigen Fällen kann es sein, dass der Inhalt der erfolgreich hochgeladenen Datei dem Benutzer angezeigt wird, nachdem der Benutzer die Datei hochgeladen hat. Daher ist die Überprüfung des obigen Codes besonders wichtig.
Eine weitere Sache, die überprüft werden muss, ist der MIME-Typ der hochgeladenen Datei, bei dem es sich um das oben erwähnte Typfeld des Ausgabearrays in upload.php handelt. Was ich im ersten Beispiel hochgeladen habe, ist ein Bild, daher ist der Wert von $_FILES['attachment']['type'] 'image/jpeg'. Wenn Sie vorhaben, auf der Serverseite nur Bilder vom Mime-Typ wie image/png, image/jpeg, image/gif, image/x-png und image/p-jpeg zu akzeptieren, können Sie zur Überprüfung Code ähnlich dem folgenden verwenden (Geben Sie einfach ein Beispiel. Beispiele, spezifische Codes, wie z. B. Fehlerberichte usw., sollten dem Mechanismus in Ihrem System folgen):
Who ,
Allow_mimes)) {
DIE ('Leider ist das Dateiformat, das Sie hochgeladen haben ungenau; wir akzeptieren nur Bilddateien.');
Wie Sie sehen, haben wir sichergestellt, dass der MIME-Typ der Datei den serverseitigen Anforderungen entspricht. Es reicht jedoch nicht aus, böswillige Benutzer daran zu hindern, andere schädliche Dateien hochzuladen, da dieser böswillige Benutzer vom Mime-Typ getarnt werden kann. Der Benutzer hat beispielsweise ein JPG-Bild erstellt, schädlichen PHP-Code in die Metadaten des Bildes geschrieben und es dann als Datei mit der Endung „php“ gespeichert. Wenn diese schädliche Datei hochgeladen wird, besteht sie die serverseitige MIME-Typprüfung erfolgreich und wird als Bild betrachtet, und der darin enthaltene gefährliche PHP-Code wird ausgeführt. Die spezifischen Bildmetadaten ähneln den folgenden:
Dateiname: image.jpg
Dateigröße: 182007 Bytes
Dateidatum: 2012:11:27 7:45:10
Auflösung: 1197 x 478
Kommentar: passthru( $_POST['cmd ']); __halt_compiler();
Wir können sehen, dass PHP-Code zum Kommentarfeld der Bildmetadaten hinzugefügt wurde. Daher liegt es auf der Hand, dass eine notwendige Überprüfung der Erweiterung der hochgeladenen Datei durchgeführt werden muss, um das Auftreten ähnlich gefährlicher Situationen zu verhindern. Der folgende Code erweitert den vorherigen Code zur Überprüfung des Mime-Typs:
$allow_mimes = array(
'image/png' => image/gif' => '.gif',
'image/jpeg' => '.jpg ',
'image/pjpeg' => '.jpg'
);
$image = $_FILES['attachment'];
if(!array_key_exists( $image['type'], $allow_mimes )) {
die('Entschuldigung, Sie haben es hochgeladen. Das Dateiformat ist nicht korrekt; wir akzeptieren nur Bilddateien.');
, 0, strrpos($image ['name'], '.'));
🎜>
// Weiterverarbeitung der hochgeladenen Datei 🎜>
Durch den obigen Code stellen wir sicher, dass auch wenn Wenn die Metadatei des hochgeladenen Bildes PHP-Code enthält, wird die Bilddatei mit dem Suffix „Datei mit dem Namen Bildformat“ umbenannt, sodass der darin enthaltene PHP-Code nicht ausgeführt wird. Der obige Code hat keine negativen Auswirkungen auf normal hochgeladene Bilder.
Wenn Sie nach der Durchführung der oben genannten Schritte zur Verbesserung der Sicherheit nur die hochgeladene Datei in einem bestimmten Verzeichnis speichern möchten, können Sie dazu die Standardfunktion move_uploaded_file von PHP verwenden:
Code kopieren
Der Code lautet wie folgt:
Möglicherweise möchten Sie auch die Größe der hochgeladenen Datei begrenzen, dann können Sie die Dateigrößenfunktion verwenden Ermitteln Sie die Größe der hochgeladenen Datei und führen Sie die weitere Verarbeitung nach der Beurteilung durch. Dies wird hier nicht näher erläutert, sodass Sie es selbst herausfinden können.
Okay, lasst uns hier erst einmal aufhören, über das Hochladen von Dateien zu schreiben. Ich hoffe, dieser Einführungsartikel ist hilfreich für Sie.