Buscar en la base de conocimientos
Subida de Archivos Segura con PHP
Introducción
La subida de archivos es una funcionalidad común en aplicaciones web, pero debe manejarse con cuidado para evitar problemas de seguridad. En este artículo, veremos cómo crear un script de PHP que permita subir archivos de forma segura, validando el tipo de archivo y limitando su tamaño.
Código PHP: Script para Subida de Archivos
<?php
// Configuración
$directorio_destino = "uploads/";
$tamaño_maximo = 2 * 1024 * 1024; // 2 MB
$formatos_permitidos = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
// Validar que se haya enviado un archivo
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['archivo'])) {
$archivo = $_FILES['archivo'];
$nombre = basename($archivo['name']);
$tamaño = $archivo['size'];
$temp_path = $archivo['tmp_name'];
$extension = strtolower(pathinfo($nombre, PATHINFO_EXTENSION));
// Validaciones
if ($tamaño > $tamaño_maximo) {
echo "El archivo excede el tamaño permitido de 2 MB.";
} elseif (!in_array($extension, $formatos_permitidos)) {
echo "Formato no permitido. Solo se permiten JPG, PNG, GIF y PDF.";
} else {
$nuevo_nombre = uniqid() . "." . $extension;
$ruta_destino = $directorio_destino . $nuevo_nombre;
// Subir el archivo
if (move_uploaded_file($temp_path, $ruta_destino)) {
echo "Archivo subido con éxito: $ruta_destino";
} else {
echo "Error al subir el archivo.";
}
}
} else {
echo "No se ha seleccionado ningún archivo.";
}
?>
Explicación del Código
- Configuración Inicial
Se define una carpetauploads/
donde se almacenarán los archivos subidos. También se establece un límite de 2 MB para el tamaño de los archivos y una lista de extensiones permitidas. - Validación del Archivo
- Se verifica si el archivo fue enviado correctamente mediante
$_FILES
. - Se valida el tamaño del archivo.
- Se comprueba que la extensión del archivo esté dentro de los formatos permitidos.
- Se verifica si el archivo fue enviado correctamente mediante
- Prevención de Colisiones
Para evitar que archivos con el mismo nombre sobrescriban otros, se genera un nombre único usandouniqid()
. - Subida Segura
El archivo se mueve de su ubicación temporal a la carpeta de destino utilizandomove_uploaded_file()
, asegurando que solo se suban archivos a través de HTTP POST.
Consideraciones de Seguridad
- Protección contra scripts maliciosos:
Limitar las extensiones previene la ejecución de scripts PHP disfrazados de archivos normales. - Verificación del MIME-Type (Opcional):
Se recomienda implementar una validación adicional que verifique el tipo MIME del archivo para mayor seguridad. - Permisos de Carpeta:
Asegúrate de que la carpetauploads/
tenga permisos de escritura, pero no de ejecución (chmod 755
).
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Subir Archivo</title>
</head>
<body>
<h2>Sube tu Archivo</h2>
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="archivo">Selecciona un archivo:</label>
<input type="file" name="archivo" id="archivo">
<br><br>
<button type="submit">Subir Archivo</button>
</form>
</body>
</html>
Conclusión
Este script es una excelente base para cualquier aplicación que requiera subir archivos. Se puede ampliar con funcionalidades como la validación del contenido o la integración con bases de datos para registrar las subidas.
Si buscas mejorar la seguridad, considera también sanitizar el nombre del archivo y validar aún más el tipo de archivo subido.