Content Security Policy. Настроить и не пропустить редиректы

Автор Ametist, 22-10-2015, 17:30:59

« назад - далее »

AmetistTopic starter

С прошлого года идет волна уходов сайтов под фильтр Яндекса, который сам Яндекс объясняет так:

ЦитироватьНедавно в наши алгоритмы были внесены значительные изменения, и теперь с ограничениями могут ранжироваться сайты, обманывающие пользователей мобильного интернета. Иногда такие пользователи при переходе на сайты из результатов поиска не могут получить найденную для них информацию. Это происходит из-за того, что некоторые сайты не показывают таким пользователям тот контент, который был проиндексирован поисковым роботом. А часто просто перенаправляют посетителей на страницы с подпиской на платные контент-услуги.

При этом одни вебмастера прямо признают факт наличия на их сайтах такого редиректа, другие же наоборот отрицают.
Как выясняется: проблема может идти с двух сторон:
1. если вебмастер ставил на свой сайт коды тизерных рекламных сетей;
2. со стороны самих посетителей сайта, которые выходят в Интернет с зараженных браузеров. А в браузерах в свою очередь установлены не менее зараженные плагины, способные подменять легальную рекламу от Google Adsense, Директа, и открывать свои "левые" рекламные одностраничники.

Увидеть такие "левые" урлы можно в Метрике Яндекса -> Отчеты - > Внешние ссылки,
либо в данных Li.ru во внешних переходах. Как это выглядит — на скринах ниже.




Один мой сайт так же попал под такую "метлу" Яндекса, хотя на нем никогда не стояло никаких тизерных рекламных блоков.
Ответ был найдет довольно быстро. Это:
настройка на сайте Content Security Policy

Я не буду описывать подробно, что это такое, так как об этом достаточно информации в сети. Я лишь опишу свои действия. (возможно кому-то они пригодятся).

Приведу два варианта решения данной задачи. Я выбрала второй вариант. Итак, обо всем подробнее.

О самом подопечном сайте: он на движке Wordpress, поэтому искалась доступная реализация настройки CSP именно для данного движка. Вариантов оказалось два:

  • 1. добавление специального кода в .htaccess;
  • 2. добавление кода CSP в header.php темы сайта.

Я отказалась от добавления кода CSP в .htaccess, по причине того, что описано в теме на форуме серча:

   
ЦитироватьПравильнее всего заголовки выдавать движком сайта на PHP. Можно проверять UserAgent и:
    - не отдавать CSP "проблемным" браузерам
    - давать другую CSP для мобильных устройств
    - давать другой заголовок («X-WebKit-CSP» или «X-Content-Security-Policy»)

НО, для тех кто все же хочет воспользоваться именно .htaccess, даю можно сказать "универсальный" код.

Вариант первый:

В нем разрешена загрузка:

   

  • с самого домена
  • с счетчиков рамблера, ли.ру, майл.ру, статистика гугла и метрики, видео, виджеты социальных сетей (кроме одноклассников), кнопки шаринга.
  • там, где прописано yoursite.ru, вам нужно прописать свой домен.
  • ВНИМАНИЕ! на некоторых хостингах код, добавляемый в .htaccess, имеющий перенос по строкам, не читается и сам сайт выдает ошибку. (код, который я даю ниже имеет на конце строк переносы).
  • этот вариант тестовый (Content-Security-Policy-Report-Only), то есть ЕЩЕ НИЧЕГО НЕ БЛОКИРУЕТСЯ, он работает в тестовом режиме, и вы по консоли Хрома сможете увидеть, что блокируется нужное вашему сайту, и добавить в этот код.

Код:

[spoiler]

