En este blog describimos algunos errores de seguridad fáciles y cómo solucionarlos.
Contenido ocultar
1. No usar HTTPS
- ErrorServir su aplicación Laravel a través de HTTP en lugar de HTTPS la deja vulnerable a ataques de tipo "man-in-the-middle" (MITM) donde se pueden interceptar datos confidenciales.
- Solución: Utilice siempre HTTPS en entornos de producción configurando certificados SSL y forzando HTTPS agregando esto a ($this->app->environment('production')) { \URL::forceScheme('https'); }
2. Uso de claves de cifrado débiles
- Error:No lograr establecer un sólido
CLAVE DE APLICACIÓN
en el.env
archivo, que es crucial para el cifrado, la seguridad de la sesión y el hash de contraseñas. - Solución:Establezca una clave de aplicación segura utilizando el siguiente comando:bash
clave php artisan:generar
Asegúrese de que esta clave permanezca secreta y nunca se comparta públicamente.
3. No validar los datos de entrada
- Error:Omitir la validación de entrada puede exponer su aplicación a diversos ataques, como inyección SQL, secuencias de comandos entre sitios (XSS) y otras vulnerabilidades.
- Solución:Utilice la validación incorporada de Laravel para garantizar que todos los datos de entrada estén desinfectados y sigan el formato esperado.php
$request->validate([ 'email' => 'requerido|email', 'contraseña' => 'requerido|min:8', ]);
4. Almacenamiento de datos confidenciales en el código base
- Error:Codificar datos confidenciales, como claves API, credenciales de bases de datos o tokens privados, directamente en el código base puede provocar violaciones de seguridad si el código se comparte o se expone.
- Solución: Almacenar información confidencial en variables de entorno (
.env
) y use el sistema de configuración de Laravel para cargarlos. Nunca envíe los.env
archivo a control de versiones.
5. Permisos de archivos inadecuados
- Error:Permitir permisos de escritura en archivos confidenciales, como el
.env
archivo, puede provocar que usuarios no autorizados obtengan acceso a los datos de configuración. - Solución:Establezca los permisos de archivo adecuados para su proyecto de Laravel. Por lo general, querrá directorios como
almacenamiento
yarranque/caché
para que el servidor web pueda escribir en ellos, pero otros archivos no deben poder escribirse.
6. No escapar del contenido generado por el usuario
- Error:No escapar los datos generados por el usuario antes de representarlos en la página puede provocar ataques XSS.
- Solución:Utilice el motor de plantillas integrado de Laravel, Blade, que escapa automáticamente la salida. Si necesita deshabilitar el escape (lo cual es poco frecuente), asegúrese de que el contenido esté correctamente depurado.
{{ $userInput }} // Escapado
{!! $userInput !!} // Sin escape (tenga cuidado)
7. No limitar la asignación masiva
- Error:Permitir la asignación masiva de modelos sin controlar adecuadamente qué campos se pueden completar puede permitir que los atacantes modifiquen campos no deseados.
- Solución:Utilice el
$rellenable
o$protegido
Propiedades en sus modelos Eloquent para especificar qué campos se pueden asignar en masa.phpprotegido $fillable = ['nombre', 'correo electrónico'];
8. Exponer el modo de depuración en producción
- Error: Partida
APP_DEBUG=verdadero
en el.env
Los archivos en entornos de producción pueden exponer información confidencial, como seguimientos de pila, credenciales de base de datos y claves API, en mensajes de error. - Solución:Siempre configurado
APP_DEBUG=falso
en producción y considere usar el registro de errores para capturar y almacenar errores de forma segura sin revelarlos públicamente.
9. Manejo inseguro de carga de archivos
- Error:No validar y desinfectar adecuadamente los archivos cargados puede generar cargas de archivos maliciosas, que pueden ejecutar código del lado del servidor.
- Solución:Utilice las reglas de validación de carga de archivos de Laravel para verificar el tipo, tamaño y otros atributos de los archivos cargados.php
$request->validate([ 'archivo' => 'requerido|archivo|mimes:jpg,png,pdf|máximo:2048', ]);
Almacene los archivos fuera del directorio público y utilice métodos seguros para acceder a ellos.
10. No implementar la limitación de velocidad
- Error:No implementar la limitación de velocidad en rutas sensibles como el inicio de sesión o los puntos finales de API puede exponer su aplicación a ataques de fuerza bruta o ataques de denegación de servicio (DoS).
- Solución:Utilice el middleware de limitación de velocidad integrado de Laravel para proteger sus rutas.php
Ruta::middleware('throttle:10,1')->grupo(función () { Ruta::post('/login', 'AuthController@login'); });
11. Exposición innecesaria de puntos finales sensibles
- Error:Dejando rutas sensibles como
/telescopio
,/horizonte
, o/administración
accesible al público puede exponer valiosas herramientas de depuración o administrativas. - Solución: Proteja estas rutas restringiendo el acceso a través de middleware o listas blancas de IP. Por ejemplo, limite el acceso a Laravel Telescope a entornos locales:php
si (app()->environment('local')) { Telescopio::auth(función () { devolver verdadero; }); }
12. Laravel obsoleto y dependencias
- Error:Ejecutar versiones obsoletas de Laravel o sus dependencias puede dejar vulnerabilidades conocidas sin parchear.
- Solución:Actualice periódicamente Laravel y sus dependencias ejecutando
actualización del compositor
y supervisar los avisos de seguridad de los paquetes que utiliza.
13. No utilizar la protección CSRF
- Error:No implementar la protección contra falsificación de solicitudes entre sitios (CSRF) puede permitir que los atacantes engañen a los usuarios para que realicen acciones en su nombre.
- Solución:Laravel incluye protección CSRF de forma predeterminada para todas las solicitudes POST, PUT, PATCH y DELETE que utilizan el
@csrf
directiva en forms.blade@csrf
14. No utilizar hash de contraseña seguro
- Error:Almacenar contraseñas en texto simple o usar algoritmos hash débiles hace que su aplicación sea vulnerable si la base de datos se ve comprometida.
- Solución:Utilice siempre Laravel
cifrado
(oargón2
(para mayor seguridad) para hacer hashes de contraseñas:phputilice Illuminate\Support\Fachadas\Hash; $hashedPassword = Hash::make($password);
15. Ignorar registros y alertas
- Error:No supervisar los registros de aplicaciones para detectar actividades sospechosas o errores puede provocar que se pasen por alto incidentes de seguridad.
- Solución:Revise periódicamente los registros de Laravel (
almacenamiento/registros
) y configurar alertas para eventos críticos. Puedes integrar Laravel con herramientas de monitoreo de terceros como Sentry o New Relic para monitoreo en tiempo real.
16. Actualización con $request->all()
Un poco similar al punto 7.
Aunque parezca realmente conveniente, cuando actualizas un usuario así:
$user->update($request->all());
Existe un riesgo de seguridad. Por ejemplo, si tiene una columna this_is_an_admin=1, un usuario puede configurar esta variable a través de la consola de desarrollador del navegador.
Sería mejor filtrar únicamente la variable $request correcta con:
$request->only(['nombre', 'boletín_suscrito']);
¿Tienes otros puntos de seguridad? ¡Cuéntanoslos en los comentarios!