Solución:
Utilizando if( $ext !== 'gif'
) podría no ser eficiente. ¿Qué pasa si permites como 20 extensiones diferentes?
Tratar:
$allowed = array('gif', 'png', 'jpg');
$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if (!in_array($ext, $allowed)) {
echo 'error';
}
No se considera una buena práctica comprobar la extensión del archivo. El método preferido para realizar esta tarea es comprobar el tipo de archivos MIME.
Desde PHP:
<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE); // Return MIME type
foreach (glob("*") as $filename) {
echo finfo_file($finfo, $filename) . "n";
}
finfo_close($finfo);
?>
El ejemplo anterior generará algo similar a lo que debería verificar.
text/html
image/gif
application/vnd.ms-excel
Aunque los tipos MIME también se pueden engañar (editar los primeros bytes de un archivo y modificar los números mágicos), es más difícil que editar un nombre de archivo. Por lo tanto, nunca puede estar 100% seguro de qué tipo de archivo es realmente, y debe tener cuidado al manejar los archivos cargados / enviados por correo electrónico por sus usuarios.
Personalmente, prefiero usar la función preg_match ():
if(preg_match("/.(gif|png|jpg)$/", $filename))
o in_array ()
$exts = array('gif', 'png', 'jpg');
if(in_array(end(explode('.', $filename)), $exts)
Con in_array()
puede ser útil si tiene muchas extensiones para validar y realizar preguntas. Otra forma de validar imágenes de archivos: puede usar @imagecreatefrom*()
, si la función falla, esto significa que la imagen no es válida.
Por ejemplo:
function testimage($path)
{
if(!preg_match("/.(png|jpg|gif)$/",$path,$ext)) return 0;
$ret = null;
switch($ext)
{
case 'png': $ret = @imagecreatefrompng($path); break;
case 'jpeg': $ret = @imagecreatefromjpeg($path); break;
// ...
default: $ret = 0;
}
return $ret;
}
luego:
$valid = testimage('foo.png');
Asumiendo que foo.png
es un archivo de script PHP con .png
extensión, la función anterior falla. Puede evitar ataques como actualización de shell y LFI.