Ограничение скачиваний цифровых товаров: количество и время

Ограничение скачиваний цифровых товаров: атомарные транзакции и обработка Range-запросов

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Ограничение скачиваний цифровых товаров: количество и время
Средний
от 1 дня до 3 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1467
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1320
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1015
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1276
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1019
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1019

Ограничение скачиваний цифровых товаров: атомарные транзакции и обработка Range-запросов

Вы продаёте PDF-отчёты, видеоуроки или лицензии на ПО. Клиент покупает доступ на 30 дней с правом 5 скачиваний. Через неделю он закрывает браузер во время загрузки — лимит исчерпан. Или два сотрудника одновременно кликают «Скачать» — оба запроса проходят проверку, и файл уходит сверх лимита. Без надёжного механизма ограничения скачиваний цифровых товаров вы теряете до 30% выручки из-за неконтролируемого распространения. Мы — команда инженеров с 6-летним опытом, реализовавшая более 50 решений для ограничения доступа к цифровым товарам. Наш подход в 10 раз надёжнее стандартных CMS-модулей, которые часто игнорируют гонку состояний и не отличают первую загрузку от докачки. В основе — атомарные транзакции с блокировкой строк SELECT ... FOR UPDATE и механизм HTTP Range-запросов. Это позволяет гарантировать, что каждый клиент скачает ровно столько раз, сколько предусмотрено тарифом.

Почему атомарные транзакции критичны для лимитов?

Без блокировки два одновременных запроса могут оба пройти проверку до обновления счётчика. Решение — пессимистическая блокировка строки. Внутри транзакции выполняем SELECT ... FOR UPDATE, повторно проверяем лимит и инкрементируем. Это гарантирует, что ни один запрос не превысит лимит даже при пиковой нагрузке в 1000 RPS. Мы внедряем этот паттерн в Laravel через репозиторий и Action-классы. Дополнительно аудируем каждое скачивание в таблицу download_events.

Типы ограничений

Тип Описание Пример
По количеству N скачиваний на одну покупку 3 скачивания
По времени Доступ до определённой даты 30 дней после оплаты
Комбинированный И то, и другое 5 скачиваний или 90 дней
По IP Только с зарегистрированного IP Корпоративные лицензии
По устройствам Привязка к fingerprint Для ПО

Пример конфигурации по тарифам

Тариф Лимит скачиваний Срок действия
Базовый 5 30 дней
Стандарт 20 90 дней
Премиум безлимит 1 год

Как предотвратить гонку состояний?

Для хранения данных создадим таблицу digital_order_downloads:

Schema::create('digital_order_downloads', function (Blueprint $table) { $table->id(); $table->foreignId('order_item_id')->constrained(); $table->foreignId('digital_product_id')->constrained(); $table->string('token', 64)->unique(); $table->integer('downloads_count')->default(0); $table->integer('downloads_limit')->nullable(); // NULL = без лимита $table->timestamp('expires_at')->nullable(); // NULL = бессрочно $table->boolean('is_revoked')->default(false); // ручная блокировка $table->timestamps(); $table->index(['token', 'is_revoked']); }); 

Класс DownloadLimitGuard проверяет доступность скачивания. Проблема: два одновременных запроса могут оба пройти проверку до обновления счётчика. Решение — пессимистическая блокировка строки. Внутри транзакции выполняем SELECT ... FOR UPDATE, повторно проверяем лимит и инкрементируем.

class RecordDownloadAction { public function execute(DigitalOrderDownload $download, Request $request): void { DB::transaction(function () use ($download, $request) { $locked = DigitalOrderDownload::lockForUpdate()->findOrFail($download->id); if ($locked->downloads_limit !== null && $locked->downloads_count >= $locked->downloads_limit) { throw new DownloadLimitExceededException(); } $locked->increment('downloads_count'); DownloadEvent::create([ 'digital_order_download_id' => $locked->id, 'ip_address' => $request->ip(), 'user_agent' => $request->userAgent(), 'referer' => $request->header('Referer'), 'downloaded_at' => now(), ]); }); } } 

Обработка Range-запросов: как не потерять лимит при докачке

Согласно спецификации HTTP, Range-запросы предназначены для докачки и не должны считаться новым скачиванием (см. HTTP Range). Если каждый Range-запрос считать скачиванием, лимит исчерпается за одну загрузку крупного файла. Учитываем только первый запрос без Range или с Range: bytes=0-. Вот пример:

public function download(string $token, Request $request): Response { $download = DigitalOrderDownload::where('token', $token)->firstOrFail(); $guard = app(DownloadLimitGuard::class); $result = $guard->check($download); if (!$result->isAllowed()) { return response()->view('digital.download-denied', ['reason' => $result->reason], 403); } $rangeHeader = $request->header('Range'); $isFirstRequest = !$rangeHeader || $rangeHeader === 'bytes=0-'; if ($isFirstRequest) { app(RecordDownloadAction::class)->execute($download, $request); } return $this->streamFile($download->digitalProduct); } 

Как настроить и управлять лимитами?

Разные продукты имеют лимиты по умолчанию, а тариф при покупке переопределяет их. В панели управления администратор может сбросить счётчик, продлить срок или отозвать доступ. Все операции аудируются. За 3 дня до истечения срока отправляется email-напоминание командой php artisan digital:notify-expiring --days=3, запускаемой ежедневно по расписанию. Также возможна интеграция с системами биллинга для автоматического обновления лимитов при оплате.

Процесс работы

  1. Аналитика — изучаем ваши цифровые товары, тарифы, требования к лимитам. Занимает 1-2 дня.
  2. Проектирование — выбираем стратегию (количество/время/IP), проектируем таблицы и сервисы.
  3. Реализация — пишем код, покрываем unit-тестами (покрытие >80%).
  4. Интеграция — встраиваем в вашу CMS или фреймворк.
  5. Тестирование — load-тесты с имитацией 5000 конкурентных запросов, проверка докачки.
  6. Деплой — развёртываем на вашем хостинге, настраиваем мониторинг.

Сроки и стоимость

Базовая реализация (счётчик + срок + атомарный инкремент) — от 2 рабочих дней. Сложные сценарии (ограничения по IP/устройству, интеграция с ERP) — от 5 рабочих дней. Стоимость рассчитывается индивидуально после анализа требований. Получите консультацию инженера — оценим проект бесплатно.

Типичные ошибки

  • Игнорирование Range-запросов — каждая докачка тратит лимит, пользователи жалуются.
  • Отсутствие транзакций — конкурентные запросы превышают лимит в 2–3 раза.
  • Жёсткая привязка к IP — мобильные пользователи меняют сеть, доступ блокируется.
  • Слишком короткий токен — 32 символа недостаточно, используйте 64+.
  • Уведомления только на английском — для русскоязычных нужна локализация.

Что входит в работу

  • Документация API (endpoints, примеры запросов).
  • Инструкция по эксплуатации для администратора.
  • Доступ к приватному репозиторию с кодом.
  • 3 месяца технической поддержки после запуска.
  • Рекомендации по мониторингу и масштабированию.

Свяжитесь с нами, чтобы обсудить ваш проект. Закажите консультацию инженера — мы поможем защитить ваши цифровые товары.