So che non puoi mai essere sicuro di aver fatto abbastanza per essere sicuro, e so anche che il caricamento dei file è difficile da correggere. Prima di fare questa domanda ho letto alcuni dei post correlati qui come rischio di caricamento di immagini php , Quali passaggi devono essere adottati per convalidare ... e rischi per la sicurezza del caricamento .
Quindi penso di aver fatto tutto il necessario, ma sarei molto grato se qualcuno potesse dare un'occhiata a quello che ho e dire se ho fatto abbastanza. Quindi sto eseguendo l'ultimo PHP 5.5.9-1+sury.org~saucy+1
su Apache/2.4.7
. E il mio metodo di caricamento è il seguente:
public static function uploadTemp($number, $file){
//check if the filename exist and upload was without an error
if (!$file['name'] || $file['error']){
return false;
}
// check if extension is valid
if (!Helper::validExtension($file['name'])){
return false;
}
// check is the size of file is valid
if ($file['size'] > (1024 * 1024 * 6) || $file['size'] < 1024 * 10){
return false;
}
// no need to upload images less than 50x50. Also $file['size'] can be spoofed
$imageSize = getimagesize($file['tmp_name']);
if ($imageSize === false || $imageSize[0] < 50 || $imageSize[1] < 50){
return false;
}
require_once('SimpleImage.php');
$image = new SimpleImage();
$image->load($file['tmp_name']);
// saving a file to a temporary directory and renaming it.
$image->save(Image::$tempDir.$number.'.jpg');
return true;
}
SimpleImage è uno strumento open source per manipolare un'immagine , all'interno di uno strumento ho cambiato solo una cosa (funzione salva per salvare ogni file con permessi 644 ). Il mio $number
è una stringa che è una concatenazione di numeri casuali e un timestamp corrente, $file = $_FILES['fileToUpload']
e validExtension guarda nel seguente modo:
public static function validExtension($filename){
$extensions = array('jpg', 'jpeg', 'png');
$arr = explode('.', $filename);
if ( in_array(strtolower(end($arr)), $extensions) ){
return true;
} else return false;
}
La mia cartella temporanea ha 755 permessi.
Quindi la mia domanda è: mi manca qualcosa qui o c'è modo in cui posso migliorare le cose:
- potrebbe limitare ulteriori permessi (non ho bisogno di fare nulla con le immagini se non di vederle dal client. La cartella è usata solo per il caricamento delle immagini)
- potrebbe cambiare alcuni parametri in php.ini o apache