Laravel es una popular plataforma de desarrollo conocida por su rendimiento y su activa comunidad de usuarios. Fuera de la caja, Laravel es bastante seguro; sin embargo, ningún framework puede afirmar que es 100% seguro.
Aunque el equipo de mantenimiento de Laravel aborda rápidamente cualquier laguna descubierta, como desarrollador, también debes dar prioridad a centrarte en los aspectos de seguridad de tu aplicación Laravel 10.0.
En este artículo, he intentado cubrir las principales lagunas de seguridad de Laravel a las que puede enfrentarse un desarrollador de Laravel y cómo solucionarlas.
Para que comprendas de forma práctica los conceptos tratados en este artículo, he empleado un sistema de gestión basado en el framework Laravel.
Experimenta el alojamiento Laravel sin fisuras con Cloudways
Empieza con 1 clic, sumérgete en nuestras funciones de fácil desarrollo y disfruta de una pila optimizada para una codificación fluida.
Características de seguridad de Laravel
Laravel ofrece las siguientes características de seguridad para permitir a los desarrolladores reducir las vulnerabilidades de Laravel en la aplicación:
- Sistema de autenticación de Laravel(Lee más sobre: Autenticación de usuarios en Laravel)
- Reducir las vulnerabilidades de Laravel por CSRF (Cross-Site Request Forgery)
- Protección contra XSS (Cross-Site Scripting)
- Inyección SQL
1. Sistema de autenticación Laravel
El hackeo de Laravel es un problema común que puede causar más vulnerabilidades a otros soportando XSS y diferentes archivos. La mayoría de las víctimas de hackeos de sitios web descubren que las páginas de su sitio son desviadas a otros sitios web maliciosos.
Laravel ya dispone de un sólido proceso de autenticación de usuarios con el código asociado disponible en el andamiaje.
Laravel utiliza «proveedores» y «guardianes» para facilitar el proceso de autenticación. Los guardianes autentican a los usuarios en cada solicitud que realizan, mientras que los proveedores facilitan la recuperación de usuarios de la base de datos.
Como desarrollador, todo lo que tienes que hacer es configurar la base de datos, los controladores y los modelos. Durante el proceso, las funciones de autenticación se incorporan a la aplicación.
Leer más sobre: Autenticación de Usuarios en Laravel
2. Reducir las vulnerabilidades de Laravel por CSRF (Cross-Site Request Forgery)
Laravel emplea tokens CSRF para evitar que terceros externos generen solicitudes falsas, mitigando las posibles vulnerabilidades de seguridad dentro del framework Laravel. Además, para garantizar un acceso seguro, debes utilizar una VPN gratuita cuando pruebes tu aplicación Laravel en redes públicas.
Para ello, Laravel crea e integra un token válido en cada petición que llega en forma de llamada AJAX.
Cuando se invoca la petición, Laravel compara el token de la petición con el guardado en la sesión del usuario. Si el token no coincide, la solicitud se clasifica como no válida, y no se ejecuta ninguna otra acción.
Si estás creando manualmente formularios en HTML estándar utilizando plantillas Blade (no es una opción recomendada), debes pasar el token CSRF allí, como se muestra a continuación:
<form name="prueba">
{!! csrf_field() !!}
<!-- Otras aportaciones pueden venir aquí-->
</form>
Leer más sobre: Activar la protección CSRF de Laravel
3. Protección contra XSS (Cross-Site Scripting)
En los ataques XSS, los atacantes inyectan JavaScript, a menudo en las áreas de texto de los formularios de un sitio web. Cuando nuevos visitantes acceden a la página o formulario afectado, el script inyectado se ejecuta, causando impactos maliciosos.
Para que entiendas mejor lo que quiero decir:
Considera un escenario en el que una plataforma de blogs permite a los usuarios publicar comentarios en las entradas de un blog. Hipotéticamente hablando, un usuario con intenciones maliciosas introduce el siguiente código JavaScript en los comentarios:
<guión>alert("Has sido pirateado")</script>
Sin una protección XSS adecuada, las vulnerabilidades de Laravel aumentan, con el JavaScript ejecutándose en cada recarga de la página. Esto puede dar lugar a posibles brechas de seguridad, comprometiendo los datos de los usuarios y la integridad general de la aplicación.
Aunque el código de ejemplo no es malicioso en sí mismo, es el ejemplo perfecto que demuestra todo el alcance de este ataque.
Laravel ofrece soporte nativo que protege el código de ataques XSS. La función se activa automáticamente y protege la base de datos en el proceso. Como resultado, cualquier código que contenga etiquetas de escape se muestra como HTML, como se muestra a continuación:
<guión>alert("Has sido pirateado")</script>
Leer más sobre: Laravel Validación y Sanitización de Entradas de Usuario para Prevenir Exploits XSS
Evita los ataques de inyección SQL con el complemento Cloudways Cloudflare Enterprise
Automatiza la seguridad de los sitios web con el cortafuegos de aplicaciones web y la mitigación de DDoS gestionados por Cloudflares en las capas 3, 4 y 7.
4. Inyección SQL
El ORM Eloquent de Laravel utiliza el enlace PDO que protege de las inyecciones SQL. Esta característica garantiza que ningún cliente pueda modificar la intención de las consultas SQL.
Considera el ejemplo del formulario utilizado para recoger las direcciones de correo electrónico de los usuarios de una base de datos. El formulario buscará una dirección de correo electrónico, por ejemplo, «[email protected]». Imagina ahora que la consulta SQL se modifica a
SELECCIONA * FROM usuarios WHERE email = '[email protected]' o 1=1
En el ejemplo anterior, 1=1 es una expresión lógica simple que siempre se evalúa como verdadera. Si se adjunta a la consulta anterior con la condición OR, la consulta obtendrá todos los registros de la tabla porque la condición SELECT evolucionará hasta ser verdadera.
Considera ahora otra improvisación del ataque en la que la consulta se modifica directamente al comando «drop table users», y en lugar de la dirección de correo electrónico se escribe«[email protected]». La consulta tendrá el aspecto siguiente
SELECT * FROM usuarios WHERE correo electrónico = '[email protected]'; drop tabla usuarios;
Cuando se ejecute esta consulta, la tabla «usuarios» se eliminará de la base de datos.
Cuando la vinculación de parámetros PDO está en su lugar, la entrada está entre comillas, y la consulta tendrá el aspecto siguiente:
SELECT * FROM usuarios WHERE email = '[email protected] or 1=1'
Como ningún registro coincidirá ni con el correo electrónico ni con el «1=1», la consulta no devolverá nada.
Laravel ofrece varios métodos para interactuar con bases de datos, incluido el uso de consultas SQL sin procesar. Sin embargo, Eloquent sigue siendo la opción más popular. Aprende a utilizar el ORM porque ayuda a prevenir ataques de inyección SQL causados por consultas SQL maliciosas.
Leer más sobre: Proteger un Sitio Web PHP de los Ataques de Inyección SQL
Buenas prácticas de seguridad en Laravel
Gracias a la seguridad de Laravel el framework ya es mucho más seguro que otros frameworks PHP. Sin embargo, hay varias cosas que puedes hacer para que tu código Laravel sea más seguro.
Poner en práctica algunas medidas puede ayudar a salvaguardar tu aplicación de posibles ataques al código, mejorando significativamente su seguridad general.
Ahora que ya hemos visto una visión general de las características de seguridad de Laravel, vamos a ver algunas buenas prácticas para que tu aplicación Larvel sea más segura.
1. Prevenir la Inyección SQL Evitando las Consultas Crudas
Laravel utiliza el enlace PDO para evitar ataques de inyección SQL, ya que ninguna variable se pasa a la base de datos sin validación. Sin embargo, los desarrolladores siguen optando por SQL sin formato por varias razones.
Si éste es tu caso, debes utilizar siempre consultas SQL bien preparadas para evitar contratiempos. Considera la siguiente sentencia que parece madura para una inyección SQL:
Route::get('esto-es-propenso-a-la-inyeccion-sql', function() {
$nombre = "'Inshal' OR 1=1";
devolver DB::select(
DB::raw("SELECT * FROM usuarios WHERE nombre = $nombre"));
});
En este caso, la sentencia 1=1 utilizada en la condición OR devolverá todas las filas de la tabla de usuarios. Esto puede evitarse utilizando en su lugar el siguiente código:
Route::get('seguro-de-inyeccion-sql', function() {
$nombre = "'Inshal' OR 1=1";
devolver DB::select(
DB::raw("SELECT * FROM usuarios WHERE nombre = ?", [$nombre]));
});
Laravel sustituye los signos de interrogación por la variable de consulta, escapando automáticamente las variables de entrada. Esto protege el código de ataques de inyección SQL.
2. Forzar HTTPS si tu aplicación intercambia información sensible
Cuando despliegas tu sitio web en HTTP, todos los datos intercambiados, incluidas las contraseñas y otros, se envían en contenido plano. Esto podría ser fácilmente robado por cualquiera entre la transmisión. Así que para mantener esta información segura, despliega siempre tus aplicaciones web en HTTPS para salvaguardar su información sensible.
Puedes simplemente configurar un certificado SSL en tu sitio web con un poco de ayuda de cualquier desarrollador de Laravel, que cambiará tu aplicación de HTTP a HTTPS fácilmente. Para ocultar ciertas rutas, puedes utilizar el filtro definido a continuación, que redirigirá a los usuarios a una ruta segura.
Route::filter('https', function() {
if ( ! Request::secure())
devolver Redirect::secure(URI::current());
});
Leer más sobre: Configuración de Certificados SSL HTTPS en Laravel
3. Escapar contenido para evitar XSS
Para evitar ataques XSS, debes utilizar la sintaxis de doble llave en las plantillas de las hojas: < $variable >
¡¡Utiliza esta sintaxis {!! $variable !!} cuando estés seguro de que los datos de la variable son más seguros de mostrar.
4. Utiliza Laravel Purifier para mejorar tu seguridad
Las llaves dobles de Laravel garantizan que no se proporcione HTML sin procesar al cliente; sin embargo, si quieres proporcionar alguna variable HTML a tu cliente desde tu base de datos, puedes utilizar el Purificador de HTML, que es un instrumento que se mantiene todo el tiempo y que ordenará tu código y se ocupará de los códigos HTML omitidos o que falten.
También te puede interesar: Buenas prácticas de seguridad en PHP
Paquetes de seguridad Laravel
Laravel ofrece varios paquetes para mejorar la seguridad de sus aplicaciones. Aunque no puedo hablar de todos ellos, mencionaré los paquetes de Laravel más populares centrados en la seguridad:
- Componente deseguridad de Laravel: El componente de seguridad de Laravel asegura los roles y objetos integrando el núcleo de seguridad de Symfony en Laravel. Utilizando votantes, comprueba los privilegios basados en roles, mejorando la validación de la seguridad.
- Seguridad Laravel: Laravel security es uno de los paquetes más utilizados y es conocido por eliminar vulnerabilidades XSS en el código base.
- Laravel-ACL: Laravel-ACL proporciona permisos seguros basados en roles al proceso de autenticación de Laravel. El paquete ayuda a proteger las rutas y los métodos del controlador CRUD en las aplicaciones.
Conclusión
Aunque existen numerosas medidas para mejorar la seguridad de Laravel, el framework, por defecto, viene con sólidas características de seguridad incorporadas. Estas características, como la autenticación segura y el cifrado robusto, están desarrolladas correctamente para dar fe de todas las necesidades de seguridad de tu aplicación.
Q. ¿Es Laravel bueno para la seguridad?
Sí, Laravel ofrece sólidas funciones de seguridad como la protección CSRF, el cifrado, las contraseñas con hash y la desinfección de consultas para proteger las aplicaciones contra las vulnerabilidades más comunes.
Q. ¿Cómo hacer que Laravel sea seguro?
Puedes proteger Laravel manteniendo actualizadas las dependencias, utilizando HTTPS, validando las entradas de usuario, aplicando middleware para la autenticación y activando las funciones de seguridad integradas en Laravel, como los tokens CSRF y la limitación de velocidad.
Q. ¿Cuáles son las vulnerabilidades más comunes en Laravel?
Entre las vulnerabilidades más comunes se encuentran la inyección SQL, el cross-site scripting (XSS), la falsificación de petición cross-site (CSRF) y la carga insegura de archivos, que pueden mitigarse utilizando las herramientas de seguridad de Laravel.
Q. ¿Es Laravel más seguro que PHP?
Laravel se basa en PHP, pero es más seguro porque incluye funciones de seguridad preconfiguradas y sigue las mejores prácticas para la seguridad de las aplicaciones web.
Q. ¿Cuáles son las características de seguridad de Laravel?
Laravel incluye funciones de seguridad integradas, como contraseñas con hash, protección CSRF, prevención de inyecciones SQL, protección XSS, almacenamiento de datos cifrados y middleware para autenticación y limitación de velocidad.
Q. ¿Soporta Laravel la autenticación de dos factores?
Sí, Laravel admite la autenticación de dos factores (2FA) a través de sus paquetes Laravel Fortify y Laravel Breeze o de bibliotecas de terceros como Google Authenticator y Authy.
Inshal Ali
Inshal es Content Marketer en Cloudways. Con formación en informática, habilidad para los contenidos y mucha creatividad, ayuda a las empresas a alcanzar el cielo e ir más allá a través de contenidos que hablan el idioma de sus clientes. Aparte del trabajo, le verás sobre todo en algún juego en línea o en un campo de fútbol.