# Nexora Security & Audit V2

## Objetivo

Convertir `Tools -> Security & Audit` en un centro de readiness real. La vista anterior trataba como `Pendiente` tanto fallos de seguridad como decisiones arquitectónicas opcionales. V2 separa:

- **Controles esenciales**: deben estar operativos para una build cerrada.
- **Compatibilidad**: situaciones heredadas que requieren validación del GameServer antes de modificarse.
- **Arquitectura opcional**: Nexora Platform no se activa automáticamente.

## Controles esenciales

### CSRF
Se valida configuración + token de sesión en runtime.

### Security headers
Se valida que la capa esté activa y que PHP haya preparado los encabezados esperados.

### Proxy headers
El estado seguro por defecto es **ignorar headers de proxy**. Solo se aceptan `CF-Connecting-IP`, `X-Forwarded-For`, `X-Real-IP` y `X-Forwarded-Proto` cuando `REMOTE_ADDR` pertenece a una allowlist explícita. Se admiten CIDR IPv4 e IPv6.

### Firma de pagos
Cuando Donations + PayPal están activos, `NEXORA_PAYMENT_SIGNING_KEY` es obligatorio. AdminCP puede generar una clave aleatoria de 32 bytes y guardarla en:

`includes/config/nexora.secrets.php`

El valor no se muestra. La pantalla muestra únicamente fuente y huella SHA-256 abreviada.

### Cron
Si `cron_api=true`, la API pública necesita una clave fuerte. Cuando el cron local tiene actividad reciente en Legado y Seasonal, AdminCP permite **cerrar la API pública** sin detener el cron local. Si se necesita integración externa, puede generarse una key; se muestra una sola vez para copiarla al scheduler.

### Audit log
El audit local se muestra directamente desde `includes/logs/admin_audit.log` si Platform no está activo. Platform deja de ser un requisito para consultar eventos desde la pantalla.

## Compatibilidad

### Password mode GameServer
`SQL_PASSWORD_ENCRYPTION=none` aparece como **Legacy compatible**, no como un error rojo. No debe cambiarse hasta confirmar qué esquema soporta el GameServer.

### Trigger Legado -> Seasonal
Cuando `TR_Copy_WebAccount_To_muonlinetemp` continúa activo se muestra como puente de compatibilidad. El alta PHP compartida sigue siendo transaccional y tolera el trigger. Después de Account Reconciliation puede deshabilitarse mediante:

`sql/002_disable_legacy_account_sync_trigger.sql`

## Nexora Platform

Platform es opcional para el readiness de seguridad. La pantalla diferencia:

- `Opcional - no instalada`
- `Preparada - apagada`
- `Activa`
- `Activada incompleta`

Nunca se activa automáticamente. Para migrar:

1. Backup.
2. Ejecutar `sql/001_nexora_platform.sql`.
3. Ejecutar `sql/004_platform_validation.sql`.
4. Revisar resultados.
5. Solo entonces habilitar `NEXORA_PLATFORM_ENABLED`.

## IP de PayPal

El módulo de PayPal ya no confía directamente en headers controlables por el cliente. Usa `NexoraSecurity::clientIp()`, cuya IP proviene de `REMOTE_ADDR` o de un proxy previamente validado por allowlist.

## Secretos gestionados

El archivo gestionado se encuentra bajo `includes/`, que ya está bloqueado por `.htaccess`. Se escribe de forma atómica y se intenta aplicar modo `0600`.

También existe una alternativa CLI:

```bash
php tools/nexora_security_bootstrap.php
```

El comando genera claves faltantes y solo imprime sus huellas, nunca los valores.
