Heim >Web-Frontend >js-Tutorial >Einführungs-Tutorial zum Hochladen von PHP-Dateien (Erklärung mit Beispielen)_Grundkenntnisse

Einführungs-Tutorial zum Hochladen von PHP-Dateien (Erklärung mit Beispielen)_Grundkenntnisse

WBOY
WBOYOriginal
2016-05-16 16:52:531879Durchsuche

一、文件上传

为了让客户端的用户能够上传文件,我们必须在用户界面中提供一个表单用于提交上传文件的请求。由于上传的文件是一种特殊数据,不同于其它的post数据,所以我们必须给表单设置一个特殊的编码:

复制代码 代码如下:


以上的enctype属性,你可能不太熟悉,因为这常常会被忽略掉。但是,如果http post请求中既有常规数据,又包含文件类数据的话,这个属性就应该显示加上,这样可以提高针对各种浏览器的兼容性。

接下来,我们得向表单中添加一个用于上传文件的字段:

复制代码 代码如下:


上述文件字段在各种浏览器中可能表现会有所不同。对于大多数的浏览器,上述字段都会被渲染成一个文本框加上一个浏览按钮。这样,用户既可以自行输入文件的路径到文本框中,也可以通过浏览按钮从本地硬盘上选择所要上传的文件。但是,在苹果的Safari中,貌似只能使用浏览这种方式。当然,你也可以自定义这个上传框的样式,使它看起来比默认的样式优雅些。

下面,为了更好的阐述怎么样处理文件上传,举一个完整的例子。比如,以下一个表单允许用户向我的本地服务器上上传附件:

复制代码 代码如下:

请上传你的附件:






提示:可以通过php.ini中的upload_max_filesize来设置允许上传文件的最大值。另外,还有一个post_max_size也可以用来设置允许上传的最大表单数据,具体意思就是表单中各种数据之和,所以你也可以通过设置这个字段来控制上传文件的最大值。但是,注意后者的值必须大于前者,因为前者属于后者的一部分表单数据。

Einführungs-Tutorial zum Hochladen von PHP-Dateien (Erklärung mit Beispielen)_Grundkenntnisse
 

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:

Code kopieren Code wie folgt :

header('Content-Type: text/plain');
print_r($_FILES);


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:
Kopieren Sie den Code Der Code lautet wie folgt:
Array
                                                                                            [Name] => Junge .jpg
[Typ] => > [tmp_name] => D:xampptmpphp1168.tmp
[error] =&g t;                                                                             > )

)



Das Obige ist Alle Informationen über die aktuell hochgeladene Datei im globalen Array, nachdem die Datei hochgeladen wurde. Können wir jedoch garantieren, dass diese Informationen sicher sind? Was passiert, wenn der Name oder andere Informationen manipuliert wurden? Wir müssen immer wachsam gegenüber Informationen von Kunden sein!

Teile der spezifischen http-Anfrage
Um den Datei-Upload besser zu verstehen, müssen wir prüfen, welche spezifischen Informationen in der vom Kunden gesendeten http-Anfrage enthalten sind. Der Anhang, den ich zuvor hochgeladen habe, ist das Logo dieses Blogs. Da es sich um ein Bild handelt, ist es für uns nicht geeignet, das obige Experiment durchzuführen. Also habe ich eine test.text-Textdatei erneut hochgeladen, die insbesondere den folgenden Inhalt enthält:


Code kopieren

Der Code ist wie folgt folgt: 360w 360 Tage Life Of A Web Boy
Okay. Wenn ich nun diese Textdatei hochlade, wird sie in upload.php ausgegeben:



Kopieren Sie den Code

Der Code lautet wie folgt: Array ( [attachment] => Array
(
[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:

Code kopieren Der Code lautet wie folgt:


$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):

Code kopieren Der Code lautet wie folgt:
                                                                                                                                                                        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:
Kopieren Sie den Code Der Code lautet wie folgt:


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:
Kopieren Sie den Code Der Code lautet wie folgt:


            $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:


$tmp_filename = $_FILES['attachment']['tmp_name ']; $filename = '/path/to/attachment.txt'; if (move_uploaded_file(tmp_filename, $filename)) { /* $temp_filename im temporären Verzeichnis gespeichert Laden Sie die Datei hoch und dann erfolgreich Speichern Sie es in der Datei attachment.txt im entsprechenden Verzeichnis */       }
   
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.
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn