Încărcarea fișierelor la server folosind PHP

În ultimul articol v-am spus despre mecanismul de încărcare a fișierelor pe server folosind PHP. În acest articol, am deschis procesul de boot în sine și nu sunt legate de problemele de securitate.

Frecvent descărcare fișiere fără controalele de securitate corespunzătoare duce la vulnerabilități care, în practică, au devenit o problemă reală în aplicațiile web PHP.

Prin urmare, în acest articol voi încerca să descrie principalele vulnerabilități ale aplicațiilor Web pentru a descărca fișiere pe server și cum să le evite.

Să începem. Primul lucru care vine în minte fiecare dezvoltator verifică fișier Content-Type. Cu alte cuvinte - permit descărcarea de fișiere de tip strict definite. Să ne uităm la codul:

Dacă un utilizator standard încearcă să descarce orice alt fișier, dar GIF-imagine, el va fi avertizat! Dar atacatorul nu va utiliza formularul web de pe site.

El poate scrie un scurt Perl-script (probabil, în orice limbă). care va imita acțiunile utilizatorului pentru a descărca fișiere. în scopul de a modifica datele trimise la usmotrenie.Tak lor pentru a verifica modul de tip MIME vine împreună cu cererea, nimic nu împiedică un atacator să-l instaleze în «imagine / GIF», deoarece cu o emulare client, el are cereri complete de control care este trimis.

Funcția getimagesize () va determina dimensiunea GIF, JPG, PNG, SWF, PSD, TIFF sau BMP și returnează dimensiunea, tipul de fișier și un șir de text lățime înălțime / pentru a fi utilizat în interiorul unui HTML normal tag-ul IMG.

Să vedem cum putem folosi acest lucru în scriptul nostru:

Ați putea crede că ne putem odihni acum siguri că numai fișierul GIF sau JPEG pentru a fi încărcate. Din păcate, acest lucru nu este cazul. Fișierul poate fi într-adevăr în format JPEG GIF sau, și, în același timp, PHP-script. Cele mai multe formate de imagine vă permite să adăugați text în metadatele imaginii. Posibilitatea de a crea o imagine corecta complet care conține un cod PHP în metadate. Când getimagesize () se uită la dosar, acesta va lua ca GIF sau JPEG valide. Când PHP compilator uita la dosar, acesta vede codul PHP executabil într-un „gunoi“ binar, care vor fi ignorate.

S-ar putea întreba, de ce nu a verifica afară o extensie de fișier? Dacă nu permitem fișiere de încărcare la * .php. atunci serverul nu va fi capabil să execute acest fișier ca un script. Să ne uităm la o abordare.

Puteți crea o listă albă de extensii și verificați numele fișierului descărcat pentru a se potrivi lista albă.

Expresia! Preg_match ( "/ $ element \ $ / i", $ _FILES [ 'uploadFile'] [ 'nume']) verifică numele fișierului specificat de către utilizator într-o serie de liste albe. Modificatorii «I», spune caz-insensibil nostru de expresie. În cazul în care extensia fișierului corespunde unuia dintre elementele din lista albă, fișierul va fi încărcat, în caz contrar script-ul va genera o eroare!

După cum puteți vedea încredere și extinde Content-Type nu poate fișier. Prin urmare, este necesar, în directorul unde ați descărcat fișierele pentru a adăuga toate fișierul .htaccess pentru care prescrie următoarele linii:

Aceste linii din .htaccess determina serverul sa nu execute php, etc fișiere, și a afișa conținutul de pe ecran.

Asta-i tot! Mult noroc!

Evaluează acest articol: