我的扩展过滤器问题php

时间:2017-10-13 14:17:55

标签: php

您好我的图片云中的过滤器扩展有问题,如果文件包含扩展名过滤器,它会很好用,如果他上传asd.php效果很好但是我有一个漏洞,如果有人写了image.jpg.php他可以上传并做他想做的......我该如何解决?

以下是代码:

<?php

//genera directorios random
$dirname = uniqid();
mkdir("uploads/$dirname", 0774);

//crea index.php en nuevos directorios con redireccion
$myfile = fopen("uploads/$dirname/index.php", "w") or die("");
$txt = "<?php
header('Location: /publictools/nube');
?>";
fwrite($myfile, $txt);
$txt = "<?php
header('Location: /publictools/nube');
?>";
fwrite($myfile, $txt);
fclose($myfile);

$folder = "uploads/$dirname/"; //directorio al que subir imagenes
$maxlimit = 9000000; //tamaño maximo
$allowed_ext = "png,jpg,gif"; //extensiones permitidas
$overwrite = "no"; //sobreescritura (yes/no)

$match = ""; 
$filesize = $_FILES['userfile']['size']; //tamaño de imagen
$filename = strtolower($_FILES['userfile']['name']); //pasa a minusculas


if(!$filename || $filename==""){ //ninguna imagen
   $error = "- Ninguna imagen selecccionada.<br>";
}elseif(file_exists($folder.$filename) && $overwrite=="no"){ //imagen existente
   $error = "- La imagen <b>$filename</b> ya existe<br>";
}

//comprobar tamaño de imagen
if($filesize < 1){ //imagen vacia
   $error .= "- Imagen vacía.<br>";
}elseif($filesize > $maxlimit){ //imagen supera el máximo permitido
   $error .= "- Esta imagen supera el tamaño maximo.<br>";
}

$file_ext = preg_split("/\./",$filename);
$allowed_ext = preg_split("/\,/",$allowed_ext);
foreach($allowed_ext as $ext){
   if($ext==$file_ext[1]) $match = "1"; //acepta la imagen
}

//extensión no permitida
if(!$match){
   $error .= "- Este tipo de archivo no está permitido: $filename<br>";
}

if($error){
   print "Se ha producido el siguiente error al subir la imagen:<br> $error"; //errores
}else{
   if(move_uploaded_file($_FILES['userfile']['tmp_name'], $folder.$filename)){ //sube la imagen
      print "<div align='center'>Encontraras tu imagen <a href='http://*****/uploads/$dirname/$filename'>Aqui</a></div></form>"; //upload correcto
   }else{
      print "Error!"; //error
   }
}

?>

1 个答案:

答案 0 :(得分:0)

你可以使用现有的函数pathinfo来做这样的事情:

// use pathinfo to parse the name
$ext = pathinfo($filename, PATHINFO_EXTENSION);
// check if the extension is in the allowed extensions
$allowed = preg_split("/\,/",$allowed_ext);
$match = (!in_array($ext,$allowed)) ? false : true;