PHP: la procedura errata per controllare le dimensioni dei file nell'upload

In PHP esiste una procedura specifica ma errata per gestire le dimensioni dei file per l'upload.

PHP di Gabriele Romanato

In PHP esiste una procedura specifica ma errata per gestire le dimensioni dei file per l'upload.

Partiamo dall'esempio canonico della documentazione:


<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

Il controllo avviene confrontando il valore di $_FILES['userfile']['error']: se è UPLOAD_ERR_FORM_SIZE ossia 2, il file che si sta cercando di uploadare supera in byte la dimensione specificata nel campo del form MAX_FILE_SIZE.

Tuttavia fare affidamento solo su questo campo non impedisce l'invio remoto del form con un valore molto più grande per MAX_FILE_SIZE. Per prevenire questo tipo di exploit occorre utilizzare anche (e soprattutto) una validazione su $_FILES['userfile']['size'] verificando che non superi il valore massimo consentito o che generi gli errori UPLOAD_ERR_INI_SIZE o UPLOAD_ERR_NO_FILE.