Главная/Блог/Виджет запер от подмены
Дневник запуска · инженерная заметка

Мой виджет живёт на чужих сайтах. Сегодня запер его так, что тихо подменить не выйдет

15 июля 2026 Евгений Игнатьев Чтение ~5 мин
Виджет ИИ-помощника заперт от подмены проверкой целостности

Когда я ставлю ИИ-помощника на сайт клиента, физически это одна строчка на его странице, которая подгружает мой скрипт с моего сервера. Кнопка, окно чата, вся логика — всё приезжает от меня. Удобно: захотел обновить помощника у всех сразу — поменял файл у себя, обновилось везде.

И вот в этом «везде» я сегодня увидел проблему, от которой стало неуютно.

Что меня напрягло

Раз мой скрипт грузится с моего сервера и выполняется на сайте клиента — значит, кто контролирует мой сервер, тот выполняет код на сайтах всех моих клиентов.

Представь: кто-то ломает мой сервер и подменяет файл-загрузчик. Не роняет мой сайт — а тихо подсовывает свой код. Такой код мог бы собирать данные тех, кто оставляет заявку. Подменить телефон в контактах. Увести человека на фишинг. А владелец сайта и не узнал бы — «это же виджет от студии, он всегда так грузился».

Это supply-chain — атака не на тебя напрямую, а через того, кому ты доверяешь. Большинство виджетов так и работают: страница исполняет всё, что пришло с сервера, не глядя. Тот ли это код — никто не проверяет.

Что я сделал

Добавил к загрузчику браузерную проверку целостности. Посчитал «отпечаток» файла — хэш (SHA-384), уникальный для его содержимого. Одна изменённая буква — отпечаток другой. И прописал этот отпечаток прямо на сайте клиента: «загрузи мой скрипт, но выполни, только если отпечаток совпал».

Если подменят именно этот файл на моём сервере — браузер клиента увидит несовпадение и просто не запустит его. Виджет в худшем случае не появится. Но чужой код вместо него не выполнится.

Это как контрольная пломба: клиент заранее знает, как выглядит разрешённая версия. Содержимое изменилось — пломба не сходится — браузер лучше вообще не покажет виджет, чем тихо запустит неизвестное.

Если интересно термином — это Subresource Integrity: атрибуты integrity и crossorigin у тега скрипта. Стандарт браузеров, бесплатный, но на виджетах его почти никто не ставит. Для кросс-доменной проверки сервер ещё должен разрешать CORS — у меня разрешён.

Где это НЕ помогает — честно

Чтобы не продавать волшебную таблетку. Проверка запирает один конкретный участок: мой скрипт на пути от моего сервера к браузеру. Она не защищает сам сайт клиента — его страницы, его сервер, его почту. Если злоумышленник может править саму страницу клиента, SRI ему не помеха на этом фронте.

Это не защита от взлома вообще, а барьер на одном звене цепочки. Но это именно то звено, за которое отвечаю я, — и его я закрыл.

Чем за это плачу

Неизменяемостью. Раньше поправил загрузчик у себя — обновилось у всех само. Теперь так нельзя: поменял файл — отпечаток не сошёлся — виджет пропал у всех. Чтобы обновить, надо выпустить новую версию под новым отпечатком (у меня сейчас v1) и заново прописать её на страницах.

Звучит как минус, но по факту плюс. Загрузчик меняется раз в сто лет — живая логика помощника в других местах. Зато ни одна правка, случайная или злонамеренная, не уедет клиентам молча.

Зачем я вообще этим занялся

Потому что сайт клиента для меня — прод, а не песочница. На нём реальные посетители оставляют реальные контакты. Разница между «студия поставила виджет» и «студия поставила виджет и подумала, что будет, если её саму взломают» — это ровно та разница, за которую в итоге платят.

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

И вывод, который годится не только для меня. Если на твоём сайте стоит любой сторонний скрипт — чат, аналитика, виджет — спроси не только «что он делает», но и «как я узнаю, что его не подменили». Хорошая студия ответит на оба вопроса.

Дневник запуска студии — без редполитики. Я делаю ИИ-агентов один, в формате «сам собрал — сам пишу как это работает». Подписывайтесь на @pervyyii в Telegram, если хочется смотреть на маленькую студию изнутри.

Хотите ИИ-помощника, сделанного с головой?

Сделали бесплатный ИИ-разбор сайта — за полминуты находит 5 конкретных причин, по которым вы можете терять заявки. С цитатами прямо со страницы, без общих фраз.

Разобрать мой сайт Посмотреть студию