Upload de imagini fără surprize
Extensia nu înseamnă nimic, tipul MIME trimis de browser nici atât. Ce rămâne e re-encodarea.
Formularul de upload e cel mai des folosit drum de intrare într-un site PHP. Nu pentru că PHP ar fi fragil, ci pentru că e ușor să ai încredere în ce trimite browserul.
Ce nu e o verificare
- Extensia din numele fișierului. O alege atacatorul.
$_FILES['x']['type']. Îl trimite tot browserul, deci tot atacatorul.
Ce este
$info = @getimagesize($tmp);
if ($info === false) {
throw new RuntimeException('Fisierul nu este o imagine.');
}
Și, mai important, re-encodarea prin GD. Un fișier care conține cod PHP camuflat într-un comentariu EXIF nu supraviețuiește unei treceri prin imagecreatefromjpeg și imagejpeg.
Ultima plasă de siguranță
Chiar dacă totul de mai sus ar ceda, folderul cu fișiere urcate nu are voie să execute nimic:
<IfModule mod_php.c>
php_flag engine off
</IfModule>
RemoveHandler .php .phtml .php5
IfModule contează: pe hosting cu PHP în FastCGI, php_flag fără el întoarce eroare 500 pe tot site-ul.