Defaults.Exposed

Defaults.ExposedВиправлення › Content-Security-Policy (CSP)

Як виправити Content-Security-Policy (CSP)

Content Security Policy — це правило безпеки, яке ваш сайт передає браузеру кожного відвідувача, точно вказуючи, якому коду дозволено запускатися. Без нього, якщо на сторінку колись потрапить щось шкідливе — через поле коментаря, зламаний плагін або сторонній скрипт — браузер запустить це вільно, включно з кодом, що тихо зчитує номери карток і паролі ваших клієнтів прямо під час введення, тоді як замок все ще відображається.

Висновок для вашого бізнесу: Якщо ваш сайт колись буде підроблений, шкідливий код може читати платіжні картки і дані входу ваших клієнтів прямо з вашої каси, тоді як усе виглядає абсолютно нормально — залишаючи вас із поверненнями, претензіями щодо шахрайства, звітним витоком даних і збоєм перевірки, який служби безпеки великих клієнтів використовують для зупинки або знищення угоди.

Що це може вам коштувати

Чому це важливо. Замок підтверджує, що з'єднання з вашим сайтом є приватним, але нічого не робить для контролю того, який код запускається після того, як відвідувач на сторінці. Content Security Policy — це захист, який це робить: він каже браузерам ігнорувати будь-який скрипт, що не надійшов від джерела, якому ви довіряєте, тому єдине підроблене поле, реклама або плагін не може перетворитися на інструмент крадіжки грошей і даних ваших клієнтів. Це оцінюваний пункт у вашій картці результатів, вартий реальних балів, і одна з перших речей, яку шукає професійний огляд безпеки.

Що це таке — простими словами

Коли хтось відвідує ваш сайт, їхній браузер завантажує вашу сторінку і запускає будь-який код на ній — скрипти, що роблять випадне меню, кнопки, форми оплати тощо. За замовчуванням браузер довіряє всьому цьому. Він не має можливості знати, який код справді ваш, а який підкрався.

Content Security Policy (часто скорочено CSP) — це короткий список правил, що ваш сайт прикріплює до кожної сторінки, кажучи браузеру: «запускай лише код із цих джерел, які я схвалив, і відмовляй від всього іншого». Це різниця між нічним клубом, що пускає всіх, і тим, що має список гостей біля дверей.

Причина, чому це настільки важливо: сайти постійно підроблюються — не завжди через злом вашого сервера, а через задні двері, які більшість сайтів залишають відкритими: поле коментаря, поле пошуку, застарілий плагін, сторонній скрипт для реклами або аналітики, чи чат-віджет. Якщо зловмисник отримує навіть один рядок свого власного коду на одну з ваших сторінок, браузер запускає його так, ніби він ваш. Звідти він може читати все, що вводять ваші клієнти — номери карток, паролі, адреси — і тихо надсилати це деінде. Content Security Policy закриває цю двері, відмовляючись запускати щось від джерела, якого ви не схвалили.

Що це може коштувати вам

Атака, яку запобігає Content Security Policy — код, вставлений на сторінку, що краде дані з ваших власних клієнтів — стоїть за деякими найбільшими витоками карткових даних у записах. Ось як це зазвичай відбувається для звичайного бізнесу:

Що це насправді є (деталі)

Content Security Policy доставляється як один заголовок HTTP-відповіді — рядок, що ваш веб-сервер надсилає з кожною сторінкою. Його значення — набір директив, кожна з яких іменує тип контенту і дозволені для нього джерела. Наприклад:

Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self'

Простими словами: за замовчуванням завантажуй лише речі мого власного сайту; запускай лише скрипти мого власного сайту; не дозволяй старих плагінів; і не дозволяй іншим сайтам вбудовувати мій у фрейм.

Як виглядає «добре». Наша перевірка не просто шукає присутність заголовку — вона читає політику директиву за директивою і оцінює, наскільки вона насправді є сильною. Сильна політика:

Політика, що існує, але покладається на 'unsafe-inline', 'unsafe-eval' або шаблони, все одно матиме погану оцінку — бо на практиці забезпечує мало реального захисту.

Як це виправити (безкоштовно, ~1–2 години)