<ifModule mod_headers.c>
Header set Content-Security-Policy-Report-Only "\
default-src 'self' yoursite.ru *.yoursite.ru;\
connect-src 'self' yoursite.ru *.yoursite.ru *.google-analytics.com https://*.google-analytics.com google-analytics.com https://google-analytics.com youtube.com https://youtube.com ytimg.com https://ytimg.com *.yandex.ru https://*.yandex.ru *.youtube.com https://*.youtube.com *.ytimg.com https://*.ytimg.com;\
font-src 'self' yoursite.ru *.yoursite.ru *.googleapis.com https://*.googleapis.com *.gstatic.com https://*.gstatic.com;\
frame-src 'self' yoursite.ru *.yoursite.ru *.doubleclick.net https://*.doubleclick.net *.facebook.com https://*.facebook.com *.google.com https://*.google.com *.googleadservices.com https://*.googleadservices.com *.googlesyndication.com https://*.googlesyndication.com vk.com https://vk.com yastatic.net https://yastatic.net youtube.com https://youtube.com ytimg.com https://ytimg.com *.vk.com https://*.vk.com *.yandex.ru https://*.yandex.ru *.youtube-nocookie.com https://*.youtube-nocookie.com *.youtube.com https://*.youtube.com *.ytimg.com https://*.ytimg.com;\
img-src 'self' yoursite.ru *.yoursite.ru *.2mdn.net https://*.2mdn.net data: *.doubleclick.net https://*.doubleclick.net *.gemius.pl https://*.gemius.pl *.google-analytics.com https://*.google-analytics.com *.googleapis.com https://*.googleapis.com *.googlesyndication.com https://*.googlesyndication.com *.gravatar.com https://*.gravatar.com *.gstatic.com https://*.gstatic.com google-analytics.com https://google-analytics.com vk.com https://vk.com yandex.ru https://yandex.ru yastatic.net https://yastatic.net *.mail.ru https://*.mail.ru *.rambler.ru https://*.rambler.ru *.vk.com https://*.vk.com *.w.org https://*.w.org *.yadro.ru https://*.yadro.ru *.yandex.net https://*.yandex.net *.yandex.ru https://*.yandex.ru *.ytimg.com https://*.ytimg.com;\
object-src 'self' yoursite.ru *.yoursite.ru *.doubleclick.net https://*.doubleclick.net *.ggpht.com https://*.ggpht.com *.googlesyndication.com https://*.googlesyndication.com *.gstatic.com https://*.gstatic.com youtube.com https://youtube.com ytimg.com https://ytimg.com *.macromedia.com https://*.macromedia.com *.yandex.ru https://*.yandex.ru *.youtube.com https://*.youtube.com *.ytimg.com https://*.ytimg.com;\
script-src 'self' 'unsafe-eval' 'unsafe-inline' yoursite.ru *.yoursite.ru shareclods.com https://shareclods.com *.adobe.com https://*.adobe.com *.doubleclick.net https://*.doubleclick.net *.facebook.com https://*.facebook.com *.google-analytics.com https://*.google-analytics.com *.google.com https://*.google.com *.googlesyndication.com https://*.googlesyndication.com *.gstatic.com https://*.gstatic.com google-analytics.com https://google-analytics.com vk.com https://vk.com yandex.net https://yandex.net yandex.ru https://yandex.ru yandex.st https://yandex.st yastatic.net https://yastatic.net *.mail.ru https://*.mail.ru *.rambler.ru https://*.rambler.ru *.vk.com https://*.vk.com *.yadro.ru https://*.yadro.ru *.yandex.net https://*.yandex.net *.yandex.ru https://*.yandex.ru;\
style-src 'self' 'unsafe-inline' yoursite.ru *.yoursite.ru *.bootstrapcdn.com https://*.bootstrapcdn.com *.googleapis.com https://*.googleapis.com *.gstatic.com https://*.gstatic.com yastatic.net https://yastatic.net *.yandex.ru https://*.yandex.ru;\
"
</IfModule>
[/spoiler]

       
ЦитироватьGoogle и Яндекс не придерживаются SOP (Same Origin Policy) поэтому лучше продублировать все их домены с https: даже на http:-сайте.
        "Правильность" правил CSP можно оценить только по анализу CSP отчётов.
        Просадки дохода может и не быть, но может резаться что-то из скриптов юзабилити сайта, картинок или стилей.

  То есть вы добавили данный код в ваш .htaccess, сайт работает (значит перенос строк удалять не нужно), следующим шагом вам необходимо в течение суток или немного больше периодически просматривать данные в консоли.
