1. Datei -Upload
Damit der Benutzer des Clients Dateien hochladen kann, müssen wir ein Formular in der Benutzeroberfläche bereitstellen, um Anfragen zum Hochladen von Dateien einzureichen. Da die hochgeladene Datei im Gegensatz zu anderen Postdaten spezielle Daten sind, müssen wir eine spezielle Codierung für das Formular festlegen:
Kopieren Sie den Code wie folgt: <form action = "upload.php" method = "post" engType = "MultiPart/Form-Data"> </form>
Möglicherweise sind Sie mit den oben genannten EngeTeT -Attributen nicht vertraut, da dies oft ignoriert wird. Wenn die HTTP-Postanforderung jedoch sowohl regelmäßige Daten als auch Dateidaten enthält, sollte dieses Attribut hinzugefügt werden, was die Kompatibilität für verschiedene Browser verbessern kann.
Als nächstes müssen wir dem Formular ein Feld hinzufügen, um die Datei hochzuladen:
Kopieren Sie den Code wie folgt: <Eingabe type = "Datei" name = "Attachment">
Die obigen Dateifelder können sich in verschiedenen Browsern unterschiedlich verhalten. Für die meisten Browser werden die oben genannten Felder in ein Textfeld mit einer Browsertaste gerendert. Auf diese Weise kann der Benutzer den Dateipfad selbst in das Textfeld eingeben oder die Datei auswählen, die von der lokalen Festplatte über die Browsertaste hochgeladen werden soll. In der Safari von Apple scheint es jedoch, dass nur das Surfen verwendet werden kann. Natürlich können Sie auch den Stil dieser Upload -Box anpassen, damit sie eleganter aussieht als den Standardstil.
Um besser zu erklären, wie Sie Dateien -Uploads behandeln, geben Sie ein vollständiges Beispiel an. Mit dem folgenden Formular können Benutzer beispielsweise Anhänge auf meinen lokalen Server hochladen:
Kopieren Sie den Code wie folgt: <p> Bitte laden Sie Ihren Anhang hoch: </p>
<form action = "upload.php" method = "post" engType = "MultiPart/Form-Data">
<Eingabe type = "Datei" name = "Attachment">
<input type = "surug" value = "Anhang hochladen">
</form>
TIPP: Sie können den Maximalwert festlegen, mit dem Dateien über upload_max_filesize in php.ini hochgeladen werden können. Darüber hinaus gibt es auch eine post_max_size, mit der die maximalen Formulardaten festgelegt werden können, die hochgeladen werden dürfen. durch Festlegen dieses Feldes. Beachten Sie jedoch, dass der Wert des letzteren größer sein muss als der erstere, da erstere zu einem Teil der Formdaten des letzteren gehört.
Abbildung 1. Upload -Formular in Firefox
Wenn dieses Formular eingereicht wird, wird die HTTP -Anfrage an upload.php gesendet. Um anzuzeigen, welche spezifischen Informationen in Upload.php verwendet werden können, habe ich sie in Upload.php ausgedruckt:
Die Codekopie lautet wie folgt:
Header ('Inhaltstyp: Text/Ebene');
print_r ($ _ Dateien);
Lassen Sie uns ein Experiment durchführen.
Kopieren Sie den Code wie folgt: Array
(
[Anhang] => Array
(
[Name] => boy.jpg
[Typ] => Bild/JPEG
[tmp_name] => d: /xampp/tmp/php1168.tmp
[Fehler] => 0
[Größe] => 11490
)
)
Das obige sind alle Informationen über die aktuell hochgeladene Datei im globalen Array, nachdem die Datei hochgeladen wurde. Können wir jedoch sicherstellen, dass diese Informationen sicher sind, was ist, wenn Name oder andere Informationen manipuliert wurden? Wir müssen immer wachsam über Informationen von Kunden sein!
Jeder Teil der spezifischen HTTP -Anfrage
Um das Upload von Dateien besser zu verstehen, müssen wir überprüfen, welche spezifischen Informationen in der vom Client gesendeten HTTP -Anfrage enthalten sind. Der Anhang, den ich zuvor hochgeladen habe, war das Logo dieses Blogs, da es sich um ein Bild handelt. Es ist für uns nicht geeignet, die obigen Experimente durchzuführen. Also habe ich erneut einen Test.text -Textdatei hochgeladen, der den folgenden Inhalt enthält:
Die Codekopie lautet wie folgt:
360W
360 Tage
Leben eines Webjungen
Okay. Jetzt lade ich diese Textdatei hoch und mache sie in Upload.php aus:
Die Codekopie lautet wie folgt:
Array
(
[Anhang] => Array
(
[Name] => test.txt
[Typ] => Text/Ebene
[tmp_name] => d: /xampp/tmp/php51c0.tmp
[Fehler] => 0
[Größe] => 40
)
)
Schauen wir uns die vom entsprechenden Browser gesendete HTTP -Postanforderung an (ich habe einige optionale Header weggelassen):
Die Codekopie lautet wie folgt:
Post /Upload.php http /1.1
Gastgeber: www.360weboy.me
Referer: http://www.360weboy.me/
Multipart/Form-Data; -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------
Inhaltslänge: 234
----------------------------------- 24464570528145
Inhaltsdisposition: Form-Data;
Inhaltstyp: Text/Ebene
360WEBOY
360 Tage
Leben eines Webjungen
------------------------------------ 24464570528145-
Es gibt mehrere Felder im obigen Anforderungsformat, Name, Dateiname und Inhaltstyp test.txt und das hochgeladene Dateiformattext/die Textdatei (repräsentiert Textdatei). Anschließend sehen wir, dass die folgende Zeile der spezifische Inhalt in der hochgeladenen Datei ist.
2. Sicherheit stärken
Um die Sicherheit im Datei -Upload zu verbessern, müssen wir den TMP_NAME und die Größe im globalen Array $ _files überprüfen. Um sicherzustellen, dass die von TMP_NAME angezeigte Datei tatsächlich die vom Benutzer im Client hochgeladene Datei ist, anstatt auf so etwas wie /etc /passwd zu zeigen, können Sie die Funktion is_Uploaded_file () in PHP verwenden, um das folgende Urteil zu fällen :
Die Codekopie lautet wie folgt:
$ Dateiname = $ _files ['Anhang'] ['tmp_name'];
if (is_Uploaded_file ($ Dateiname)) {
/ * ist eine hochgeladene Datei.
}
In einigen Fällen kann nach dem Hochladen des Benutzer die Datei der Inhalt der erfolgreich hochgeladenen Datei dem Benutzer zum Anzeigen angezeigt werden, sodass die Überprüfung des oben genannten Code besonders wichtig ist.
Eine andere Sache, die Sie überprüfen sollten, ist der MIME-Typ der Upload-Datei, der das Feld des Ausgabearrays in der obigen Upload.php ist. Was ich im ersten Beispiel hochgeladen habe, ist ein Bild, daher ist der Wert von $ _files ['Anhang'] ['Typ'] 'Bild/JPEG'. Wenn Sie vorhaben, nur MIME-Bilder wie Bild/PNG, Image/JPEG, Image/GIF, Image/X-PNG und Image/P-JPEG auf der Serverseite zu akzeptieren, können Sie Code ähnlich wie folgt verwenden, um dies zu überprüfen (Schauen Sie es sich einfach an.) Beispiele, spezifische Codes wie Fehler sollten den Mechanismen in Ihrem System folgen):
Die Codekopie lautet wie folgt:
$ degly_mimes = Array (Array (
'Bild/png',
'Bild/X-PNG',
'Bild/GIF',
'Bild/JPEG',
'Bild/PJPEG'
);
$ image = $ _files ['Anhang'];
if (! in_array ($ image ['type'], $ degly_mimes)) {
Die ('Entschuldigung, das von dir hochgeladene Dateiformat ist ungenau; wir akzeptieren nur Bilddateien.');
}
// Verarbeiten Sie weiter hochgeladene 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 bösartige Benutzer vorgeben können, von diesem MIME-Typ getarnt zu werden. Zum Beispiel machte der Benutzer ein JPG -Bild, schrieb einen böswilligen PHP -Code in die Metadaten des Bildes und speichert es als Datei mit dem Suffix namens PHP. Wenn diese böswillige Datei hochgeladen wird, wird sie erfolgreich von der Serverseite auf MIME-Typ überprüft, was als Bild angesehen wird, und der gefährliche PHP-Code im Inneren wird ausgeführt. Die Metadaten des spezifischen Bildes ähneln den folgenden:
Die Codekopie 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']);
Wir können sehen, dass der PHP -Code dem Kommentarfeld der Bildmetadaten hinzugefügt wird. Es ist also offensichtlich, dass, um ähnliche gefährliche Situationen zu verhindern, eine notwendige Überprüfung der Erweiterung der hochgeladenen Datei ebenfalls durchgeführt werden muss. Der folgende Code erhöht den vorherigen Code zum Überprüfen von MIME-Typen:
Die Codekopie lautet wie folgt:
$ degly_mimes = Array (Array (
'Bild/png' => '.png',
'Bild/X-Png' => '.png',
'Bild/Gif' => '.gif',
'Image/jpeg' => '.jpg',
'Image/pjpeg' => '.jpg'
);
$ image = $ _files ['Anhang'];
if (! array_key_exists ($ image ['type'], $ degly_mimes)) {
Die ('Entschuldigung, das von dir hochgeladene Dateiformat ist ungenau; wir akzeptieren nur Bilddateien.');
}
// Erhalten Sie den Dateinamen mit weggelassenem Suffix -Namen:
$ Dateiname = substr ($ image ['name'], 0, strpos ($ image ['name'], '.'));
// Fügen Sie einen Suffixnamen hinzu
$ fileName. = $ degly_mimes [$ image ['type']];
// Verarbeiten Sie weiter hochgeladene Dateien
Über den obigen Code stellen wir sicher, dass auch wenn das hochgeladene Bildmetafile den PHP -Code enthält, die Bilddatei als Datei mit dem Suffixnamen und dem Bildformat umbenannt wird, sodass der darin enthaltene PHP -Code nicht ausgeführt wird. Der obige Code hat keinen negativen Einfluss auf normale hochgeladene Bilder.
Nachdem Sie die obigen Schritte zur Verbesserung der Sicherheitsüberprüfungen ausgeführt haben, können Sie die Standardfunktion verwenden, wenn Sie nur die hochgeladene Datei in einem angegebenen Verzeichnis speichern möchten, die Standardfunktion move_Uploaded_file von PHP, um es zu implementieren:
Die Codekopie lautet wie folgt:
$ tmp_filename = $ _files ['Attachment'] ['tmp_name'];
$ Dateiname = '/path/to/attachment.txt';
if (move_uploaded_file (tmp_filename, $ Dateiname)) {
/ * $ TEMP_FILENAME Die im temporäre Verzeichnis gespeicherte Upload -Datei und dann erfolgreich in der entsprechenden Verzeichnis in der Anhang.txt speichern.
}
Möglicherweise müssen Sie auch die Größe der hochgeladenen Datei einschränken, damit Sie die Dateigröße verwenden können, um die Größe der hochgeladenen Datei zu erhalten, Urteile zu fällen und weiter zu verarbeiten.
Okay, lassen Sie uns dies vorerst über das Datei -Upload schreiben. Ich hoffe, dieser Einführungsartikel wird Ihnen hilfreich sein.