> For the complete documentation index, see [llms.txt](https://books.spartan-cybersec.com/cppj/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://books.spartan-cybersec.com/cppj/appweb-for-juniors/cabeceras-de-seguridad.md).

# Cabeceras de seguridad

Las **cabeceras de seguridad en HTTP** son directivas adicionales que se añaden a las respuestas HTTP de un servidor web para mejorar la seguridad de las aplicaciones web. Estas cabeceras pueden prevenir una variedad de ataques al configurar cómo los navegadores deben manejar las respuestas del servidor.

<figure><img src="https://3911471937-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fr4CI7X1asTaJa46607Pl%2Fuploads%2FMo4AWM1Ojovhq3yCDfHn%2Fimage.png?alt=media&amp;token=6dc7cd48-ae11-43be-b07f-9a8a68cad628" alt=""><figcaption></figcaption></figure>

## <mark style="color:green;">Principales Cabeceras de Seguridad</mark>

1. <mark style="color:green;">**Content-Security-Policy (CSP)**</mark>
   * **Descripción**: Controla qué recursos (scripts, estilos, imágenes, etc.) pueden ser cargados y ejecutados por el navegador. Previene ataques de inyección como XSS (Cross-Site Scripting).
   * **Ejemplo**:

     ```http
     Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted.cdn.com
     ```
2. <mark style="color:green;">**X-Content-Type-Options**</mark>
   * **Descripción**: Previene que los navegadores interpreten incorrectamente los tipos MIME, mitigando ataques de tipo MIME sniffing.
   * **Ejemplo**:

     ```http
     X-Content-Type-Options: nosniff
     ```
3. <mark style="color:green;">**Strict-Transport-Security (HSTS)**</mark>
   * **Descripción**: Fuerza a los navegadores a utilizar únicamente HTTPS para las conexiones futuras, previniendo ataques man-in-the-middle (MITM).
   * **Ejemplo**:

     ```http
     Strict-Transport-Security: max-age=31536000; includeSubDomains
     ```
4. <mark style="color:green;">**X-Frame-Options**</mark>
   * **Descripción**: Controla si un sitio puede ser incrustado en un iframe. Previene ataques de clickjacking.
   * **Ejemplo**:

     ```http
     X-Frame-Options: DENY
     ```
5. <mark style="color:green;">**X-XSS-Protection**</mark>
   * **Descripción**: Habilita la protección contra XSS en navegadores compatibles.
   * **Ejemplo**:

     ```http
     X-XSS-Protection: 1; mode=block
     ```
6. <mark style="color:green;">**Referrer-Policy**</mark>
   * **Descripción**: Controla la información de referencia que se envía junto con las solicitudes HTTP, protegiendo datos sensibles en las URLs.
   * **Ejemplo**:

     ```http
     Referrer-Policy: no-referrer
     ```
7. <mark style="color:green;">**Permissions-Policy**</mark>
   * **Descripción**: Regula qué características y APIs pueden ser utilizadas en el navegador, como geolocalización, cámara, micrófono, etc.
   * **Ejemplo**:

     ```http
     Permissions-Policy: geolocation=(), microphone=(), camera=()
     ```

## <mark style="color:green;">Riesgos por la Ausencia de Cabeceras de Seguridad</mark>

1. <mark style="color:green;">**Cross-Site Scripting (XSS)**</mark>
   * **Riesgo**: Sin `Content-Security-Policy`, los sitios son más vulnerables a inyecciones de scripts maliciosos que pueden robar datos sensibles o realizar acciones no autorizadas en nombre del usuario.
2. <mark style="color:green;">**MIME Sniffing**</mark>
   * **Riesgo**: Sin `X-Content-Type-Options`, los navegadores pueden interpretar incorrectamente los tipos de contenido, permitiendo la ejecución de scripts maliciosos.
3. <mark style="color:green;">**Clickjacking**</mark>
   * **Riesgo**: Sin `X-Frame-Options`, un atacante puede incrustar el sitio en un iframe en otro dominio y engañar a los usuarios para que realicen acciones no deseadas.
4. <mark style="color:green;">**Man-in-the-Middle (MITM)**</mark>
   * **Riesgo**: Sin `Strict-Transport-Security`, los usuarios pueden ser susceptibles a ataques MITM si son redirigidos a versiones HTTP inseguras del sitio.
5. <mark style="color:green;">**Exposición de Información Sensible**</mark>
   * **Riesgo**: Sin `Referrer-Policy`, los datos sensibles en las URLs pueden ser expuestos a sitios de terceros a través de la información de referencia.
6. **I**<mark style="color:green;">**nyecciones y Explotación de Vulnerabilidades**</mark>
   * **Riesgo**: Sin `X-XSS-Protection`, los navegadores pueden no bloquear ataques XSS conocidos, exponiendo a los usuarios a riesgos adicionales.

## <mark style="color:green;">Ejemplo de Configuración de Cabeceras de Seguridad en Nginx</mark>

Para configurar cabeceras de seguridad en un servidor web Nginx, puedes añadir las siguientes directivas al archivo de configuración del servidor:

```nginx
server {
    listen 80;
    server_name ejemplo.com;

    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted.cdn.com";
    add_header X-Content-Type-Options "nosniff";
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    add_header X-Frame-Options "DENY";
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy "no-referrer";
    add_header Permissions-Policy "geolocation=(), microphone=(), camera=()";

    # Configuración adicional del servidor...
}
```

## <mark style="color:green;">Ejemplo de Escaneo de Nmap para Verificar Cabeceras de Seguridad</mark>

Nmap, con la ayuda de scripts NSE, puede ser utilizado para verificar las cabeceras de seguridad configuradas en un servidor web.

**Comando Nmap**

```bash
nmap -p 80 --script http-security-headers target-ip
```

**Explicación del Comando**

* `nmap`: Ejecuta el comando Nmap.
* `-p 80`: Especifica que Nmap debe escanear el puerto 80.
* `--script http-security-headers`: Utiliza el script NSE `http-security-headers` para verificar las cabeceras de seguridad.

**Ejemplo de Salida de Nmap**

```plaintext
Starting Nmap 7.80 ( https://nmap.org ) at 2024-05-18 18:30 UTC
Nmap scan report for 192.168.1.60
Host is up (0.0012s latency).

PORT   STATE SERVICE
80/tcp open  http
| http-security-headers:
|   Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted.cdn.com
|   X-Content-Type-Options: nosniff
|   Strict-Transport-Security: max-age=31536000; includeSubDomains
|   X-Frame-Options: DENY
|   X-XSS-Protection: 1; mode=block
|   Referrer-Policy: no-referrer
|_  Permissions-Policy: geolocation=(), microphone=(), camera=()

Nmap done: 1 IP address (1 host up) scanned in 3.75 seconds
```
