Разработка · 6 мин чтения

Интеграция скрипта на сайт: чек-лист безопасного подключения

За последний год у меня в очереди было штук пятнадцать задач именно на интеграцию скрипта: то пиксель Яндекс.Метрики, то виджет чата, то код эквайринга T‑Bank в WooCommerce. В половине случаев клиент уже пытался вставить код сам по инструкции от подрядчика - и либо сайт переставал открываться, либо форма оплаты ломалась, либо, самый неприятный вариант, скрипт тихо тянул данные с левого домена, о котором никто не подозревал. Собрал чек-лист, которым реально пользуюсь, когда сажусь подключать очередной сторонний код на сайт.

Что ломается при подключении стороннего скрипта

Код, который прислал подрядчик или который вы скопировали с сайта сервиса, почти никогда не рассчитан именно на вашу верстку и ваш стек. Из практики - три сценария, которые ловлю чаще всего:

  • document.write внутри скрипта. Старый способ подключения, который до сих пор встречается в виджетах статистики и партнерских счетчиках. Если такой код вставить асинхронно, браузер может очистить страницу уже после её полной загрузки - сайт становится белым.
  • Конфликт версий библиотек. Виджет доставки тянет свою версию jQuery, тема WordPress - свою. Когда обе версии загружаются на одной странице, ломаются обработчики на кнопках или перестаёт листаться слайдер.
  • Смешанный контент. Скрипт подключается по http, а сайт работает на https - браузер молча блокирует загрузку, и в консоли тишина, пока не откроешь вкладку Network.

Отдельно скажу про Tilda-скрипты: там код часто вставляют через html-блок или T123, и если внутри есть проверка на дублирование, которую забыли - скрипт подключается дважды при копировании блока на другую страницу, и в аналитике получаются задвоенные события.

Чек-лист перед тем, как вставлять код

Прежде чем тащить скрипт в проект, прохожу по пяти пунктам:

  1. Смотрю, с каких доменов скрипт реально грузит ресурсы - открываю вкладку Network и ищу все запросы, а не только основной файл.
  2. Проверяю, зафиксирована ли версия. Если в src указано что-то вроде widget.min.js без версии в пути, подрядчик может обновить файл на своей стороне в любой момент, и поведение на проде изменится без вашего участия.
  3. Смотрю, куда уходят данные из формы. Для эквайринга и виджетов доставки это критично - T‑Bank и СДЭК обрабатывают персональные данные, и если скрипт устаревший или подменённый, форма может отправлять информацию не туда, куда рассчитывал клиент.
  4. Проверяю условия использования, особенно если скрипт бесплатный и лежит на чужом CDN - часто там прописано, что сервис может добавить рекламу или собственный трекинг без предупреждения.
  5. Смотрю, требует ли скрипт согласия на cookie - если да, подключаю его после клика на баннере согласия, а не сразу при загрузке страницы.

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

Куда вставлять: head, конец body или диспетчер тегов

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

Способ Когда использую Риски
В <head> синхронно Скрипт обязателен до первой отрисовки - антифрод, детект бота Блокирует рендеринг, страница «белеет», пока скрипт не загрузится
Перед </body> Виджеты чата, счетчики аналитики, большинство сторонних скриптов Событие может сработать позже, чем ждёт пользователь
Через диспетчер тегов (GTM) Когда скриптов много и они часто меняются - маркетолог сам добавляет теги Лишний уровень абстракции, дольше грузится сам GTM
Через вебхук на бэкенде (например, n8n) Скрипт должен реагировать на серверное событие, а не на действие в браузере Нужна очередь и обработка ошибок на сервере

Уведомление в Telegram при новом заказе в последних проектах я вообще вывожу за пределы фронтенда - вебхук WooCommerce дёргает сценарий в n8n, а тот уже стучится в aiogram-бота. На странице не остаётся лишнего JS, и даже если этот кусок сломается, оформление заказа не пострадает.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Безопасность подключения: CSP, SRI и чужие домены

Два инструмента, которые снимают большую часть рисков от стороннего кода - Subresource Integrity и Content-Security-Policy.

