Backbone.js и XSS/HTML-экранирование
Я создаю приложение Backbone.js и задаюсь вопросом, что лучший способ справиться с XSS, соответственно, с экранированием HTML при использовании Backbone.js.
В базовом примере приложения Todos из официальной документации Backbone.js данные не экранируются. Поскольку эти данные используются в шаблоне для рендеринга записей todo, можно выполнить код Javascript, введя следующий текст (может быть воспроизведен по ссылке выше):
"><script>alert('xss');</script>
При использовании сервера REST в качестве хранилища данных этот XSS является постоянным для каждого пользователя.
Как вы решаете эту проблему?
Моя идея состоит в том, чтобы избежать данных на сервере, поэтому возвращаемые данные будут безопасными для использования в шаблоне. Должен ли я всегда использовать wait: true
, чтобы убедиться в отсутствии рендеринга неизолированных данных? А для редактирования добавьте еще один атрибут с неэкранированными данными, который затем можно будет использовать для заполнения текстового поля с помощью .val()
?
Или вы не делаете этого и избегаете данных на клиенте, прежде чем создавать шаблон?
Ответы
Ответ 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'));