
Комментарии 36
Хоть бы одну картинку показали, ради чего такой огород?
Это психологи... Люшер цвета например защищал... "Оригинальный тест Люшера с уникальной цветовой гаммой". Вот и тут будут доказывать, что скачанные картинки безблагодатны ;)
"Оригинальный тест Люшера с уникальной цветовой гаммой". Вот и тут будут доказывать, что скачанные картинки безблагодатны ;)
Ой, напомнили незабвенный лохотрон экспресс-метод изучения английского языка Илоны Давыдовой, в рекламе которого постоянно педалировалось, что оригинальные аудиокассеты содержат специальные звуковые метки, которые не копируются при перезаписи и поэтому неоригинальные кассеты не работают.
Как говорится - эту бы энергию, да в мирных бы целях!... Ладно еще столько сил класть на защиту изображений до того как появились нейросетки - но сейчас?!. Делается скриншот, специально обученной модели говорится нарисовать похоже - и вот у вас в руках то же самое без водяных знаков и в высоком разрешении..
Я уж не говорю, что 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 карт, и сделать качественный, целостный, уникальный набор с похожей художественной задачей требует много времени и средств. Для большинства “хочу быстро унести” это просто не окупается.
А если кто-то действительно сделает оригинальную колоду, со своими правами и своим стилем, отлично. Мы будем так же защищать и её, потому что задача платформы именно в том, чтобы авторам было безопасно публиковаться.


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