Удобнее пользоваться консолью в браузере Хром: F12 или Дополнительные инструменты -> инструменты разработчика.
Загружаете ваш сайт, нажимаете F12 и внимательно читаете все предупреждения:



Переводите надпись: Refused to load the script '......' because it violates the following Content Security Policy directive: "script-src
здесь говорится, что скрипт заблoкировал такой-то урл согласно правилам, прописанным в CSP в директиве
"script-src

А этот самый урл — это например ваша партнерка от адмитада.
Тогда открываете свой код и в директиву "script-src добавляете вот этот самый заблoкированный домен, пользуясь примером из самого кода.

Допустим в консоли вы получили надпись:

    Refused to load the script 'http://какой-то-домен.ру' because it violates the following Content Security Policy directive: "script-src

А этот http://какой-то-домен.ру блoкировать не нужно, тогда в код в директиву script-src добавляете нужное условие. Например:

какой-то-домен.ru https://какой-то-домен.ru *.какой-то-домен.ru https://*.какой-то-домен.ru


между каждой записью пробел.

После тестового периода вам необходимо изменить
<ifModule mod_headers.c>
Header set Content-Security-Policy-Report-Only

на

<ifModule mod_headers.c>
Header set Content-Security-Policy


Второй вариант:

Я выбрала данный способ добавления кода в header.php темы сайта.
Но, есть несколько условий правильного добавления:

1. код прописывается до
<!doctype html>
<html>
<head>


2. код обрамляете в
<?php
тут сам код
?>


А так же каждый отдельный цикл прописываете с точкой и обрамляете двoйными кавычками вначале и закрываете цикл в конце:

<?php
header 
("Content-Security-Policy-Report-Only: "
."default-src тут домены домены домены;"
."connect-src тут домены домены домены;"
);
?>