Передайте це вашому IT-фахівцю або тому, хто керує вашим сайтом — виправлення повністю безкоштовне. Ми беремо плату лише за моніторинг того, що воно залишається на місці і правильним з часом; ввімкнення нічого не коштує. Причина, чому це займає годину або дві, а не хвилини — це ретельний пробний крок, що запобігає випадковому блокуванню частин вашого власного сайту.

  1. Починайте в режимі лише звітування — не застосовуйте ще. Додайте заголовок відповіді Content-Security-Policy-Report-Only. Це спостерігає і реєструє, що буде заблоковано, не блокуючи нічого, тому живий сайт продовжує працювати, поки ви дізнаєтесь, від чого справді залежить кожна сторінка. (Важливо: лише звітування само по собі не дає відвідувачам жодного захисту — це лише безпечний перший крок.)

  2. Будуйте політику з того, що ваш сайт насправді використовує. Переглядайте звіти, щоб знайти кожне законне джерело скриптів, стилів, шрифтів і зображень — ваш власний домен, вашу аналітику, ваш платіжний провайдер, ваш хост шрифтів, ваш чат-віджет — і перераховуйте їх як дозволені джерела. Гарна відправна точка: default-src 'self' плюс явні записи для довірених третіх сторін, якими ви справді користуєтесь.

  3. Уникайте лазівок, що знищують весь сенс. Утримуйтесь від 'unsafe-inline' і 'unsafe-eval' для скриптів та уникайте джерел-шаблонів, як * і голі схеми, як https: для скриптів. Де вбудовані скрипти неминучі, використовуйте nonce або хеш, щоб запускався лише ваш конкретний схвалений код.

  4. Блокуйте фреймування і плагіни. Додайте frame-ancestors 'self' (це також зупиняє інші сайти від вбудовування вашого для обману ваших клієнтів) і object-src 'none'.

  5. Перемикайтеся з лише звітування на застосування. Щойно звіти чисті і сайт працює, змініть ім’я заголовка з Content-Security-Policy-Report-Only на Content-Security-Policy. Це крок, що насправді забезпечує захист — одна лише політика звітування не забезпечує, і не пройде перевірку.

    Де встановлювати заголовок залежить від вашої платформи:

    • Cloudflare: Rules → Transform Rules → Modify Response Header → встановіть Content-Security-Policy.
    • Nginx: add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';" always;
    • Apache: Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';"
    • IIS (web.config): додайте власний заголовок HTTP-відповіді з іменем Content-Security-Policy і політикою як значенням.
    • Google Workspace / Microsoft 365: вони запускають вашу пошту, а не ваш публічний сайт, тому політика встановлюється там, де ваш сайт фактично розміщений (Cloudflare або ваш веб-хост вище), а не в консолі адміністратора пошти.
  6. Повторно перевірте ваш домен, щоб підтвердити, що політика тепер показується як ввімкнена і застосовуюча, без ослаблюючих лазівок.

Поширені помилки

FAQ

Я не технічний фахівець — чи можу я впоратися з цим самостійно?

Вам не потрібно розуміти деталі. Це налаштування, що додається тим, хто керує вашим сайтом або хостингом, і в таких сервісах, як Cloudflare, воно здебільшого керується. Передайте розділ «Як це виправити» нижче. Це безкоштовно; одне застереження — слід запускати обережно у режимі тільки спостереження спочатку, щоб не заблокувати випадково частини вашого власного сайту — що саме охоплюють кроки нижче.

У мене вже є замок і SSL-сертифікат — хіба мій сайт не захищений?

Замок забезпечує доставку вашої сторінки; він не контролює, що запускається всередині неї. Якщо шкідливий код колись потрапляє на сторінку — через зламаний плагін, скомпрометовану рекламу або вставлене поле — замок не зупинить його від крадіжки даних. Content Security Policy — це шар, що обмежує, що дозволено запускатися в першу чергу. Вони захищають різні речі, і вам потрібні обидва.

Чи може ввімкнення цього зламати мій сайт?

Може, якщо вмикати агресивно всі відразу, бо воно може заблокувати законні скрипти, які ви насправді використовуєте. Саме тому стандартний підхід — починати в режимі «лише звітування», що спостерігає без блокування, виправляти все, що воно позначає, і лише потім застосовувати. Так це безпечно — і пробний крок вбудований у виправлення нижче.

Ми вже помістили в режим 'лише звіт' — чи ми захищені?

Ні, і це найпоширеніше хибне відчуття безпеки. Режим лише звітування спостерігає і реєструє, що було б заблоковане, але нічого не блокує — відвідувачі не отримують реального захисту. Це лише безпечний перший крок. Наша перевірка дає лише невелику частку балів для лише звітування і не буде записувати його як прохідне. Ви захищені лише після переходу до режиму застосування.

Чи впливає це на нашу оцінку, чи це лише рекомендаційно?

Це впливає на вашу оцінку. Перевірка Content Security Policy оцінюється і вартує до 25 балів у категорії Web Security. Відсутня або слабка політика позначається як висока серйозність і знижує вашу оцінку — і це саме те, про що запитує опитувальник безпеки клієнта.

Наш розробник додав політику, але оцінка все одно низька — чому?

Політика може існувати і все одно бути слабкою. Найпоширеніші винуватці — лазівки як 'unsafe-inline' і 'unsafe-eval' для скриптів або джерела-шаблони (голий *), які знову відкривають саму прогалину, яку покликана закрити політика. Наша перевірка читає політику директиву за директивою і знижує оцінку за ці слабкості — політика, що дозволяє все, оцінюється трохи краще, ніж її відсутність. Виправлення — посилити правила скриптів, використовуючи nonce або хеш замість цих лазівок.