Подтвердить что ты не робот

Backbone.js и XSS/HTML-экранирование

Я создаю приложение Backbone.js и задаюсь вопросом, что лучший способ справиться с XSS, соответственно, с экранированием HTML при использовании Backbone.js.

В базовом примере приложения Todos из официальной документации Backbone.js данные не экранируются. Поскольку эти данные используются в шаблоне для рендеринга записей todo, можно выполнить код Javascript, введя следующий текст (может быть воспроизведен по ссылке выше):

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

При использовании сервера REST в качестве хранилища данных этот XSS является постоянным для каждого пользователя.

Как вы решаете эту проблему?

Моя идея состоит в том, чтобы избежать данных на сервере, поэтому возвращаемые данные будут безопасными для использования в шаблоне. Должен ли я всегда использовать wait: true, чтобы убедиться в отсутствии рендеринга неизолированных данных? А для редактирования добавьте еще один атрибут с неэкранированными данными, который затем можно будет использовать для заполнения текстового поля с помощью .val()?

Или вы не делаете этого и избегаете данных на клиенте, прежде чем создавать шаблон?

4b9b3361

Ответ 1

Пример Todo не самый чистый пример. Он использует шаблон шаблона подчеркивания, как показано ниже:

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

Чтобы правильно избежать HTML, используйте <%- вместо <%=:

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

Ответ 2

Стандартный способ в магистрали - использовать model.escape(attribute).

Из основного документа backbonejs.org/#Model-escape:

"Аналогично get, но возвращает версию атрибута модели, экранированную HTML. Если вы интерполируете данные из модели в HTML, использование escape для извлечения атрибутов предотвратит атаки XSS."

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

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