Csrf
in package
Token sincronizador contra falsificación de peticiones entre sitios (CSRF).
Vive en utils/ y no en el núcleo de la API porque el token es de SESIÓN, no de la API: las páginas PHP necesitan emitirlo para que el frontend lo envíe, y esas páginas cargan bootstrap.php, no el núcleo.
Uso:
- Página PHP: <script>window.CSRF_TOKEN = '= Csrf::token() ?>';</script>
- Frontend: cabecera X-CSRF-Token en cada petición
- Login: Csrf::renovar() tras validar credenciales
── REGLA IMPORTANTE ──────────────────────────────────────────────────────── NUNCA llamar a token() ni a renovar() desde un handler de la API que no declare escribeSesion: true en su Ruta.
Motivo: el despachador libera el bloqueo de sesión con session_write_close() antes de invocar los handlers que no declaran esa bandera. El token se escribiría en $_SESSION en memoria y se devolvería al cliente, pero no llegaría a persistirse. El frontend guardaría entonces un token que el servidor desconoce y toda petición posterior respondería 403 CSRF_INVALIDO, mientras el login habría contestado ok:true. El usuario percibe que "entra" y que después no funciona nada, sin ningún error que lo explique.
En logout no hace falta nada: session_destroy() se lleva el token consigo.
Table of Contents
Constants
Methods
- renovar() : string
- Renueva el token. Debe llamarse tras iniciar sesión, junto a session_regenerate_id().
- token() : string
- Devuelve el token de la sesión, generándolo si no existe.
- valido() : bool
- Verifica el token recibido contra el de la sesión.
Constants
CABECERA
private
mixed
CABECERA
= 'HTTP_X_CSRF_TOKEN'
CLAVE
private
mixed
CLAVE
= '__csrf'
Methods
renovar()
Renueva el token. Debe llamarse tras iniciar sesión, junto a session_regenerate_id().
public
static renovar() : string
Return values
string —el nuevo token
token()
Devuelve el token de la sesión, generándolo si no existe.
public
static token() : string
Return values
stringvalido()
Verifica el token recibido contra el de la sesión.
public
static valido() : bool
Se acepta por cabecera (preferente) o por campo del formulario, para las peticiones multipart donde añadir cabeceras es incómodo.