Hola a la gente del foro, estoy tratando de hacer un upload de imagenes seguro en PHP, en la cual los usuarios puedan subir imagenes en una carpeta y publicarlas en el foro.
Tengo el siguiente codigo:
<form action="" method="post" enctype="multipart/form-data">
<p>
<input type="file" name="imagen">
<input type="submit" name="submit" value="Subir" /></p>
</form>
<?php
if(isset($_FILES['imagen'])){
//configuracion
$permitidas = array('jpg','jpeg','png','gif'); //extensiones permitidas
$size=2097152; //tamano maximo en bytes
$url="http://localhost/otros/upload/"; //con / al final
$carpeta="images/"; //carpeta de las imagenes
$errores = array();
$nombre = trim($_FILES['imagen']['name']);
$ext = strtolower(end(explode('.',$nombre)));
$tamano = $_FILES['imagen']['size'];
$tmp = $_FILES['imagen']['tmp_name'];
$urlimagen=$carpeta.rand().$nombre;
if(in_array($ext,$permitidas) === false){
$errores[] = 'Extension no permitida';
}
if($tamano>$size){
$errores[] = 'El tamaño del archivo debe ser menor a 2mb';
}
if(empty($errores)){
if(move_uploaded_file($tmp,$urlimagen)){
?>
<h3>html</h3>
<input type="text" value="<img src='<?php echo $url.$urlimagen ?>'>" /><br />
<h3>BBcode</h3>
<input type="text" value="[img]<?php echo $url.$urlimagen ?>[/img]" /><br />
<h3>Enlace directo</h3>
<input type="text" value="<?php echo $url.$urlimagen ?>" /><br />
<?php
}
}else{
foreach($errores as $error){
echo $error."<br />";
}
}
}
?>
Sube archivos con extensiones de imagenes, al subir un php da un error
Extension no permitida
Hay bien, pero pueden burlar el sistema y subir una imagen con codigo php ejemplo, subo una imagen con codigo php y luego edito por post jpg por php y subiria un archivo php?
Espero me ayuden.
Saludos! y disculpen la pregunta.
Hombre, pueden subir una imágen (válida) con código PHP en los comentarios, aunque si has verificado que en tu web no hay LFI, no hay problema ;)
Igual pasala por GD, así se eliminan los comentarios y, también aplicale algo como getimagesize() o similares, si tiran error es que no es una imágen válida, así cancelas el upload y listo.
PD: Filtra también que el nombre no contenga el byte nulo porque, si lo contiene, no estoy seguro pero puede que logren bypassear tu filtro.
Explicación sobre el byte nulo:
Imaginate que tienes esto en PHP:
<? if(file_exists('include/'.$_GET['include'].'.php')) include('include/'.$_GET['include'].'.php'); ?>
Y yo voy a:
file.php?include=../files/avatares/mi_avatar_con_comentario_malicioso.jpg%00
Se incluiría perfectamente el archivo, pues el %00 es el byte nulo, que indica el final del string, por lo que el resto es ignorado y el include queda como include/../files/avatares/mi_avatar_con_comentario_malicioso.jpg, y, al tener los tags PHP <? ?> (la imagen en los comentarios), la función include los evalúa y ejecúta el código, por lo que el atacante tendría el poder de ejecutar código PHP en tu servidor (más que suficiente para hackearte por completo).
Nota: no es necesario que el archivo sea .php para que include() ejecute el código que hay en él (entre los tags <? ?>).
Espero que me hayas entendido.
Saludos.
Lo mejor que puedes hacer es pasarla por GD (http://php.net/manual/es/book.image.php), así evitar la inyección de código .
También puedes ver esto:
http://es.php.net/manual/es/security.hiding.php
Lo mejor es tener un código libre de errores, pero cada eslabón de seguridad adicional ayudan.
Un saludo!