2012-09-25 10 views
25

Buduję aplikację Backbone.js i zastanawiam się, jaki jest najlepszy sposób radzenia sobie z XSS lub ucieczką HTML przy użyciu Backbone.js.Backbone.js i XSS/HTML escaping

W podstawowej wersji Todos example application z oficjalnej dokumentacji Backbone.js dane nie są chronione. Ponieważ dane te są wykorzystywane w szablonie do renderowania wpisy todo, możliwe jest wykonanie kodu JavaScript podając następujący tekst (może być powielana w linku powyżej):

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

przypadku korzystania z serwera REST jako zaplecze danych, ten XSS jest trwały dla każdego użytkownika.

Jak rozwiązać ten problem?

Moim pomysłem jest uciec od danych na serwerze, więc zwrócone dane można bezpiecznie wykorzystać w szablonie. Czy muszę zawsze używać wait: true, aby upewnić się, że nie są renderowane żadne dane z usuniętymi znakami? A do edycji, dodaj kolejny atrybut z nieodwzorcowanymi danymi, które następnie mogą zostać użyte do wypełnienia pola tekstowego przy użyciu .val()?

A może nic z tego zrobić i uniknąć danych na kliencie, przed renderowaniem szablonu?

+2

Co z funkcją ucieczki dla modeli? http://backbonejs.org/#Model-escape – eveevans

+1

Wygląda na to, że przykład został naprawiony. –

Odpowiedz

48

Przykład Todo nie jest najczystszym przykładem. Wykorzystuje underscore's template engine, co następuje:

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

Aby poprawnie ucieczki HTML, użyj <%- zamiast <%=:

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

Standardowy sposób w sieci szkieletowej jest użycie model.escape(attribute).

Od docs szkieletowych backbonejs.org/#Model-escape:

„Podobny do uzyskania, ale zwraca wersję HTML-uciekł atrybutu modelu, jeśli jesteś interpolację danych z modelu do formatu HTML, używając ucieczkę do pobierania atrybutów uniemożliwi. Ataki XSS. "

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

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