En WordPress, los archivos subidos a la biblioteca de medios son accesibles mediante una URL directa, lo que permite que cualquier persona con el enlace pueda descargarlos sin restricciones. Esto representa un problema de seguridad si se trata de documentos privados, archivos de pago o recursos exclusivos que solo deberían estar disponibles para usuarios autorizados.
Este artículo explica cómo impedir la descarga directa de archivos en WordPress mediante una combinación de reglas en .htaccess y un script en PHP. Con esta solución, solo los usuarios autenticados con roles específicos podrán acceder a los archivos protegidos.
Controlar el acceso a los archivos subidos a WordPress aporta varias ventajas clave:
Impide que usuarios no autorizados accedan a documentos privados, evitando la filtración de información sensible.
Si vendes contenido digital (ebooks, cursos, imágenes, plantillas), restringir la descarga evita que los usuarios compartan los enlaces y distribuyan el contenido sin autorización.
Al limitar el acceso a archivos mediante una solución basada en código, evitas sobrecargar el servidor con plugins adicionales que pueden afectar la velocidad de carga del sitio.
Puedes definir qué roles de usuario tienen acceso a los archivos protegidos, asegurando que solo los administradores, editores o suscriptores premium puedan descargarlos.
Este método se basa en dos pasos clave:
De esta forma, cualquier intento de acceder a un archivo protegido sin iniciar sesión o sin los permisos adecuados será bloqueado.
El archivo .htaccess permite interceptar las solicitudes de archivos antes de que sean procesadas por WordPress. Para impedir la descarga directa, agrega este código al archivo .htaccess en la raíz de tu sitio web:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # Bloquear acceso directo a archivos protegidos y redirigirlos a index.php RewriteRule ^wp-content/uploads/.*protegido_.*\.(pdf|zip|docx|jpg|png)$ index.php [L] </IfModule>
Para gestionar quién puede descargar los archivos protegidos, añade el siguiente código a functions.php de tu tema hijo o en un plugin de snippets como WPCode:
add_action( 'init', 'restringir_acceso_a_archivos' );
function restringir_acceso_a_archivos(): void {
$request_uri = $_SERVER['REQUEST_URI'];
// Verificar si el archivo solicitado es un archivo protegido
if ( preg_match( '#/wp-content/uploads/\d{4}/\d{2}/protegido_.*\.(pdf|zip|docx|jpg|png)$#i', $request_uri ) ) {
// Redirigir a la página de inicio de sesión si el usuario no está autenticado
if ( ! is_user_logged_in() ) {
wp_redirect( home_url( '/wp-login.php?redirect_to=' . urlencode( $request_uri ) ) );
exit;
}
// Obtener los roles del usuario actual
$current_user = wp_get_current_user();
$roles_permitidos = array( 'administrator', 'editor' );
// Bloquear la descarga si el usuario no tiene los permisos adecuados
if ( ! array_intersect( $roles_permitidos, $current_user->roles ) ) {
wp_die( 'No tienes permisos para acceder a este archivo.', 'Acceso denegado', array( 'response' => 403 ) );
}
// Obtener la ruta real del archivo
$file_path = ABSPATH . parse_url( $request_uri, PHP_URL_PATH );
// Si el archivo existe, permitir la descarga
if ( file_exists( $file_path ) ) {
header( 'Content-Type: application/octet-stream' );
header( 'Content-Disposition: attachment; filename="' . basename( $file_path ) . '"' );
header( 'Expires: 0' );
header( 'Content-Length: ' . filesize( $file_path ) );
readfile( $file_path );
exit;
} else {
wp_die( 'El archivo solicitado no existe.', 'Archivo no encontrado', array( 'response' => 404 ) );
}
}
}
Este método ofrece una solución efectiva y ligera para restringir la descarga directa de archivos en WordPress.
✔ Mayor seguridad: Evita que usuarios no autenticados descarguen archivos privados.
✔ Control total de acceso: Define qué roles de usuario pueden acceder a los archivos protegidos.
✔ Sin impacto en el rendimiento: No requiere plugins adicionales, lo que mejora la velocidad del sitio.
Si administras una web con contenido exclusivo o manejas información sensible, implementar este sistema te permitirá tener un mayor control sobre quién accede a tus archivos.
Con esta configuración, solo los usuarios con los permisos adecuados podrán descargar los documentos protegidos, garantizando un entorno más seguro para tu contenido en WordPress.
