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?