SRI фиксирует хэш файла: если вендор изменит содержимое скрипта на своём CDN (сам, по ошибке или после взлома), браузер сравнит хэш и откажется его выполнять.

<script
  src="https://cdn.example.com/widget.min.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
  crossorigin="anonymous"
  defer></script>

CSP работает по-другому: вы явно перечисляете домены, с которых сайту разрешено грузить и выполнять скрипты. Если кто-то подсунет посторонний тег через уязвимую форму или взломанный плагин, браузер просто не выполнит код с домена, которого нет в списке.

add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://mc.yandex.ru https://widget.cdek.ru;" always;

Для встроенных виджетов через iframe (форма СДЭК, календарь записи, чат) добавляю атрибут sandbox с минимальным набором прав вместо того, чтобы давать iframe полный доступ к родительской странице - этого почти всегда достаточно, чтобы виджет продолжал работать, но не мог, например, читать cookie основного сайта.

Тестирование после интеграции: что проверять на реальных кейсах

  • T‑Bank/WooCommerce. Сначала прогоняю оплату в тестовом режиме на тестовых картах и только потом переключаю ключи на боевые. Отдельно проверяю подпись вебхука об оплате - без неё любой скрипт может подделать запрос об успешном платеже.
  • СДЭК. После установки виджета расчёта доставки проверяю крайние случаи - Калининград, Дальний Восток, доставку до постамата - и смотрю, не ломает ли виджет оформление заказа на мобильных экранах.
  • Tilda-скрипты. Проверяю не только в редакторе, а на опубликованной странице и именно на мобильном зероблоке - там часто ведёт себя иначе, чем в десктопном превью. Замеряю скорость через Lighthouse до и после подключения.
  • aiogram-бот на вебхуке. Проверяю, что SSL-сертификат валиден и бот отвечает Telegram в течение нескольких секунд - иначе Telegram решит, что запрос не дошёл, повторит его, и сообщение придёт пользователю дважды.
  • Автоматизация в n8n. Проверяю идемпотентность: если вебхук из-за сетевого сбоя сработает повторно, сценарий не должен создавать второй заказ или отправлять письмо дважды.

Из всего списка чаще всего простреливает именно тестирование в боевом режиме - скрипт, который прекрасно работал на тестовом домене, начинает вести себя иначе, стоит переключить платёжный шлюз на прод или сменить поддомен на основной.

Чтобы сайт работал без сбоев

Техподдержка

от 15 000 ₽/мес

Подробнее →

Частые вопросы

Сколько стоит интеграция скрипта на сайт?

Зависит от сложности. Простая доработка на Tilda - правка уже существующего кода, добавление счётчика или пикселя - от 3 000 ₽. Комплексная интеграция с оплатой, CRM или СДЭК, где нужно связать несколько сервисов и проверить обработку вебхуков, - от 40 000 ₽. Если требуется ещё и серверная автоматизация вокруг скрипта, например сценарий в n8n, это считаю отдельно, от 25 000 ₽.

Можно ли подключить скрипт самому, без разработчика?

Счётчик аналитики или простой виджет чата через GTM - да, инструкции вендоров обычно рассчитаны именно на самостоятельную установку. А вот код, который трогает оплату, персональные данные или интеграцию с CRM, лучше отдавать тому, кто проверит домены и подпишет вебхуки - цена ошибки там не в сломанной кнопке, а в утечке данных клиентов.

Как понять, что скрипту можно доверять?

Открываю вкладку Network и смотрю, с каких доменов реально идут запросы - не только с того, что указан в src. Проверяю, зафиксирована ли версия файла, есть ли смысл добавить integrity-хэш, и не требует ли скрипт прав больше, чем нужно для его задачи. Если вижу запросы на неизвестные домены или обфусцированный код без исходников - не подключаю, ищу альтернативу.

Что делать, если после подключения скрипта сайт стал медленнее?

Сначала проверяю, есть ли на теге script атрибут async или defer - синхронная загрузка в head чаще всего и есть причина. Дальше смотрю через Lighthouse, какой конкретно скрипт больше всего тормозит отрисовку, и переношу необязательные виджеты в GTM с отложенной загрузкой по событию скролла или клика, а не по загрузке страницы.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно