una funzione utile per verificare se i file che uno tenta di inviare tramite un form sono consentiti.
può verificare anche il contenuto dei file zip
p.s.
se qualcuno ne ha voglia la trasformi in una classe e la posti e/o la migliori
può verificare anche il contenuto dei file zip
PHP:
<?php
/*ATTENZIONE: valido per PHP 5 >= 5.2.0, PHP 7, PECL zip >= 1.5.0*/
/*
la funzione può servire anche per verificare il contenuto di un file .zip, con alcune limitazioni esempio
i files dentro lo zip non devono essere contenuti in una cartella, se contenuti risponde FALSE
anche se i file fossero tra quelli ammessi
poi sarebbe opprtuno non solo verificare l'estenzione dei file,
ma anche il tipo che viene riportato da $_FILE['xyz']['type']
*/
function verifica_file($file='',$fa='',$ms=0){
//verifica impostazioni funzione
if($file=='' || !is_array($file) || $fa=='' || !is_array($fa) || $ms==0 || $ms==NULL){
return FALSE;
}
$nome_file=$file['name'];
$nome_file_tmp=$file['tmp_name'];
$grandezza_file=$file['size'];
$errore=(int)$file['error'];
if($errore!==0){return FALSE;}
if($grandezza_file > $ms){return FALSE;}
$est=strtolower(pathinfo($nome_file, PATHINFO_EXTENSION));
if(!in_array($est,$fa)){return FALSE;}
if($est!='zip'){//il file non è uno zip ed è tra gli ammessi
return TRUE;
}else{//il file è uno zip e quindi controllo il contenuto
//tolgo l'estenzione zip da ammessi
//in modo che lo zip non possa contenere a sua volta uno zip
for($k=0; $k<count($fa);$k++){
if($fa[$k]=='zip'){ unset($fa[$k]);}
}
//chiamo la classe zip
$zip = new ZipArchive();
//carico il file .zip nella cartella temporanea
$cart=pathinfo($nome_file_tmp,PATHINFO_DIRNAME);//cartella del temporaneo
$da_aprire=$cart."/$nome_file";
if(!move_uploaded_file($nome_file_tmp, $da_aprire)){return FALSE;}//sposto lo zip in cartella temporanea
if ($zip->open($da_aprire)!==TRUE){return FALSE;}
//e lo esploro
for ($j=0; $j<$zip->numFiles;$j++){
$stat = $zip->statIndex( $j );
$in_zip = $stat['name'];
$tipo=strtolower(pathinfo($in_zip, PATHINFO_EXTENSION));
if(!in_array($tipo,$fa)){
//unset($da_aprire);//forse conviene eliminarlo subito
return FALSE;
}
}
}
return TRUE;
}
/*---per test------------*/
if(isset($_POST['invia'])){
$ammessi=array('jpg','gif','png','zip');
$max_size=1000000;
if(verifica_file($_FILES['file'],$ammessi,$max_size)){
echo "<p style=\"color: #0F0; \">file consentito</p>";//ecc...allego all'email
}else{
echo "<p style=\"color: #F00; \">file <b>NON</b> consentito</p>";//ecc...rimando dove voglio
}
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<input name="file" type="file" /><br />
<input name="invia" type="submit" value="invia" />
</form>
p.s.
se qualcuno ne ha voglia la trasformi in una classe e la posti e/o la migliori