Skip Content

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=local en producción.
  • APP_DEBUG=true en producción.
  • Configuración débil de cookies/sesión.
  • Horizon, Telescope, rutas de debug o storage expuestos.
  • 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=production
APP_DEBUG=false
 
# Cookies / session
SESSION_SECURE_COOKIE=true
SESSION_HTTP_ONLY=true
SESSION_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.com
CORS_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=stack
LOG_LEVEL=warning

Referencias