A02: Configuración de Seguridad Incorrecta
¿Qué es la configuración de seguridad incorrecta?
La mala configuración de seguridad ocurre cuando una aplicación se despliega con ajustes inseguros o con herramientas internas expuestas. En Laravel esto suele ser: debug habilitado, cookies/sesiones sin endurecer, paneles de desarrollo accesibles públicamente, o CORS / trusted proxies / dominios stateful de Sanctum configurados de forma demasiado permisiva.
Fallo típico en Laravel
APP_ENV=localen producción.APP_DEBUG=trueen producción.- Configuración débil de cookies/sesión.
- Horizon, Telescope, rutas de debug o
storageexpuestos. - Mala configuración de CORS / trusted proxy / stateful domains.
- Defaults sin revisar.
Impacto
- Divulgación de información sensible (páginas de debug, stack traces, filtración de entorno).
- Acceso no autorizado a tooling interno (Horizon/Telescope) y datos operativos.
- Riesgo de compromiso de sesión (flags de cookies débiles, falta de cookies solo-HTTPS).
- Problemas de autenticación cross-origin por CORS/Sanctum mal configurados.
- Superficie de ataque ampliada: bugs pequeños escalan a compromiso total.
Remediación en Laravel 12
En producción: APP_ENV=production y APP_DEBUG=false.
- Revisar
config/session.php,config/cors.php,config/sanctum.php,config/logging.php. - Bloquear herramientas admin/dev por entorno y autorización.
- Endurecer cookies:
secure,http_only,same_site, solo-HTTPS. - Definir dominios first-party exactos para Sanctum (
SANCTUM_STATEFUL_DOMAINS).
Laravel documenta canales de logging configurables y superficies de configuración relacionadas con seguridad, y Sanctum requiere una configuración explícita de dominios stateful para solicitudes first-party.
Arreglo concreto
Empieza en .env (baseline seguro para producción):
APP_ENV=productionAPP_DEBUG=false # Cookies / sessionSESSION_SECURE_COOKIE=trueSESSION_HTTP_ONLY=trueSESSION_SAME_SITE=lax # Sanctum (SPA / first-party)SANCTUM_STATEFUL_DOMAINS=app.ejemplo.com # CORS (limita a tus origenes reales)CORS_ALLOWED_ORIGINS=https://app.ejemplo.comCORS_SUPPORTS_CREDENTIALS=true
Luego endurece las superficies de configuración relevantes.
config/session.php
Flags de cookies seguras (sin depender de defaults):
// config/session.php 'secure' => env('SESSION_SECURE_COOKIE', env('APP_ENV') === 'production'),'http_only' => env('SESSION_HTTP_ONLY', true),'same_site' => env('SESSION_SAME_SITE', 'lax'),
config/cors.php
Restringe CORS a los orígenes reales del frontend. Si usas cookies con Sanctum, normalmente necesitas credenciales habilitadas.
// config/cors.php 'paths' => ['api/*', 'sanctum/csrf-cookie'],'allowed_origins' => ['https://app.ejemplo.com'],'supports_credentials' => true,
config/sanctum.php
Haz explícita la autenticación first-party por cookies (evita patrones amplios o dominios "*"):
// config/sanctum.php 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'app.ejemplo.com')),
config/logging.php
Mantén el logging configurable, pero evita filtrar secretos y evita niveles de debug en producción.
// config/logging.php 'default' => env('LOG_CHANNEL', 'stack'),
LOG_CHANNEL=stackLOG_LEVEL=warning