Co chcę zrobić: Gdy user kliknie na link / button w formularzu to wysyłać to żądanie przez XMLHttpRequest, tyle że serwer w odpowiedzi ma wysyłać nie czyste dane w JSONie, tylko od razu gotowego HTMLa, którego kliencki JavaScript powiesi w odpowiednim miejscu na stronie. Na przykład chcę tak zrobić logowanie: na górze strony ma być sobie div, pod którego podpięte będzie albo wysłany przez serwer formularz z loginem i hasłem do wpisania (ze wszystkimi tagami form, input itp), albo span z zalogowanym nickiem i button do wylogowania.

Dlaczego chcę tak zrobić: W ten sposób (a) nie muszę przeładowywać całej strony, gdy tylko user coś kliknie, a jednocześnie (b) nie muszę chrzanić się z budowaniem strony w JS, tylko mogę wykorzystać serwerowy język szablonów.

A zatem, klient będzie posiadał tego rodzaju kod:

let xhr = new XMLHttpRequest();
xhr.onload = function () {
    let elt = document.getElementById('odpowiedzSerweraPowiesicTutaj');
    elt.innerHTML = "";
    elt.innerHTML = xhr.responseXML.getElementById('doPowieszeniaNaStronie').innerHTML;
    // albo: elt.appendChild(xhr.responseXML.getElementById('doPowieszeniaNaStronie'));
    for (scr of Array.from(elt.getElementsByTagName('script'))) {
        eval(scr.innerHTML);
        // albo: new Function(scr.innerHTML)();
    }
}
xhr.open('GET', '@Url.Page("/jakisAdres")');
xhr.responseType = 'document';
xhr.send();

Dlaczego mam wątpliwości: Kwestie bezpieczeństwa nigdy specjalnie mnie nie pasjonowały... A MDN zdaje się ostrzegać przeć konstrukcjami, których użyłem.
Tu na przykład MDN straszy, że innerHTML stanowi zagrożenie bezpieczeństwa, i że użycie innerHTML jest już wystarczającym powodem, by wiele audytów bezpieczeństwa odrzuciło stronę. (Co prawda zamiast innerHTML mogę użyć appendChild, no ale to przecież robi to samo w tym wypadku.) Tu z kolei MDN potępia eval, że niby nigdy nie należy go używać, m.in. z powodów związanych z bezpieczeństwem; co prawda zamiast eval proponują Function, ale tutaj także ostrzegają, że Function ma podobne problemy z bezpieczeństwem, jak eval.

Co więcej, domyślnie skrypty wstawione przez innerHTML lub choćby appendChild się nie wykonują. Dlaczego? Nie wiem, ale chyba rozsądnie będzie strzelić, że znów wskutek problemów bezpieczeńśtwa. Ja natomiast wymuszam, by się wykonały - czy w ten sposób nie wyrzucam przez okno zabezpieczeń, które mądrzejsi ode mnie wprowadzili, podczas gdy ja nawet nie rozumiem, dlaczego?

Ja nie widzę, jak mój design może być sam z siebie dziurawy. Tak - HTML z serwera jest wieszany na stronie, skrypty wykonywane - ale to samo jest w klasycznym podejściu, gdzie każde żądanie przeładowuje całą stronę i zastępuje ją tym, cokolwiek pobrało z serwera.

Ale to, że ja nie widzę, jeszcze o niczym nie świadczy. A wątpliwości wymienione wyżej zostają.

Czy to, co ja chcę zrobić, to zuo i zaproszenie do wszelkiej maści ataków? Na jakie ataki miałoby to być podatne?