> ## Documentation Index
> Fetch the complete documentation index at: https://reduardo.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Protección CSRF

> Implementación de tokens CSRF en formularios

# Protección CSRF

El sistema implementa protección contra ataques **Cross-Site Request Forgery (CSRF)** usando tokens únicos por sesión.

## ¿Qué es CSRF?

Un ataque CSRF engaña al navegador de un usuario autenticado para que envíe una solicitud maliciosa sin su consentimiento. Los tokens CSRF previenen esto verificando que cada formulario fue generado por el servidor.

## Implementación

### Clase `Config\Csrf`

```php theme={null}
class Csrf
{
    // Genera un token y lo almacena en la sesión
    public static function generar(): string
    {
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }
        $token = bin2hex(random_bytes(32));
        $_SESSION['csrf_token'] = $token;
        return $token;
    }

    // Genera un campo hidden HTML con el token
    public static function campo(): string
    {
        $token = self::generar();
        return '<input type="hidden" name="csrf_token" value="' . $token . '">';
    }

    // Valida el token enviado contra el de la sesión
    public static function validar(): bool
    {
        $token = $_POST['csrf_token'] ?? '';
        $sessionToken = $_SESSION['csrf_token'] ?? '';
        return hash_equals($sessionToken, $token);
    }
}
```

### Uso en Formularios

En cada vista que tiene un formulario POST:

```php theme={null}
<form action="/productos/store" method="POST">
    <?= Csrf::campo(); ?>
    <!-- Resto del formulario -->
</form>
```

### Validación en Controladores

Antes de procesar cualquier acción POST:

```php theme={null}
if (!Csrf::validar()) {
    $_SESSION['error'] = 'Token de seguridad inválido.';
    header('Location: /productos');
    exit;
}
```

## Formularios Protegidos

| Formulario | Controlador |
| - | - |
| Login | `AuthController::login()` |
| Crear producto | `ProductoController::store()` |
| Editar producto | `ProductoController::update()` |
| Eliminar producto | `ProductoController::delete()` |

<Tip>
  La función `hash_equals()` se usa para la comparación del token, lo que previene ataques de timing que podrían adivinar el token carácter por carácter.
</Tip>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.