Backbone.js строится вокруг MVC-подхода, где основными компонентами являются Model, View, Collection, Router и Events. Это позволяет создавать структурированные клиентские приложения с ясным разделением ответственности.
Эта структура обеспечивает ясную архитектуру приложения и позволяет изолировать зоны ответственности, что особенно важно при обеспечении безопасности и поддержке кода.
Валидация данных на стороне клиента является первой
линией защиты. Backbone предоставляет метод validate,
который вызывается при сохранении модели (model.save).
Валидация должна проверять:
Пример:
var User = Backbone.Model.extend({
validate: function(attrs) {
if (!attrs.email || !attrs.email.match(/^[^@]+@[^@]+\.[^@]+$/)) {
return "Неверный формат email";
}
if (attrs.age && attrs.age < 0) {
return "Возраст не может быть отрицательным";
}
}
});
Валидация на клиенте не заменяет серверную проверку, но снижает риск отправки некорректных данных и упрощает обработку ошибок на UI.
Синхронизация с сервером
(Backbone.sync) должна быть настроена с использованием
безопасных методов HTTP (POST, PUT,
DELETE) и HTTPS.
Backbone.sync = function(method, model, options) {
options || (options = {});
options.headers = _.extend(options.headers || {}, {
'X-CSRF-Token': getCsrfToken()
});
return Backbone.ajax(_.extend(options, {
type: methodMap[method],
url: _.result(model, 'url') || urlError(),
data: JSON.stringify(model.toJSON()),
contentType: 'application/json'
}));
};
Ключевые моменты:
Backbone View управляет DOM, поэтому важно не вставлять
пользовательский ввод напрямую в HTML без экранирования.
Использование text() вместо html()
предотвращает внедрение скриптов.
var UserView = Backbone.View.extend({
render: function() {
this.$el.text(this.model.get('name')); // безопасное отображение
return this;
}
});
События (Events) должны быть ограничены
контекстом компонента и не использовать глобальные ссылки на DOM
элементы без проверки.
events: {
'click .save-button': 'saveModel'
},
saveModel: function(e) {
e.preventDefault();
this.model.save();
}
Изоляция событий предотвращает случайное выполнение скриптов или манипуляции сторонними компонентами.
Коллекции могут содержать сотни моделей. При получении данных с сервера необходимо:
set с опцией
validate: true.var Users = Backbone.Collection.extend({
model: User
});
users.set(serverData, {validate: true});
Это предотвращает попадание некорректных или вредоносных объектов в коллекцию.
Router управляет состоянием SPA и URL. Для предотвращения неавторизованного доступа:
navigate с параметром
{trigger: true} только после аутентификации.var AppRouter = Backbone.Router.extend({
routes: {
"dashboard": "showDashboard"
},
showDashboard: function() {
if (!Auth.isLoggedIn()) {
this.navigate('login', {trigger: true});
return;
}
// рендеринг безопасного представления
}
});
Применение этих практик позволяет создать безопасное, масштабируемое Backbone.js приложение, минимизируя риски внедрения вредоносного кода и некорректной обработки данных.