handleAccess вызывал AddAccess не проверяя, что видео существует. Значит можно было пре-авторизоваться на ещё не созданные id (и на отрицательные): POST /access videoID=<top+3000> с форженным токеном возвращает 302, строка в access создаётся, и когда чекер создаст видео с этим id -- доступ уже есть. Главное: такая строка ПЕРЕЖИВАЕТ ротацию токенов. haveAccess() смотрит в таблицу access, а не на токен, поэтому переход на HMAC от заранее набитых записей не защищает. Проверено на 10.10.10.5: /access для id=top+3000 -> 302 /watch/63481. Чистка уже накопленного мусора (легитимных записей на несуществующие видео быть не может): DELETE a FROM access a LEFT JOIN video v ON v.id = a.video_id WHERE v.id IS NULL; Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>