Полный вариант кода для добавления в header.php (для тестовой установки Content-Security-Policy-Report-Only:

[spoiler] <?php
header
("Content-Security-Policy-Report-Only: "
."default-src 'self' yoursite.ru *.yoursite.ru *.shareclods.com https://*.shareclods.com;"
."connect-src 'self' yoursite.ru *.yoursite.ru *.google-analytics.com https://*.google-analytics.com google-analytics.com https://google-analytics.com youtube.com https://youtube.com ytimg.com https://ytimg.com mc.yandex.ru http://*.mc.yandex.ru https://*.mc.yandex.ru *.yandex.ru https://*.yandex.ru *.youtube.com https://*.youtube.com *.ytimg.com https://*.ytimg.com;"
."font-src 'self' yoursite.ru *.yoursite.ru *.bootstrapcdn.com https://*.bootstrapcdn.com *.googleapis.com https://*.googleapis.com *.gstatic.com https://*.gstatic.com;"
."frame-src 'self' yoursite.ru *.yoursite.ru *.doubleclick.net https://*.doubleclick.net *.facebook.com https://*.facebook.com *.facebook.net https://*.facebook.net *.google.com https://*.google.com *.googleadservices.com https://*.googleadservices.com *.googlesyndication.com https://*.googlesyndication.com vk.com https://vk.com yastatic.net https://yastatic.net youtube.com https://youtube.com ytimg.com https://ytimg.com *.vk.com https://*.vk.com *.yandex.ru https://*.yandex.ru *.youtube-nocookie.com https://*.youtube-nocookie.com *.youtube.com https://*.youtube.com *.ytimg.com https://*.ytimg.com;"
."img-src 'self' yoursite.ru *.yoursite.ru *.2mdn.net https://*.2mdn.net data: *.doubleclick.net https://*.doubleclick.net *.facebook.com https://*.facebook.com *.gemius.pl https://*.gemius.pl *.google-analytics.com https://*.google-analytics.com *.googleapis.com https://*.googleapis.com *.googlesyndication.com https://*.googlesyndication.com *.gravatar.com https://*.gravatar.com *.gstatic.com https://*.gstatic.com google-analytics.com https://google-analytics.com vk.com https://vk.com yandex.ru https://yandex.ru yastatic.net https://yastatic.net *.mail.ru https://*.mail.ru *.rambler.ru https://*.rambler.ru *.vk.com https://*.vk.com *.w.org https://*.w.org *.yadro.ru https://*.yadro.ru *.yandex.net https://*.yandex.net *.yandex.ru https://*.yandex.ru *.ytimg.com https://*.ytimg.com;"
."object-src 'self' yoursite.ru *.yoursite.ru *.doubleclick.net https://*.doubleclick.net *.ggpht.com https://*.ggpht.com *.googlesyndication.com https://*.googlesyndication.com *.gstatic.com https://*.gstatic.com youtube.com https://youtube.com ytimg.com https://ytimg.com *.macromedia.com https://*.macromedia.com *.yandex.ru https://*.yandex.ru *.youtube.com https://*.youtube.com *.ytimg.com https://*.ytimg.com;"
."script-src 'self' 'unsafe-eval' 'unsafe-inline' yoursite.ru *.yoursite.ru *.shareclods.com https://*.shareclods.com shareclods.com https://shareclods.com *.adobe.com https://*.adobe.com *.doubleclick.net https://*.doubleclick.net *.facebook.com https://*.facebook.com *.facebook.net https://*.facebook.net *.google-analytics.com https://*.google-analytics.com *.google.com https://*.google.com *.googlesyndication.com https://*.googlesyndication.com *.gstatic.com https://*.gstatic.com google-analytics.com https://google-analytics.com vk.com https://vk.com yandex.net https://yandex.net yandex.ru https://yandex.ru yandex.st https://yandex.st yastatic.net https://yastatic.net *.mail.ru https://*.mail.ru *.rambler.ru https://*.rambler.ru *.vk.com https://*.vk.com *.yadro.ru https://*.yadro.ru *.yandex.net https://*.yandex.net *.yandex.ru https://*.yandex.ru;"
."style-src 'self' 'unsafe-inline' yoursite.ru *.yoursite.ru *.bootstrapcdn.com https://*.bootstrapcdn.com *.googleapis.com https://*.googleapis.com *.gstatic.com https://*.gstatic.com yastatic.net https://yastatic.net *.yandex.ru https://*.yandex.ru;"
);
?>
[/spoiler]

3. После того, как верно вставите код, проверьте через http://www.rexswain.com/httpview.html, что сайт отдаёт заголовки и хостер их не режет.

4. Смотрите, что еще из нужного будет показано в консоли, но отмеченного как вредоносный и не содержащийся в вашей директиве.
Добавляете в код.

5. После тестирования меняете заголовок с
Код:

<?php
header 
("Content-Security-Policy-Report-Only: "


на

<?php
header 
("Content-Security-Policy: "



6. Чтобы в одном месте видеть в удобном формате тех, кто пытался прорваться сквозь защиту, можете зарегистрироваться тут: https://report-uri.io/ (это бесплатный сервис, на который будут отправляться данные обо всех заблoкированных урлах).

Если ничего нужного CSP блoкировать не будет - report-uri потом уберёте.

В аккаунте во вкладке Setup есть url вида https://report-uri.io/report/6ryujh.....74hj (это для примера). Его прописываете в директиву report-uri, добавив в конец  кода CSP еще одну строку.
Внимание! Ссылку для report-uri возьмите со своего аккаунта и пропишите:
Код:

[spoiler]<?php
header 
("Content-Security-Policy-Report-Only: "
."default-src тут домены домены домены;"
."connect-src тут домены домены домены;"

."report-uri https://report-uri.io/report/6ryujh.....74hj;"
);
?>
[/spoiler]

Отслеживать в личном кабинете сайта CSP - > Reports и еще 4 варианта отслеживания. Отчеты вот в таком формате:




P.S. Сразу отмечу, что я не являюсь профессиональным программистом, то есть полноценную помощь по настройке вам могут оказать, хорошо разбирающиеся в данной теме программисты.
Я привожу свой опыт, который мог бы пригодиться тем, кто далек от программирования. :)