Il sito Moustache-Security descrive le vulnerabilità XSS in KnockoutJS ... Le vulnerabilità derivano da l'uso di eval (o qualche equivalente) per convertire il testo nell'attributo data-bind in script eseguibile. La maggior parte degli esempi mostra attacchi in cui è possibile eseguire script dannosi se vengono inseriti in un attributo di associazione dati.
Esempio (HTML / JavaScript / KnockoutJS):
<script src="http://knockoutjs.com/downloads/knockout-3.0.0.debug.js"></script><divdata-bind="click: alert(1)"></div>
<div data-bind="value: alert(2)"></div>
<div data-bind="style: alert(3)"></div>
...
<select data-bind="options: alert(99)"></select>
<script>
ko.applyBindings();
</script>
Mentre riesco a riprodurre gli esempi così come sono definiti, di solito evito di inserire JavaScript negli attributi data-bind quando utilizzo KnockoutJS. Preferisco fare riferimento a una proprietà osservabile su un oggetto JavaScript per separare il comportamento della vista dal suo layout. Utilizzando questo approccio, trovo che JavaScript non è eseguibile.
Esempio (HTML / JavaScript / KnockoutJS):
<script src="http://knockoutjs.com/downloads/knockout-3.0.0.debug.js"></script><divdata-bind="value: firstName"></div>
<script>
var ViewModel = function() {
this.firstName = ko.observable('alert(2)');
}
var vm = new ViewModel();
ko.applyBindings(vm);
</script>
La mia applicazione è a rischio di XSS solo perché ho usato KnockoutJS, o devo anche trovare un modo per inserire un input non affidabile in un attributo data-bind, usando il codice lato server?
Esempio (ASP.NET/HTML/JavaScript/KnockoutJS):
<div data-bind="value: <%=Request.QueryString("id")%>"></div>
Penserei che se un utente malintenzionato immettesse il proprio script nella pagina utilizzando JavaScript, allora può facilmente manipolare il DOM direttamente e KnockoutJS non aumenta il rischio di XSS.
C'è qualcos'altro che mi manca? Che altro devo fare per prevenire le vulnerabilità XSS che l'autore descrive?