Безпека й Content Security Policy
Які записи CSP потрібні віджету, чому він працює без вбудованого скрипту й unsafe-inline, як ізольований від сторінки та які секрети ніколи не мають бути в браузері.
Content Security Policy
Віджет не завантажує сторонніх шрифтів чи пікселів відстеження й не виконує eval. Стилі задаються через constructable stylesheets (adoptedStyleSheets) у shadow DOM; на них style-src не поширюється. Тому не потрібні ані unsafe-inline, ані unsafe-eval.
З адресами reactive.chat:
Content-Security-Policy:
script-src 'self' https://cdn.reactive.chat;
connect-src 'self' wss://ws.reactive.chat https://ws.reactive.chat;
img-src 'self' data: https:;
Із власним доменом:
Content-Security-Policy:
script-src 'self' https://chat.your-company.com;
connect-src 'self' wss://chat.your-company.com https://chat.your-company.com;
img-src 'self' data: https:;
Окремі записи:
- script-src — розташування
loader.js. Ядро (core.<hash>.js) та пізніші модулі (тури, текст конфіденційності, магазин) теж звідти. - connect-src з wss:// — з’єднання чату.
- connect-src з https:// — та сама адреса знову: через неї працюють резервний канал HTTP, офлайн-форма, завантаження файлів, текст конфіденційності та Smart Answer. Без запису це помітно лише в мережах без WebSocket, де з’єднання взагалі не встановлюється.
- img-src — зображення чату: логотип і аватари (ваші адреси з
https://або зображенняdata:), зображення промокартки й перегляди вкладень (з адреси чату). Якщо звужуєтеimg-src, включіть щонайменше адресу чату й хости логотипа та картки. Заблоковане зображення віджет показує як рядок файлу замість перегляду.
Старіші браузери без constructable stylesheets (як Safari до 16.4) використовують елемент <style>, який сувора style-src блокує. Віджет там працює, але без стилів.
Вбудований скрипт не потрібний
Встановлення складається лише з <script src> з атрибутами. Власні виклики (identify, track, open) мають бути у власних файлах або вбудованому скрипті з nonce:
<script nonce="R4nd0mN0nc3">
ReactiveChat('identify', { userId: '4711', userHash: '…', exp: 1792503600 });
</script>
Шаблон без вбудованого скрипту — Ідентифікація відвідувачів.
Subresource Integrity
loader.js не має номера версії в назві й постійно оновлюється; атрибут integrity зупинив би чат після наступного оновлення. Ядро завантажується з хешем вмісту в назві (Архітектура). Якщо політика потребує SRI, надавайте loader.js самі й задайте data-rc-ws-url (Швидкий старт), але й оновлювати тоді вам.
Ізоляція від сторінки
- Закритий shadow DOM. Ваші стилі не досягають віджета, його стилі — сторінки, навіть за глобальних скидань.
- Без cookie. Віджет не задає cookie; ID у сховищі браузера, без згоди лише в
sessionStorage(Інтеграція конфіденційності). - Без доступу до полів форм. Читання тексту для асистента ніколи не читає полів і взагалі не працює на сторінках облікового запису, оформлення замовлення й кошика. Додаткові області виключаються через
data-rc-private. - Персональні дані маскуються двічі: у браузері до надсилання (номери карток із перевіркою Луна, IBAN, пошта, телефон, податкові номери) й на сервері до збереження. Чутливі параметри запиту (
email,password,token,key,card…) видаляються з переданих адрес. - Посилання й зображення з повідомлень і карток обмежені
https://; посиланняjavascript:іdata:відкидаються.
Перевірка джерела
З’єднання чату приймається лише з доменів проєкту в Дозволених джерелах (піддомени включено). Стороння сторінка, що копіює ключ сайту, отримує origin_denied. Порожній список означає відсутність перевірки — завжди додавайте домени. Подробиці — Транспорт.
Сам ключ сайту не секрет; він є у вихідному коді кожної сторінки.
Чому ніколи не місце в браузері
- секрету ідентифікації (для
userHash) — Ідентифікація - секрету кінцевої точки даних клієнтів
rckd_…— Дані клієнтів - секрету підпису вебхука — Вебхуки
- ключам API
rc_live_…— Серверний API - ключу проксі
rcpx_…— Власний домен
Також не в застосунку, публічному репозиторії чи адресі сторінки.
Захист від зловживань
Сервер обмежує з’єднання, кадри й повідомлення на з’єднання та адресу й блокує повторні порушення (закриття 1008). За власним проксі він рахує за адресою відвідувача лише з правильним ключем проксі, інакше всі ділять адресу проксі. Значення — Ліміти й квоти.
Далі: Власний домен
Оновлено: