
Комментарии 46
Хоть бы одну картинку показали, ради чего такой огород?
Это психологи... Люшер цвета например защищал... "Оригинальный тест Люшера с уникальной цветовой гаммой". Вот и тут будут доказывать, что скачанные картинки безблагодатны ;)
"Оригинальный тест Люшера с уникальной цветовой гаммой". Вот и тут будут доказывать, что скачанные картинки безблагодатны ;)
Ой, напомнили незабвенный лохотрон экспресс-метод изучения английского языка Илоны Давыдовой, в рекламе которого постоянно педалировалось, что оригинальные аудиокассеты содержат специальные звуковые метки, которые не копируются при перезаписи и поэтому неоригинальные кассеты не работают.
Как говорится - эту бы энергию, да в мирных бы целях!... Ладно еще столько сил класть на защиту изображений до того как появились нейросетки - но сейчас?!. Делается скриншот, специально обученной модели говорится нарисовать похоже - и вот у вас в руках то же самое без водяных знаков и в высоком разрешении..
Я уж не говорю, что 99.9(9)% контента на ваших картах неросетками же и сгенерированы. Выглядит так, что вы сами себе успешно придумали проблему, и успешно ее решили. Это (разминка для ума с подписями устройств, canvas, и проч.) лучше чем тупо залипать в шортсах - но хуже по сравнению, скажем, с прогулкой на велосипеде (или на лыжах)...
Спасибо за комментарий, он справедливый в одном важном месте: абсолютной “защиты картинок” не существует. Скриншот, нейросеть, перерисовка “похоже” – всё это возможно. Я и в статье как раз отдельно пишу, что скриншоты за скобками, а цель не “сделать невозможно”, а удорожить массовое скачивание и дать атрибуцию утечек.
Но тут есть нюанс: МАК-колоды – это не просто “красивые картинки” поштучно. Ценность чаще в другом:
в подборке (сюжеты, баланс, акценты, темп, количество и порядок образов)
в целостной методической логике (что можно достать и как это работает в сессии)
в “упаковке”: название, описание, рамки применения, часто – текстовые карты, рубрики, группы
Даже если колода полностью сгенерирована ИИ, это далеко не “один промпт и готово”. На практике это десятки карт, у каждой свой промпт, много итераций, отбор и редактура. Я это на своём опыте могу подтвердить.
Плюс есть юридическая реальность. Если зайти на маркетплейсы (Ozon/WB), там сотни продаваемых физических колод. В мире популярны сотни колод, и правообладатели реально защищают IP. Если такие колоды начнут появляться на платформе без процедур и технических барьеров, прилетят жалобы и требования. И это уже не “теоретическая проблема”, это вопрос выживания площадки с UGC.
Поэтому подход у меня прагматичный:
не “победить копирование”, а снизить бытовое пиратство, затруднить массовый скрейпинг, и иметь трекинг/процедуры на случай утечек.
А по поводу “энергии в мирных целях” – согласен 🙂 Это и есть “мирная цель”: сделать так, чтобы авторы могли безопасно выкладывать свои колоды и не бояться, что их утащат одним скриптом.
Да блин! ИИ агент через браузер сам зайдет на сайт, сам сделает скриншоты, сам передаст в другую сетку для перерисовки... Неужели вы не видите противоречия в том, что пишете: ценность заключается в подборке, методологической логике, упаковке - а защищаетесь вы от сохранения картинки на диск ? Не хочу сказать плохого - но это какая-то стандартная странность инженеров: решается не та проблема которая существует, а та - которую легче решить...
Понимаю вашу мысль, и я с ней частично согласен: если человек (или “агент”) целенаправленно захочет воспроизвести контент через скриншоты + модель, он это сделает. Это уже другой класс атаки.
Но в статье на Хабре я сознательно фокусировался на техническом уровне и на самом массовом сценарии: когда контент лежит статикой и его можно “выкачать” скриптом почти бесплатно. В таком виде это не про ИИ, это про банальную экономику: 10 минут, curl, и у вас вся колода.
То, что я сделал, не претендует на “DRM” и не обещает невозможного. Оно делает две вещи:
Убирает самый дешёвый путь.
Из “скачать файлы как статический ресурс” это превращается в процесс.Поднимает стоимость следующего шага.
Да, можно сделать агент, который зайдёт, наснимет скриншоты и прогонит через модель. Но это уже не “скачал 700 карт одним запросом”, а время вычислений, деньги на инференс, плюс качество “похоже” не равно оригинал.
И ещё важный момент: защита IP – это не только техника. Есть процедурная сторона: модерация, статусы, жалобы, takedown, правила публикации. Про эту часть я отдельно писал на VC (там другой фокус, не инженерный):
https://vc.ru/life/2761103-sozdanie-onlajn-platformy-dlya-mak-kart
По сути, это обычная многоуровневая история. Техника не “решает всё”. Она делает злоупотребление менее дешёвым и более заметным. А дальше подключается процесс и право.
И да, техническую часть я собрал довольно быстро. Проектирование и реализация именно защиты заняли буквально пару дней. Основное время проекта уходит в “мирные цели”: в ценность для психологов и тех, кто использует МАК для саморефлексии, в удобство сессий, комнаты с методиками, инструменты для авторов и контрибьюторов. А защита – это базовая инфраструктура, чтобы авторам было не страшно приносить контент на площадку.
Я же говорил : "Безблагодатны!!!"
А "бытовое" пиратство наносит реальный ущерб правообладателям или им просто неприятно? Если второе, то пара исков к небытовым пиратам и, учитывая узкий рынок, благая изустная весть о том, что в этом месте лучше не красть, а то станет бо-бо, сделает остальную работу за Вас, без SMS и регистрации, все как Вы и хотели, и даже без ECDSA.
Хорошая логика про "пара показательных кейсов создаёт репутационный барьер", я с ней в целом согласен.
Но есть нюанс: иск подаёт правообладатель, а не платформа. Платформа может помочь собрать доказательства, сделать атрибуцию утечки, быстро выдать выгрузки логов, подсказать порядок действий, а потом уже публично рассказать кейс как "в этом месте воровать не стоит". И вот тут упираемся в экономику и сроки. Даже простой гражданский спор это часто год два, деньги на юриста, время, нервы, иногда ещё и география с юрисдикциями. Если "бытовое" пиратство наносит ущерб на сумму меньше этих затрат, многие авторы просто не пойдут в суд, а в итоге сделают самый рациональный шаг, перестанут публиковаться на площадке.
Поэтому я и смотрю на это так: пара дней работы программиста, чтобы поднять цену "унести пачкой" и дать автору хоть какой то контроль и возможность атрибуции, стоит того, если это удерживает авторов и делает платформу жизнеспособной. Суд как инструмент остаётся, но это скорее тяжёлая артиллерия на редкие случаи, а не единственный механизм защиты "по умолчанию".
Слой 2: Тайлинг – карты как мозаика
Это, пожалуй, самое нестандартное решение.
Ну да ... ну да-а-а ... И так же по поводу рисования на канве:
На днях как раз встречал такую мозаику. Хотел скачать красивую картинку - а фиг вам! Она даже как картинка не воспринимается. Полез в исходники страницы, а там вместо картинки несколько холстов для отдельных фрагментов. Только не 3х3, а на несколько горизонтальных полосок. Зато разной высоты.
Да, тайлинг сам по себе не ноу-хау – подход известный, и горизонтальные полоски, и сетки встречаются. Я скорее погорячился с «самое нестандартное». Ценность не в самом разрезании, а в том, что тайлинг работает в связке с остальными слоями: UUID-имена без манифеста бесполезны, манифест без подписанного запроса не получить, а всё что собирается на canvas – уже с вжженным watermark. Каждый слой по отдельности обходится, но вместе они заметно поднимают стоимость.
А как у вас с SEO?
SEO – вопрос хороший, и честный ответ: пока не главный приоритет, но базу заложили осознанно, а не «потом допилим».
На лендинге всё по классике – мета-теги, Open Graph, Twitter Cards, JSON-LD разметка как WebApplication, семантический HTML. Лендинг двуязычный (EN/RU), так что hreflang настроен, canonical на месте. FAQ сделан на <details>/<summary> – есть шанс поймать rich snippets. Sitemap с hreflang-альтернатами для всех страниц, включая документацию.
Отдельно заморочился с AI-краулерами – в robots.txt явно прописаны GPTBot, Claude-Web, PerplexityBot и другие с Allow: /. Плюс на обоих доменах лежит llms.txt – структурированное описание платформы для LLM. Пока это скорее ставка на будущее, но настроить это стоило 30 минут, а отдача может быть интересной.
Само приложение – SPA на React, SSR нет. Но для краулеров предусмотрен <noscript> блок с полным семантическим контентом – фичи, how-to-use, для кого. Так что бот без JS видит осмысленную страницу, а не пустой <div id="root">.
По инфраструктуре – HTTP→HTTPS, www→apex, SEO-файлы отдаются на HTTP без редиректа. Мелочи, но из них складывается базовая гигиена.
Главное, что понимаю про следующий шаг: когда дойдём до публичного каталога колод – нужен будет SSR или prerendering для карточек. Вот там SEO станет по-настоящему важен. Пока же основной канал – лендинг и документация, и они отдают статический HTML.
А зачем вы невидимый ватермарк текстом впаиваете? (Если я правильно понял.)
Сделайте через QR коды. Гораздо надежнее: можно элементы выровнять по границам блоков жпега на случай пересохранения, и тогда даже самое низкое качество гарантированно оставит неизменным средний цвет. И информации туда можно запихнуть гораздо больше.
Детектирование — разность с оригинальным изображением + усиление сигнала. После этого любой телефон с камерой покажет закодированную строку.
Классная идея, спасибо. Да, вы правильно поняли: сейчас у меня “невидимый” watermark – это текстовый паттерн (пер-device) с очень низкой амплитудой, рассчитанный на то, чтобы переживать типичные пересохранения и при этом не влиять на UX.
Про QR подход мысль сильная. У него реально есть преимущества: больше ёмкость, проще визуальное извлечение, можно привязаться к границам JPEG-блоков и получить более устойчивый “якорь” при агрессивной перекодировке.
Я хотел сначала собрать рабочий механизм “быстро и прагматично” без заметной деградации качества и без риска артефактов на разных типах картинок.
Для QR нужно аккуратно решить вопрос “достаточно сильный сигнал vs незаметность” и понять, как он ведёт себя на сложных текстурах (шумы, градиенты, лица, мелкие детали).
И отдельная инженерная часть – удобный пайплайн детекта и тулза, чтобы извлечение было быстрым в расследовании.
Но как идея для следующей итерации защиты это прямо в точку. Я бы сделал так: оставляю текущий watermark как “baseline”, а QR добавляю как опциональный “канал” поверх, и уже по реальным кейсам утечек/расследований посмотрим, что дает лучший сигнал.
Так протестировать со всевозможными сценариями порчи картинки после кражи не слишком сложно. Можно даже заклинание написать, чтобы не заниматься одним и тем же каждый раз вручную, и чтобы иметь устойчивые начальные условия для корректной оценки живучести информации.
Мне интересна эта тема, и я готов поучаствовать мозгами / руками. Но для полноты картины (и для начала активной работы) мне нужно ответить на главный вопрос. Украли картинку. Я узнал, кто. Дальше что?
Проблема в том, что ущерб уже нанесён. Компенсировать его реально только в небольшом проценте случаев: когда закон нарушает российское юрлицо, или, еще лучше, государственная организация. На этот случай у меня есть юрист, которому можно показать нарушение, а он через некоторое время попросит проверить счёт в банке и перевести ему гонорар.
Что делать с физлицами и иностранными воришками, мне совершенно не ясно. Равно как и с анонимами, от которых есть только адрес гуглопочты. А их большинство. Понятно, что найти можно кого угодно, вопрос окупаемости процесса.
Отличный вопрос, спасибо. Действительно: “украли → я узнал кто” — это только середина истории, а не финал.
Я смотрю на это прагматично и в несколько уровней (это все относится именно к моей Платформе и несколько выходит за рамки технической статьи, поэтому в ней не раскрыто).
Реакция внутри платформы.
Если утечка подтверждается, то минимальный набор действий – shadow ban для устройства/аккаунта (или ограничение доступа), плюс уведомление автора колоды. Тут цель не “наказать всех”, а быстро остановить повторяемое вытягивание и дать автору понимание источника.Экономика атаки.
Главная задача защиты – не сделать кражу невозможной, а резко поднять её стоимость. Как только стоимость извлечения становится выше стоимости покупки/лицензии (особенно если у авторов появится возможность продавать колоды), мотивация массового “тащить скриптом” начинает исчезать.Атрибуция как сигнал.
Если на слитом изображении нет наших водяных знаков, это тоже информация: значит, утечка была не с платформы (или картинка прошла такую переработку, что сигнал потерялся). В обоих случаях это помогает сузить круг гипотез.Юридическая сторона — в основном про другой сценарий.
Там, где действительно имеет смысл подключать юристов, чаще всего другая история: кто-то загрузил на платформу контент, на который у него нет прав. Для этого у нас предусмотрены процедурные меры: репорты/жалобы, тейкдауны, блокировки контента. И по этой же причине есть модерация UGC — чтобы на раннем этапе отсекать очевидное пиратство.
С физлицами/иностранцами вы правы: “дожимать до компенсации” далеко не всегда окупается. Поэтому я и делаю упор на раннее предотвращение, удорожание массового извлечения и быстрые меры внутри платформы.
Предполагаю, что для QR кода с элементом, совпадающим по размерам и расположению с жпег блоком, будет достаточно изменения яркости на 1 единицу. Причём можно в любую сторону (лучше анализировать фон, чтобы не потерять информацию в «чернее черного» или «белее белого»).
Если предположить, что картинка будет ещё и ресайзиться, ситуация меняется, и здесь ответ гораздо проще получить экспериментальным путём, чем аналитически.
Другие обработки, связанные, например, с преобразованием цвета, могут убить столь слабый сигнал и без ресайза. Но здесь опять проще поставить эксперименты, чем теоретизировать.
Главный принцип: у владельца контента должен быть оригинал, с которым сравнивается украденное изображение. Сравнивается попиксельно, результат — модуль разности яркостей, который затем нормализуется до получения отчётливого изображения.
QR-код с высоким уровнем коррекции ошибок (Level H) позволяет скорректировать до 30% ошибочных блоков.
Я бы на месте автора контента радовался, что его работу нельзя утащить одной командой. Пусть не 100% защита, но хотя бы не проходной двор
Может стоило сперва аудиторию набрать на сайте хотя бы минимальную, потом городить такие защиты? Никто не будет ничего воровать с сайта о котором никому ничего неизвестно. Уйму времени потратить на то, что может никогда не пригодиться, выглядит не очень эффективным. Но это может я не понял ценность этих картинок (которые в эпоху ии тебе сделают все что вы там говорили про историю, тему и всякое разное только промпт правильно напиши и пару примеров приложи).
Я сделал иначе по двум причинам.
Во-первых, я строю платформу, где ядро – UGC. То есть контент приносят не мы, а пользователи. И если я хочу, чтобы авторы вообще решились загружать колоды (а в перспективе ещё и продавать их), доверие должно быть заложено в архитектуру с самого начала. “Мы потом прикрутим модерацию и IP” звучит для авторов ровно так же, как “мы потом подумаем о безопасности ваших данных”.
Во-вторых, это не было “уймой времени”. Технический слой защиты я собрал довольно быстро, за считанные дни. Основное время проекта уходит как раз в “мирную” часть: удобство сессий, комнаты с методиками, редакторы, UX, стабильность, модерационный контур. Защита здесь – базовый инфраструктурный слой, который проще и дешевле сделать сразу, чем переделывать всю выдачу контента потом, когда появятся авторы и публичная библиотека.
Про “в эпоху ИИ всё можно нарисовать” согласен частично. Можно сделать похоже. Но ценность МАК-колоды обычно не в одной красивой картинке, а в подборке и логике: сюжеты, ритм, акценты, количество, порядок, иногда текстовые карты и структура. Даже “полностью AI-колода” часто делается не одним промптом, а десятками итераций и отбором. И да, такие колоды продаются, у них есть правообладатели, и претензии по IP – это не теория.
Так что я это воспринимаю не как “защиту от всего”, а как прагматичный шаг: убрать самый дешёвый сценарий “скачал статические файлы” и иметь процедуры/инструменты на случай жалоб. А параллельно – как раз набирать аудиторию и получать фидбек.
Делаем скриншоты с трёх аккаунтов, а затем попиксельно считаем среднее арифметическое.
Возможно, против такого водяные знаки лучше располагать со случайным смещением.
Без понимания, кто запрашивает контент, защищать его бессмысленно. Но у платформы есть особенность: она работает без регистрации. Человек открыл ссылку – и он уже в сессии. Нет аккаунтов, нет «подтвердите почту». Это принципиальное UX-решение, и ломать его ради безопасности не хотелось.
Мне одному кажется, что нас тут хотят обмануть: делают вид, что это общедоступное решение и прячут под этим видом отслеживание пользователей. Как по мне, это не "UX-решение", а этическое решение, причем весьма неэтичное. То, что автор сайта желает контролировать доступ к своему произведению - это вполне этично, но то, что он одновременно пытается делать вид, что оно доступно без условий, когда это не так - мягко говоря, не вполне.
Тут, кажется, смешались разные вещи. “Без регистрации” у нас означает “без аккаунта и подтверждений” – открыл ссылку и работаешь. При этом “в сессии” технически означает только то, что браузеру нужен временный идентификатор, чтобы сохранить состояние (что открыто, что перемещено и т.д.). Это не про слежку и не про попытку скрытно идентифицировать людей.
Ограничение доступа нужно по другой причине: авторы и контрибьюторы публикуют контент для использования внутри сервиса, но не хотят, чтобы его массово вытаскивали и использовали отдельно.
Можно посмотреть на это не как на “UX против безопасности”, а как на защиту чужой работы. Представьте, вы полгода делали создавали ценность - качественный альбом из сотни фотографий. Купили оборудование, оплатили обучение, потратили отпуск на съёмку, потом два месяца вечерами обрабатывали. Разместили работы на площадке, а их просто массово скачали и используют бесплатно, оформляют сайты, печатают постеры, а иногда ещё и продают от своего имени.
В такой ситуации вы бы хотели, чтобы у “уводящих” было так же просто, как нажать одну кнопку, или чтобы площадка хотя бы ставила базовые препятствия и могла блокировать тех, кто явно тащит материалы пачками? Речь именно об этом. Не про “скрытную слежку”, а про минимальные механизмы против массового уноса и злоупотреблений, при этом вход по ссылке остаётся без регистрации.
Если вам важно, я могу отдельно расписать, что у нас “сессия” это техническая штука для состояния и синхронизации, а не идентификация человека и не трекинг.
Я вам указываю, как ваш подход воспринимается со стороны других людей. А про ваши оправдания эти люди, скорее всего, просто не знают: вы же, наверное, не пишете (чтобы не убить UX) их везде на сайте крупным и ярким шрифтом?
Нужно ограничение доступа - ограничьте его другим, очевидным для людей способом. Я понимаю, что от этого может пострадать потенциал сайта как площадки для размещения рекламы (он ведь вам для этого нужен, не так ли) - но я также не считаю честным зарабоком и размещение рекламы тоже.
Спасибо, что описали, как это выглядит со стороны. Согласен, формулировка "кто запрашивает" может читаться двусмысленно. Я имел в виду не "кто вы как человек", а "какой браузер/устройство делает запрос", чтобы ограничивать массовый скрейпинг и реагировать на злоупотребления.
"Без регистрации" у нас буквально означает "без аккаунта, почты и логина". Открыл ссылку и работаешь, в том числе из инкогнито. Никаких скрытых условий доступа для обычного использования нет.
Ограничения направлены не на людей, а на автоматизированное массовое скачивание: rate limit, подпись запросов, тайлы вместо цельных файлов. Это как раз чтобы авторам было безопасно публиковать свои работы и чтобы их не уносили пачками.
Про рекламу вы неверно предположили. Мы не строим модель на рекламе. Монетизация планируется через подписку на дополнительные удобства и, возможно, комиссии с продаж авторских материалов.
Вы пишете "сделайте ограничение другим, очевидным способом". Можете уточнить, какой именно способ вы считаете честным и очевидным, если при этом сохранять вход по ссылке без аккаунтов?
UPD: поправил формулировки в статье, добавил явное пояснение про отсутствие идентификации личности и рекламного трекинга.
UPD: поправил формулировки в статье.
Так и примеры защищаемых изображений, для наглядности, добавить в статью не помешало бы, кмк.
Да, мысль хорошая. Примеры реально помогают “приземлить” тему. В этой статье я сознательно держал фокус на технической стороне и модели угроз, поэтому оставил минимум визуалок: одна карта на паре скриншотах в статье, чтобы было видно водяные знаки. Плюс в первом моем комментарии есть более "живые" скриншоты сессии и редактора колод. Но вы правы, для наглядности можно добавить отдельный блок "как это выглядит глазами пользователя" с несколькими примерами. Я, пожалуй, так и сделаю в апдейте.
Если вам важнее не техника защиты, а мотивация и продуктовая часть, я написал отдельный текст на VC, там это объяснено спокойнее и "по-человечески". Почему принципиально оставляем вход по ссылке без аккаунтов, почему начал с модерации и IP-защиты, и как вижу монетизацию без рекламы. Думаю, он лучше отвечает на ваш тезис про "как это воспринимается со стороны".
Как я строю онлайн-площадку для МАК-карт – и почему начал с модерации, а не фич
Человек защищает ворованые картинки, называя это картами. Кому очень нужно сделает снимок экрана телефоном, загонит в нейросеть. И через 30 минут у него будет своя копия колоды, причем оригинальная, но очень похожа на вашу.. а если сразу запустить рендер 3 подобных.. ну вы поняли, когда будет лучше..
Тут два разных тезиса в одном.
"Платформа защищает ворованые картинки". Нет, это ровно то, с чем мы боремся. Для UGC есть модерация, репорты и процедура notice-and-takedown: если правообладатель пишет, мы снимаем материал и разбираемся. Площадке невыгодно держать пиратку, потому что авторы просто уйдут и проект умрёт.
"Кому надо, сделает фото экрана и прогонит через нейросеть". Да, если человек очень мотивирован, он найдёт путь. Мы и не обещаем "невозможно украсть". Цель защиты другая: сделать массовый унос и автоматический скрейпинг дорогим и неудобным, чтобы отсечь бытовые сценарии "скачал пачкой за 5 минут и разослал".
Про "очень похожую копию": генерация “похожего” набора не означает, что это автоматически безопасно с точки зрения прав. Производные работы и существенное сходство часто всё равно остаются зоной риска, и это уже предмет разбирательств, а не лайфхак. Плюс на практике колода это 80–100 карт, и сделать качественный, целостный, уникальный набор с похожей художественной задачей требует много времени и средств. Для большинства “хочу быстро унести” это просто не окупается.
А если кто-то действительно сделает оригинальную колоду, со своими правами и своим стилем, отлично. Мы будем так же защищать и её, потому что задача платформы именно в том, чтобы авторам было безопасно публиковаться.
Ага, а можно было бы еще вместо картинок отображать видео с одним кадром, и загнать под DRM. И не придумывать такую сложную архитектуру
Идея с видео и DRM звучит проще, но у меня тут другой сценарий использования. На поле одновременно может быть несколько независимых картинок с разным зумом и положением – иногда до сотни, хотя чаще 5–10.
DRM в браузере нормально работает для медиапотока, а не для набора отдельных изображений, которыми пользователь свободно управляет. Если делать "каждую карту как видео" – это лишняя нагрузка на декодирование, память и GPU. Если делать одно общее видео – теряется сама интерактивность поля: независимое перемещение, масштабирование, слои и т.д.
Поэтому архитектура здесь не про "спрятать картинку любой ценой", а про то, чтобы усложнить массовый скрейпинг и при этом сохранить нормальный UX интерактивной доски. Ровно это я и пытался решить в статье.
Почему не зашифровать тайлы
То есть, водяные знаки вшиваются на клиенте, а тайлы передаются в открытом формате (jpg).
Я бы на месте хакера сделал просто: зарегистрировал в браузере свой прокси-сервер, тыкал просмотр карты в браузере - и вот они, запрошены 9 файликов кучкой, без ватермарков. Собрать мозаику - пустяковый скрипт.
Да, при перехвате трафика в своей авторизованной сессии тайлы можно собрать до watermarking – это реальное ограничение, и я его в статье не прячу. Но задача была не в абсолютной невыгружаемости, а в том, чтобы убрать тривиальное массовое скачивание по открытым URL и сделать атаку заметно дороже: авторизация устройства, подпись запросов, манифест, сборка тайлов, лимиты. Для моего кейса этого барьера уже достаточно.
В следующих итерациях это можно усложнять: разные схемы нарезки, сессионные манифесты с коротким TTL, перемешанный порядок тайлов, служебные "лишние" тайлы. В таком виде речь уже не про «скачал 9 jpg и склеил», а про поддержку полноценного кастомного сборщика под живую сессию.
Для моей задачи этого достаточно: не абсолютная неуязвимость, а резкое удорожание массового скрейпинга.
Увы. До тех пор, пока клиентский код можно посмотреть, усложнение алгоритмов не дает вообще ничего. Или воришка увидел любую защиту и в ужасе убежал, или он просто возьмет ваш код и повторит его в своём загрузчике, в котором вместо вывода на экран сохранение в файл.
Обфускация кода больше не помогает — ллм разбираются с такими штуками на ура.
С тезисом в целом согласен: если код исполняется на клиенте, мотивированный атакующий может воспроизвести пайплайн или встроиться в него своим загрузчиком. И да, на обфускацию как на серьёзный слой защиты я бы сегодня тоже не рассчитывал – особенно когда LLM сильно упростили разбор клиентского кода.
Но из этого, на мой взгляд, не следует, что усложнение не даёт вообще ничего. Оно не делает кражу невозможной, зато переводит её из режима "curl по предсказуемым URL за 30 секунд" в режим "нужно поддерживать свой клиент под живую сессию, регистрацию устройства, подписи, nonce, лимиты и сборку контента". Для массового скрейпинга это уже другая экономика атаки.
Поэтому я и не делаю ставку на "секретный JS". В статье как раз честно написано, что headless/browser automation остаются рабочим вектором, а цель – не абсолютная защита, а удорожание массового скачивания и атрибуция утечек. Всё, что реально держит оборону, находится не в обфускации, а в серверных проверках и ограничениях.
Отдельно ограничены регистрации новых устройств – по IP и по ASN
Привет бедным пользователям мобильных операторов, которых сажают по 20.000 рыл за один IP.
Да, CGNAT ломает любые наивные схемы по IP, тут без иллюзий. Поэтому IP/ASN сам по себе не должен быть критерием блокировки пользователя – это лишь дешёвый антиабьюз-сигнал на burst регистрации новых устройств.
Если с одного мобильного ASN приходит нормальный живой трафик – он проходит. Если начинается фабрика новых device_id, тогда уже включаются ограничения. А там, где CGNAT даёт слишком много ложных срабатываний, нужны не более жёсткие лимиты, а более умные механизмы поверх.


Скриншоты не победить, но скрейпинг можно удорожить: 4 слоя защиты изображений на UGC-платформе