Ir al contenido
angel.library

Seguridad web: fundamentos y terminología

La seguridad consiste en reducir riesgos a un nivel aceptable, no en prometer que un sistema es imposible de atacar. Una aplicación segura identifica qué protege, quién podría atacarla, cómo lo intentaría y qué controles disminuyen la probabilidad o el impacto.

Para aprender, sigue: activos y confianza → modelo de amenazas → entradas/ataques web → identidad y permisos → APIs y SSRF → headers/CSP → secretos/dependencias → disponibilidad → pruebas e incidentes. Practica siempre en sistemas propios o laboratorios autorizados.

RiesgoDocumento
no sé qué proteger primeroModelo de amenazas
XSS, CSRF, SQLi o subida maliciosaAtaques web comunes
BOLA, abuso de consumo o SSRFSeguridad de APIs
sesiones, roles y ownershipControl de acceso
scripts, iframes y MIMEHeaders y CSP
DDoS y caída de dependenciasDisponibilidad
paquetes o credenciales filtradasCadena de suministro
integrar seguridad al desarrolloSDLC seguro
ya ocurrió un incidenteRespuesta

Una lista sirve para recordar controles; aprender seguridad exige seguir el flujo de datos y demostrar dónde cambia la confianza. “Validado en frontend” nunca es una frontera de seguridad.

Estos términos describen cosas distintas:

TérminoSignificadoEjemplo
ActivoAlgo valioso que debe protegerseSesiones, datos personales, disponibilidad
AmenazaActor o evento capaz de causar dañoUn atacante automatizado o un error interno
VulnerabilidadDebilidad explotableConsulta SQL construida con texto sin validar
ImpactoDaño posibleRobo de cuentas o caída del servicio
RiesgoCombinación de probabilidad e impactoExposición de datos por una ruta sin autorización
ControlMedida que reduce el riesgoConsulta parametrizada y prueba de permisos

Una superficie de ataque es el conjunto de puntos que aceptan interacción: rutas HTTP, formularios, archivos, dependencias, paneles, webhooks y credenciales. Reducir capacidades expuestas suele ser más efectivo que intentar proteger funciones que nadie necesita.

Confidencialidad, integridad y disponibilidad

Sección titulada «Confidencialidad, integridad y disponibilidad»

La tríada CIA usa iniciales en inglés:

  • Confidentiality, confidencialidad: solo acceden quienes tienen permiso.
  • Integrity, integridad: la información no cambia de forma no autorizada.
  • Availability, disponibilidad: el servicio permanece utilizable.

El cifrado protege confidencialidad, pero no resuelve por sí solo autorización ni disponibilidad. Una firma o un código de autenticación puede ayudar a verificar integridad.

La autenticación responde “¿quién eres?”. La autorización responde “¿puedes realizar esta acción sobre este recurso?”. Una sesión válida no autoriza automáticamente a leer cualquier cuenta.

const session = await requireSession(request);
const invoice = await invoices.findById(params.id);
if (!invoice || invoice.ownerId !== session.userId) {
return new Response('No encontrado', { status: 404 });
}

La comprobación se hace sobre el objeto concreto en el servidor. Ocultar el botón en la interfaz mejora experiencia, pero no protege la ruta.

El principio de mínimo privilegio concede solo permisos necesarios, durante el tiempo necesario. Una clave de lectura no debería poder borrar tablas; un proceso público no necesita credenciales administrativas.

Validación, codificación y parametrización

Sección titulada «Validación, codificación y parametrización»

Validar comprueba que un dato cumple el formato y las reglas esperadas. Codificar la salida representa caracteres de forma segura para el contexto en que se insertan. Parametrizar separa datos de una instrucción, como una consulta SQL.

// El valor viaja como dato; no se concatena en la instrucción SQL.
const result = await db.query("SELECT id, email FROM users WHERE email = $1", [
email
])

No existe una función universal de “sanitización”. HTML, URL, SQL, CSS y comandos del sistema tienen reglas diferentes. La protección se aplica al contexto de destino.

SiglaNombreQué ocurreDefensa principal
XSSCross-Site ScriptingContenido no confiable se ejecuta como scriptEscape contextual, APIs seguras y CSP
CSRFCross-Site Request ForgeryUn sitio induce al navegador autenticado a enviar una acciónSameSite, token CSRF y verificación de origen
SSRFServer-Side Request ForgeryEl servidor solicita una URL elegida por un atacanteLista permitida, validación y aislamiento de red
SQLiInyección SQLDatos alteran la estructura de una consultaConsultas parametrizadas
IDORInsecure Direct Object ReferenceSe accede a otro objeto cambiando su identificadorAutorización por recurso
DDoSDistributed Denial of ServiceMuchas fuentes agotan capacidadCDN, límites, caché y degradación controlada

Una CSP (Content Security Policy o política de seguridad de contenido) restringe desde qué orígenes puede cargarse o ejecutarse contenido. Reduce impacto de ciertos XSS, pero no reemplaza el escape ni la eliminación de inyecciones.

CORS (Cross-Origin Resource Sharing) indica qué orígenes pueden leer una respuesta desde el navegador. No es un mecanismo general de autenticación: otros servidores no están obligados por CORS.

Un hash produce una huella de longitud fija y no está diseñado para revertirse. El cifrado transforma datos usando una clave y sí debe poder revertirse con la clave apropiada. Base64 es solo una codificación; cualquiera puede decodificarla.

Las contraseñas se almacenan con funciones especializadas y lentas para contraseñas, con una sal aleatoria. No se guardan cifradas para poder recuperarlas ni se procesan con un hash rápido genérico.

La defensa en profundidad combina controles independientes. Si uno falla, otro limita el daño:

CDN y limitación de tráfico
→ autenticación
→ autorización por recurso
→ validación y consultas parametrizadas
→ permisos mínimos de base de datos
→ registros, alertas y recuperación

También se necesita segmentación: separar entornos, redes, cuentas y secretos para que una credencial comprometida no otorgue acceso a todo.

Un secreto es una credencial que permite actuar: clave de API, contraseña, token o clave privada. No debe vivir en Git, en registros, en mensajes de error ni en el paquete del navegador.

La cadena de suministro incluye dependencias, registros de paquetes, acciones de CI, imágenes y herramientas de construcción. Un paquete pequeño puede ejecutar código durante la instalación. Se fijan versiones, revisan cambios, reducen dependencias y limitan permisos del proceso de construcción.

Prevenir todo incidente es imposible. La aplicación necesita detectar comportamientos anómalos y conservar evidencia útil sin registrar contraseñas, tokens ni datos personales innecesarios.

Un plan de respuesta define responsables, canales, aislamiento, rotación de credenciales, comunicación, recuperación y análisis posterior. MTTD significa Mean Time to Detect o tiempo medio para detectar; MTTR puede significar tiempo medio para responder o recuperar, por lo que el equipo debe definir cuál usa.

  1. ¿Qué activos procesa y cuál sería el peor impacto?
  2. ¿Qué entradas son controladas por usuarios o sistemas externos?
  3. ¿Dónde se autentica y dónde se autoriza cada recurso?
  4. ¿Qué puede hacer la credencial si se filtra?
  5. ¿Qué límites evitan abuso de costo, CPU, memoria o solicitudes?
  6. ¿Qué se registra y cómo se detecta un comportamiento extraño?
  7. ¿Cómo se revierte, restaura y comunica un incidente?

La seguridad debe formar parte del diseño, las pruebas y la operación. Agregar encabezados al final no corrige una autorización inexistente.