Due modi per sviluppare un'app Web: O il modo "classico", ricaricare completamente la pagina con ogni richiesta o il modo "API", cioè fare in modo che il server invii solo dati JSON e faccia in modo che il client lo prelevi da AJAX e ricostruire la pagina tramite JS.
Sto pensando al terzo modo: fare in modo che il server invii frammenti HTML, possibilmente con tag <script>
in risposta ad ogni richiesta, e faccia in modo che il client li prelevi tramite AJAX e li colleghi ai nodi HTML esistenti nel documento. Ad esempio, le strutture di accesso possono essere implementate in questo modo: il percorso login.html
del sito Web può inviare il modulo di accesso o il pulsante di disconnessione, che verrà recuperato dal client tramite AJAX e collegato a un <div>
appropriato. Se l'utente fa clic sul pulsante login / logout, questo verrà inserito dal clinet tramite XMLHttpRequest. In questo modo posso evitare di ricaricare l'intera pagina mentre utilizzo ancora i vantaggi del linguaggio di template lato server, che ad esempio ordina automaticamente roba come i token CSRF nei moduli.
Questo significa che il codice JS del mio cliente contia in frammenti come questo:
let xhr = new XMLHttpRequest();
xhr.onload = function () {
let elt = document.getElementById('toBeInsertedTo');
elt.innerHTML = "";
elt.innerHTML = xhr.responseXML.getElementById('toBeInserted').innerHTML;
// alternatively: elt.appendChild(xhr.responseXML.getElementById('toBeInserted'));
for (scr of Array.from(elt.getElementsByTagName('script'))) {
eval(scr.innerHTML);
// alternatively: new Function(scr.innerHTML)();
}
}
xhr.open('GET', '@Url.Page("/SomePage")');
xhr.responseType = 'document';
xhr.send();
Non riesco a vedere come questo possa essere meno sicuro di ricaricare completamente la pagina - in entrambi i casi tutto ciò che viene ricevuto dal server è ugualmente affidabile.
Ma non riesco a vedere come può essere insicuro, non significa che non lo sia. I miei dubbi sono basati su due cose:
- MDN mette in guardia contro
innerHTML
eeval
. Dicono che queste strutture sono insicuri. Secondo loro, l'uso diinnerHTML
costituisce, per i propri motivi sufficienti, il fallimento della maggior parte degli audit di sicurezza eeval
non dovrebbe mai essere utilizzato. Immagino che le stesse preoccupazioni dovrebbero essere presenti con alternative ainnerHTML
comeappendChild
ing i nodi rilevanti, dal momento che essenzialmente fanno lo stesso; quando si tratta dieval
, MDN consigliaFunction
come alternativa meno cattiva, ma avverte che è solo leggermente più sicuro dieval
. - Suppongo che debba esserci una ragione per cui i tag
<script>
inseriti attraversoinnerHTML
non vengono eseguiti e ho un accenno che questo deve essere correlato alla sicurezza. Posso forzarli a eseguire (eval
,Function
), ma non sto buttando via le precauzioni di sicurezza che le persone più saggiamente di me hanno messo in campo per buone ragioni che non capisco nemmeno?
Il mio design è intrinsecamente insicuro? In caso affermativo, a quali tipi di attacchi è vulnerabile?
Se è importante, il back-end lato server è ASP .NET Core.