Non l'ho visto da nessuna parte in natura, quindi mi chiedo se è sicuro iniettare nei moduli della stessa origine l'input nascosto contenente il token XSRF usando JavaScript come questo:
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);
}
})
});
Il token verrebbe generato per utente per sessione e consegnato con la pagina HTML come valore di attributo sull'elemento <html>
.
Naturalmente ciò funzionerebbe solo nelle parti dell'applicazione per le quali è richiesto JavaScript. È molto più semplice che inserire l'input nascosto ovunque.
Molti siti suggeriscono di utilizzare un framework per questo, tuttavia questa non è un'opzione fattibile e se deve essere nascosto input sul caricamento della pagina, il meglio che posso fare è creare una funzione Twig helper per emettere il tag, ma ciò richiede ancora che cosparso ovunque. E se questo è il caso, allora come funzionano i moduli creati dinamicamente?
Non penso che il metodo JavaScript sia meno sicuro di <input type=hidden>
ovunque perché il token è recuperabile dal modulo in caso di XSS comunque, ma c'è qualcos'altro che mi manca?