No he visto esto en ningún lugar en la naturaleza, por lo que me pregunto si es seguro inyectar en formas del mismo origen la entrada oculta que contiene el token XSRF utilizando JavaScript como este:
document.addEventListener('DOMContentLoaded', () => {
// Get token from <html> tag
const XSRF_TOKEN = document.documentElement.getAttribute('data-xsrf-token');
const uri = new URI(document.URL);
// Loop through all forms
Array.from(document.getElementsByTagName('form')).forEach(el => {
let actionUri = new URI(el);
// Only append hidden input to same-origin forms with method POST
if (actionUri.origin() === uri.origin() && el.method === 'post') {
let tokenInput = document.createElement('input');
tokenInput.name = 'xsrf_token';
tokenInput.type = 'hidden';
tokenInput.value = XSRF_TOKEN;
el.appendChild(tokenInput);
}
})
});
El token se generaría por usuario por sesión y se entregaría con la página HTML como un valor de atributo en el elemento <html>
.
Por supuesto, esto solo funcionaría en las partes de la aplicación para las que requerimos JavaScript. Es mucho más fácil que poner la entrada oculta en todas partes.
Muchos sitios sugieren usar un marco para esto, sin embargo, esta no es una opción factible y si deben ser entradas ocultas en la carga de la página, lo mejor que puedo hacer es crear una función Twig auxiliar para generar la etiqueta, pero eso aún requiere que rociado por todas partes. Y si este es el caso, ¿cómo funcionan los formularios creados dinámicamente?
No creo que el método JavaScript sea menos seguro que <input type=hidden>
en todas partes porque el token es recuperable del formulario en caso de XSS, pero ¿hay algo más que me esté faltando?