Input validation и sanitization

Основы валидации данных

В Backbone.js валидация данных реализуется на уровне моделей с использованием метода validate. Метод вызывается автоматически при вызове методов set и save и позволяет определить правила проверки для атрибутов модели. Если валидация не проходит, метод должен возвращать строку с описанием ошибки.

Пример базовой валидации:

var User = Backbone.Model.extend({
  defaults: {
    name: '',
    email: ''
  },

  validate: function(attrs) {
    var errors = {};
    if (!attrs.name || attrs.name.trim() === '') {
      errors.name = 'Имя не может быть пустым';
    }
    if (!attrs.email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(attrs.email)) {
      errors.email = 'Некорректный формат email';
    }
    if (!_.isEmpty(errors)) {
      return errors;
    }
  }
});

var user = new User();
user.on('invalid', function(model, errors) {
  console.log(errors);
});

user.set({ name: '', email: 'wrong-email' }, { validate: true });

В примере:

  • validate проверяет атрибуты name и email.
  • Если данные некорректны, событие invalid активируется с объектом ошибок.
  • Использование validate: true при set или save обязательно для запуска валидации.

Встроенные события для обработки ошибок

Backbone.js предоставляет события, связанные с валидацией:

  • invalid — вызывается при ошибке валидации.
  • change — вызывается при успешном изменении атрибутов после успешной валидации.

Можно подписываться на эти события для реализации динамического отображения ошибок на интерфейсе.

user.on('invalid', function(model, errors) {
  for (var key in errors) {
    console.log(key + ': ' + errors[key]);
  }
});

Санация данных (Sanitization)

Санация данных необходима для защиты от XSS, SQL-инъекций и некорректного ввода. Backbone.js не предоставляет встроенных средств для санирования, поэтому его реализуют через вспомогательные функции или сторонние библиотеки, например, DOMPurify для очистки HTML.

Пример простой санации перед установкой атрибутов:

var sanitize = function(str) {
  return str.replace(/</g, '&lt;').replace(/>/g, '&gt;').trim();
};

var Post = Backbone.Model.extend({
  defaults: {
    title: '',
    content: ''
  },

  setSanitized: function(attrs, options) {
    if (attrs.title) attrs.title = sanitize(attrs.title);
    if (attrs.content) attrs.content = sanitize(attrs.content);
    this.set(attrs, options);
  }
});

var post = new Post();
post.setSanitized({ title: '<script>alert(1)</script>', content: '  text  ' });
console.log(post.toJSON());
// Результат: { title: '&lt;script&gt;alert(1)&lt;/script&gt;', content: 'text' }

Валидация на уровне коллекций

Коллекции в Backbone.js могут содержать модели, каждая из которых проходит собственную валидацию. Дополнительно можно валидировать коллекцию целиком, проверяя уникальность значений или общие ограничения.

var Users = Backbone.Collection.extend({
  model: User,

  validateAll: function() {
    var errors = [];
    this.each(function(user) {
      var err = user.validate(user.attributes);
      if (err) errors.push({ user: user, errors: err });
    });
    return errors.length ? errors : null;
  }
});

var users = new Users([
  { name: 'Alice', email: 'alice@example.com' },
  { name: '', email: 'invalid-email' }
]);

var collectionErrors = users.validateAll();
console.log(collectionErrors);

Рекомендации по организации валидации

  1. Разделять валидацию и санацию — валидация проверяет корректность, санация — безопасность.
  2. Использовать события Backbone для обработки ошибок — позволяет централизованно отображать ошибки пользователю.
  3. Валидация коллекций — полезна для проверки уникальности и зависимости атрибутов между моделями.
  4. Применять вспомогательные функции для санирования — регулярные выражения или специализированные библиотеки повышают безопасность.
  5. Использовать опцию { validate: true } при set и save — без неё метод validate не срабатывает.

Обработка асинхронной валидации

Иногда проверка данных требует обращения к серверу. Backbone.js позволяет использовать метод save с серверной валидацией, обрабатывая ошибки через колбэки error.

user.save(null, {
  success: function(model, response) {
    console.log('Данные сохранены');
  },
  error: function(model, response) {
    console.log('Ошибка сервера:', response.responseText);
  }
});

Асинхронная валидация может комбинироваться с локальной: сначала проверяются формальные требования (validate), затем отправляется запрос на сервер для проверки уникальности или существования данных.

Итоговая структура валидации и санации

  • validate — проверка формата и обязательных полей.
  • sanitize — очистка данных для безопасного использования.
  • set/save с { validate: true } — запуск локальной валидации.
  • Событияinvalid, change для реактивного управления состоянием.
  • Коллекции — валидация моделей и дополнительных правил на уровне коллекции.
  • Асинхронная валидация — обработка через сервер и колбэки success/error.

Эффективная комбинация этих механизмов обеспечивает корректность, консистентность и безопасность данных в приложениях на Backbone.js.