Автор Анубхав Джайн

В этом посте мы поговорим об ограничении скорости, общем требовании большинства веб-приложений. Ограничение скорости может обеспечить первую линию защиты от пользователей, пытающихся спамить контент на ваш веб-сайт или пытающихся использовать ресурсы сервера.

Обзор ограничения скорости в текущих веб-фреймворках

Сегодня большинство популярных веб-фреймворков не обеспечивают защиту от атак типа отказ в обслуживании (DoS) или атак по словарю из коробки. Быстрый поиск в Google ограничения скорости в веб-приложениях приводит к множеству различных вариантов ограничения скорости; например, есть решение для Flask, которое включает использование Redis и пакет сообщества для Rails. Однако по умолчанию ни одно из этих решений не входит в состав фреймворков. Ограничение скорости также может быть задачей веб-сервера или прокси, и на этом уровне существует множество решений, но состояние ограничения скорости для веб-сокетов намного менее зрело.

Реализация ограничения скорости в Meteor

С помощью сообщества Meteor мы определили важность ограничения скорости и, таким образом, включаем решение по ограничению скорости по умолчанию в Meteor 1.2. Meteor использует протокол веб-сокетов, называемый DDP, для получения структурированных данных с сервера и получения обновлений в реальном времени при изменении данных; это новый вид технологий, требующий новых инструментов.

По умолчанию многие веб-фреймворки уязвимы для простого скрипта проверки пароля. Наше решение - ограничить скорость перебора паролей по умолчанию в пакете accounts-base. Это ограничение защитит приложения Meteor от атак, связанных со сбросом паролей, созданием большого количества новых пользователей или попыткой использования множества комбинаций имени пользователя и пароля.

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

Как легко добавить ограничение скорости в ваше приложение!

Вот пример кода, добавляющего правило к DDPRateLimiter в Meteor 1.2:

// Define a rule that matches add comment attempts by non-admin usersvar addCommentRule = { userId: function (userId) { return Meteor.users.findOne(userId).type !== 'Admin'; }, type: 'method', method: 'addComment'}// Add the rule, allowing up to 5 messages every 1000 milliseconds.
DDPRateLimiter.addRule(addCommentRule, 5, 1000);

Давайте посмотрим, что это на самом деле делает:

  • Правило определяется как набор пар "ключ-значение", где ключи представляют собой один или несколько из userId, clientAddress, type, name и connectionId. Значения могут быть нулевыми, примитивными или функциями. Если вы хотите ограничить рейтинг для одних пользователей, но не для других, правило может сопоставлять вызовы с использованием функции способом, который определяется во время выполнения на основе базы данных или других данных. В нашем примере мы проверяем базу данных, чтобы избежать ограничения количества пользователей с правами администратора.
  • Когда мы добавляем правило в DDPRateLimiter, мы также указываем количество сообщений, которые мы разрешаем, и временной интервал, в течение которого сбрасывается ограничение скорости.

Скоро появится как часть Meteor 1.2

В рамках нового выпуска текущие приложения, использующие пакет accounts-base, будут иметь ограничение скорости входа в систему, добавленное по умолчанию, но мы также предоставили простой способ удалить правило по умолчанию. Они являются частью продолжающихся улучшений клиентской и серверной системы Meteor DDP и будут доступны в составе Meteor 1.2, о котором вы можете узнать больше в недавнем сообщении в блоге Мэтта.