Buscar en la base de conocimientos
< Todos los temas
Imprimir

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

  1. Configuración Inicial
    Se define una carpeta uploads/ 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.
  2. 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.
  3. Prevención de Colisiones
    Para evitar que archivos con el mismo nombre sobrescriban otros, se genera un nombre único usando uniqid().
  4. Subida Segura
    El archivo se mueve de su ubicación temporal a la carpeta de destino utilizando move_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 carpeta uploads/ 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.

Sidebar