2012-09-25 20 views
25

Ich baue eine Backbone.js Anwendung und frage mich, was ist der beste Weg, mit XSS bzw. HTML-Escaping umzugehen, wenn Backbone.js verwenden.Backbone.js und XSS/HTML entkommen

In der grundlegenden Todos example application aus der offiziellen Backbone.js-Dokumentation werden die Daten nicht maskiert. Da diese Daten in der Vorlage verwendet wird, um die To-do-Einträge zu machen, ist es möglich, Javascript-Code durch Eingabe der folgenden Text (kann oben an der Verbindung wiedergegeben werden) auszuführen:

"><script>alert('xss');</script> 

Bei Verwendung eines REST-Server Als Speicher-Backend ist dieses XSS für jeden Benutzer persistent.

Wie lösen Sie dieses Problem?

Meine Idee ist es, die Daten auf dem Server zu entkommen, so dass die dann zurückgegebenen Daten sicher in einer Vorlage verwendet werden können. Muss ich dann immer wait: true verwenden, um sicherzustellen, dass keine nicht-gescannten Daten gerendert werden? Fügen Sie zur Bearbeitung ein weiteres Attribut mit den nicht gescannten Daten hinzu, mit denen Sie dann das Textfeld mit .val() füllen können?

Oder tun Sie nichts davon und entkommen die Daten auf dem Client, bevor die Vorlage gerendert?

+2

Was ist mit der Escape-Funktion für Modelle? http://backbonejs.org/#Model-escape – eveevans

+1

Sieht aus wie das Beispiel jetzt behoben wurde. –

Antwort

48

Das Todo-Beispiel ist nicht das sauberste Beispiel. Es verwendet underscore's template engine wie folgt:

<input class="edit" type="text" value="<%= title %>" /> 

richtig HTML zu entkommen, verwendet <%- statt <%=:

<input class="edit" type="text" value="<%- title %>" /> 
2

Der üblicher Weg in Backbone ist model.escape(attribute) zu verwenden.

die Rückgrat-docs backbonejs.org/#Model-escape:

„ähnlich, aber gibt die HTML-escaped Version ein Attribut des Modells Wenn Sie Daten aus dem Modell in HTML-Interpolation Flucht mithilfe von Attributen abgerufen werden verhindern. XSS-Angriffe. "

var hacker = new Backbone.Model({ 
    name: "<script>alert('xss')</script>" 
}); 

alert(hacker.escape('name'));