# Seguridad y límites de operación

El acceso del instructor mediante expediente y RFC sin homoclave se conserva por decisión del proyecto. El RFC sigue siendo una credencial predecible; los controles siguientes reducen otros riesgos y no sustituyen una contraseña privada.

## Acceso y sesiones

- Login: diez intentos por usuario cada quince minutos y doscientos por dirección de origen. Un acceso correcto reinicia el contador del usuario. Los errores de acceso no distinguen entre usuario inexistente y contraseña incorrecta.
- El proxy debe descartar `X-Forwarded-For` recibido del cliente y añadir la dirección real. Next.js debe escuchar solamente en localhost. Sin un proxy confiable los accesos comparten el límite de origen.
- Cada sesión tiene un registro privado en `.data/security/sessions`, válido durante ocho horas. Cerrar sesión revoca ese registro. El servidor también verifica que la cuenta y su huella de credencial y estado sigan coincidiendo con SICCAP. Cambiar esos campos invalida las sesiones existentes; no se redefine el significado de los estados de SICCAP.
- Las sesiones creadas antes de estos controles requieren iniciar sesión nuevamente. Conserva `AUTH_SECRET` estable y protege `.data`; no publiques esos directorios como archivos estáticos.

## Videos y evaluaciones

La duración para calcular avances y evaluaciones vinculadas proviene del video registrado por el instructor. Una duración faltante o inválida impide guardar avances hasta corregirla. El servidor admite como máximo el avance correspondiente al doble del tiempo transcurrido entre guardados, con una ventana de treinta segundos y sin bonificación por solicitud. El reproductor inicia el registro al reproducir, guarda localmente cada tres segundos y en servidor cada treinta, además de las pausas y el final. Esto limita avances artificiales; no demuestra que una persona haya prestado atención al video.

Las evaluaciones tienen tres intentos por alumno y versión del contenido, con sesenta segundos de espera entre intentos. Se conservan los contadores en el progreso de la inscripción, incluso al cambiar de sesión o reiniciar el servidor. Retomar el intento vigente no consume otro. Una modificación de las preguntas o reglas de evaluación inicia un presupuesto para esa versión. Los límites se configuran con `ASSESSMENT_MAX_ATTEMPTS` (máximo veinte) y `ASSESSMENT_RETRY_SECONDS` (máximo 3600). Al agotar los intentos, el alumno debe contactar al instructor; no existe un restablecimiento automático.

Las entregas calificadas no admiten una segunda calificación ni sustitución de archivo, también al llamar directamente a las rutas o acciones del servidor.

## Archivos y publicaciones

Las cargas requieren autorización sobre el aula, comprobación de origen, extensión permitida y firma del contenido. Los documentos de texto se revisan como UTF-8. La firma no equivale a un análisis antivirus ni descarta macros o contenido malicioso dentro de documentos y ZIP; ese análisis requiere un servicio adicional.

| Control                                         | Valor predeterminado                               |
| ----------------------------------------------- | -------------------------------------------------- |
| Video del instructor                            | 512 MiB por archivo                                |
| Documento del instructor                        | 30 MiB por archivo                                 |
| Entrega del alumno                              | 15 MiB por archivo, 16 MiB por solicitud multipart |
| Almacenamiento de aulas (`UPLOAD_STORAGE_MB`)   | 51 200 MiB en total                                |
| Almacenamiento de cada aula (`AULA_STORAGE_MB`) | 10 240 MiB                                         |
| Entregas por inscripción (`STUDENT_STORAGE_MB`) | 250 MiB                                            |
| Tiempo de carga (`UPLOAD_TIMEOUT_SECONDS`)      | 600 segundos                                       |
| Cargas simultáneas                              | Diez globales, dos por usuario                     |
| Cargas por diez minutos                         | Diez por alumno, veinte por instructor             |

Las cuotas cuentan lo que existe en disco y reservan espacio para cargas activas. Una sustitución necesita espacio temporal para ambos archivos; el anterior se elimina después de confirmar la nueva entrega. Los archivos rechazados se eliminan. Un apagado abrupto puede dejar archivos incompletos que también cuentan contra la cuota; su limpieza requiere revisión operativa. Reserva espacio adicional para el sistema, respaldos y la base de datos.

El foro admite treinta publicaciones por usuario cada diez minutos, mil temas por aula, doscientas respuestas por tema y un archivo de hasta diez MiB. También se limitan las solicitudes de avance, respuestas de evaluación y calificación.

## Un solo proceso

Esta configuración está diseñada para un único proceso de Next.js en el VPS. Los límites de frecuencia y las reservas de carga residen en memoria y se reinician con el proceso; los contadores de evaluación y las revocaciones de sesión son persistentes. Antes de usar varios workers o servidores deben centralizarse los límites, reservas y registros de sesiones, además de la persistencia del foro y las notificaciones.

No se ejecutaron ataques contra cuentas reales ni pruebas de penetración. La revisión de tipos, lint y compilación comprueba la integración del código, no certifica que el sistema esté libre de vulnerabilidades.
