1. Client-Seite-Validierung: Während nicht narrensicher (da bösartige Benutzer dies umgehen können), verbessert die clientseitige Validierung mit JavaScript die Benutzererfahrung durch sofortiges Feedback und reduziert die Last auf dem Server. Dies beinhaltet die Überprüfung der Dateigröße, des Typs und des potenziellen Inhalts der Datei (obwohl dies komplexer ist und häufig mit der serverseitigen Handlung gehandhabt wird). In diesem Schritt wird JavaScript verwendet, um zu verhindern, dass offensichtlich ungültige Dateien überhaupt übermittelt werden.
2. Serverseitige Validierung: Dies ist die entscheidende Ebene. Vertrauen Sie niemals die kundenseitige Validierung allein. Auf dem Server müssen Sie die hochgeladene Datei streng validieren:
$ _ Dateien
superglobal: Zugriff auf die hochgeladenen Dateiinformationen über die $ _ -Dateien
superglobal -Array. Dieses Array enthält Details wie Dateiname, Größe, Typ, temporärer Speicherort und Fehlerstatus. Verwenden Sie $ _ Dateien ['Datei'] ['Größe']
und vergleichen Sie es mit Ihrer maximal zulässigen Größe (in Bytes). Verwenden Sie stattdessen die Funktion finfo_open ()
(Teil der Erweiterung fileInfo
, die aktiviert werden sollte), um zuverlässigere Dateitypinformationen zu erhalten: <code class="php"> $ finfo = finfo_open (FileInfo_Mimes_Mime_Type); $ mimetype = finfo_file ($ finfo, $ _files ['Datei'] ['tmp_name']); Finfo_close ($ finfo); // Überprüfe gegen erlaubte MIME -Typen $ erlaubtMimetypes = ['Bild/jpeg', 'image/png', 'image/gif']; if (! in_array ($ mimetype, $ erlaubteMimetypes)) {// Behandeln Sie ungültige Dateitypen} </code>
patinfo ()
überprüfen. Dies ist jedoch leicht gefälscht. Kombinieren Sie dies immer mit der Überprüfung des MIME -Typs. 3. Sichere Dateispeicher: Speichern Sie die Datei nach der Validierung an einem sicheren Ort außerhalb des Webroot -Verzeichnisses. Dies verhindert den direkten Zugriff über einen Webbrowser. Verwenden Sie einen einzigartigen Dateinamen, um Kollisionen und potenzielle Schwachstellen zu vermeiden. // außerhalb von Webroot! $ UniqueFileName = uniqid (). '_'. Basisame ($ _ Datei ['Datei'] ['Name']); $ targetFilepath = $ targetDir. $ UniqueFileName; if (move_uploaded_file ($ _ file ['file'] ['tmp_name'], $ targetFilepath)) {// Datei -Upload erfolgreich} else {// Upload -Fehler -Fehler}
finfo_file ()
wie oben beschrieben. Vermeiden Sie es, sich ausschließlich auf Dateierweiterungen zu verlassen. ../
in Dateinamen) zu verwenden, um auf Dateien außerhalb des abgeschlossenen Upload -Verzeichnisses zuzugreifen und zu ändern. Minderung: sorgfältig mit Funktionen wie BasisName ()
sorgfältig mithilfe von Dateinamen zur Verhinderung des Verzeichnistraversalangriffs sorgfältig. Überprüfen und steuern Sie den Zielpfad immer rigoros. Minderung: streng erzwingen, dass die hochgeladene Datei aus dem Browser des Clients verwendet wird, wobei Überprüfungen zu $ _ Dateien
verwendet werden, und vermeiden Sie die dynamische Aufnahme von Dateien basierend auf Benutzereingaben. Minderung: minitieren oder entkommen alle vom Benutzer bereitgestellten Inhalte, einschließlich Dateinamen, oder entkommen, bevor sie auf der Website angezeigt werden. Verwenden Sie geeignete Codierungsmechanismen, die auf dem Kontext basieren (HTML Escaping, URL -Codierung usw.). Minderung: streng durchsetzungsbedingte Dateitypen und -verlängerungen und vermeiden Sie jemals, dass benutzerbezogene Dateien als PHP-Code einbezogen werden. Wie bereits erwähnt, ist es unzureichend, sich ausschließlich auf $ _ Dateien ['Datei'] ['Typ'] zu verlassen. // 5mb if ($ _files ['Datei'] ['Größe'] & gt; $ maxsizEinBytes) {// Dateigröße überschreiten}
Dateityp -Typ -Validierung (Empfohlen):
p> prefo
code -code -code -code -code -code -code -associng für Robust MIME -Typ. class = "php"> $ finfo = finfo_open (FileInfo_Mime_Type); $ mimetype = finfo_file ($ finfo, $ _files ['Datei'] ['tmp_name']); Finfo_close ($ finfo); $ erlaubteMimetypes = ['Bild/jpeg', 'image/png', 'image/gif']; if (! in_array ($ mimetype, $ erlaubteMimetypes)) {// Behandeln Sie ungültige Dateityp}
Zusätzliche Überprüfungen:
Das obige ist der detaillierte Inhalt vonWie implementiere ich sichere Datei -Uploads in PHP 8?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!