Я получаю кучу ошибок в консоли разработчика:
Отказался оценить строку
Отказался выполнять встроенный скрипт, поскольку он нарушает следующую директиву Content Security Policy
Отказался от загрузки скрипта
Отказался от загрузки таблицы стилей
О чем это все? Как работает Политика безопасности контента? Как мне использовать Content-Security-Policy
заголовок HTTP?
В частности, как ...
- ... разрешить несколько источников?
- ... использовать разные директивы?
- ... использовать несколько директив?
- ... обрабатывать порты?
- ... обрабатывать разные протоколы?
- ... разрешить
file://
протокол? - ... использовать встроенные стили, сценарии и теги
<style>
и<script>
? - ... разрешить
eval()
?
И наконец:
- Что именно
'self'
значит?
Ответы:
Content-Security-Policy
Мета-тег позволяет уменьшить риск XSS атак, позволяя определить , где ресурсы могут быть загружены из, предотвращая браузеры от загрузки данных из любых других мест. Это мешает злоумышленнику внедрить вредоносный код на ваш сайт.Я ударился головой о кирпичную стену, пытаясь понять, почему я получаю ошибки CSP одна за другой, и, похоже, нет четких и четких инструкций о том, как это работает. Итак, вот моя попытка объяснить некоторые кратко моменты CSP, в основном концентрируясь на вещах, которые мне было трудно решить.
Для краткости я не буду писать полный тег в каждом образце. Вместо этого я покажу только
content
свойство, поэтому пример, который говорит,content="default-src 'self'"
означает следующее:1. Как разрешить несколько источников?
Вы можете просто перечислить ваши источники после директивы в виде списка, разделенного пробелами:
Обратите внимание, что нет никаких кавычек вокруг параметров, кроме специальных , например
'self'
. Кроме того, нет двоеточия (:
после директивы ). Просто директива, затем разделенный пробелами список параметров.Все ниже указанных параметров неявно разрешено. Это означает, что в приведенном выше примере это будут действительные источники:
Это, однако, не будет действительным:
2. Как использовать разные директивы, что они делают каждый?
Наиболее распространенные директивы:
default-src
политика по умолчанию для загрузки JavaScript, изображений, CSS, шрифтов, запросов AJAX и т. д.script-src
определяет действительные источники для файлов JavaScriptstyle-src
определяет действительные источники для CSS-файловimg-src
определяет действительные источники для изображенийconnect-src
определяет допустимые цели для XMLHttpRequest (AJAX), WebSockets или EventSource. Если предпринята попытка подключения к узлу, который здесь не разрешен, браузер выдаст400
ошибкуЕсть и другие, но это те, которые вам, скорее всего, понадобятся.
3. Как использовать несколько директив?
Вы определяете все свои директивы внутри одного мета-тега, заканчивая их точкой с запятой (
;
):4. Как обрабатывать порты?
Все, кроме портов по умолчанию, необходимо явно разрешить, добавив номер порта или звездочку после разрешенного домена:
Вышеуказанное приведет к:
Как я уже упоминал, вы также можете использовать звездочку, чтобы явно разрешить все порты:
5. Как обрабатывать разные протоколы?
По умолчанию разрешены только стандартные протоколы. Например, чтобы разрешить WebSockets,
ws://
вы должны разрешить это явно:6. Как разрешить файловый протокол
file://
?Если вы попытаетесь определить его как таковой, он не будет работать. Вместо этого вы позволите это с
filesystem
параметром:7. Как использовать встроенные скрипты и определения стилей?
Если явно не разрешено, вы не можете использовать определения встроенного стиля, код внутри
<script>
тегов или в свойствах тегов, какonclick
. Вы позволяете им так:Вам также необходимо явно разрешить встроенные изображения в кодировке base64:
8. Как разрешить
eval()
?Я уверен, что многие скажут, что вы этого не сделаете, поскольку «eval is evil» и наиболее вероятная причина наступающего конца света. Эти люди будут неправы. Конечно, вы можете определенно пробить основные дыры в безопасности вашего сайта с помощью eval, но он имеет вполне допустимые варианты использования. Вы просто должны быть умны в использовании. Вы позволяете это так:
9. Что именно
'self'
означает?Вы могли бы взять
'self'
в виду localhost, локальную файловую систему или что-то на одном хосте. Это не значит, что-либо из этого. Это означает источники, которые имеют ту же схему (протокол), тот же хост и тот же порт, что и файл, в котором определена политика контента. Обслуживание вашего сайта по HTTP? Никаких https для вас тогда, если вы не определите это явно.Я использовал
'self'
в большинстве примеров, поскольку обычно имеет смысл включать его, но это ни в коем случае не обязательно. Оставьте это, если вам это не нужно.Но подожди минутку! Разве я не могу просто использовать
content="default-src *"
и покончить с этим?Нет. В дополнение к очевидным уязвимостям безопасности это также не будет работать так, как вы ожидаете. Хотя некоторые документы утверждают, что это разрешает все, это не так. Он не позволяет вставлять или убивать, поэтому, чтобы действительно сделать ваш сайт более уязвимым, вы должны использовать это:
... но я верю, что ты не будешь.
Дальнейшее чтение:
http://content-security-policy.com
http://en.wikipedia.org/wiki/Content_Security_Policy
источник
default-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'; img-src * data: 'unsafe-inline'; connect-src * 'unsafe-inline'; frame-src *;
content="default-src * 'unsafe-inline' 'unsafe-eval'"
необходимо для работы некоторых приложений Angular.connect-src
путей и путей: конечные косые черты обязательны, если вы хотите включить целый подпуть. Например: файлhttp://foo.com/files/bar.txt
будет заблокирован, если источник естьhttp://foo.com/files
, но обслуживается, когда онhttp://foo.com/files/
APACHE2 MOD_HEADERS
Вы также можете включить Apache2 mod_headers, в Fedora он уже включен по умолчанию, если вы используете Ubuntu / Debian, включите его так:
В Ubuntu / Debian вы можете настроить заголовки в файле
/etc/apache2/conf-enabled/security.conf
Примечание. Это нижняя часть файла, только последние 3 записи являются настройками CSP.
Первый параметр - это директива, второй - источники из белого списка. Я добавил аналитику Google и рекламный сервер, который у вас может быть. Кроме того, я обнаружил, что если у вас есть псевдонимы, например, www.example.com и example.com, настроенные в Apache2, вы должны также добавить их в белый список.
Встроенный код считается вредным, его следует избегать. Скопируйте все javascripts и css в отдельные файлы и добавьте их в белый список.
Пока вы это делаете, вы можете взглянуть на другие настройки заголовка и установить mod_security.
Дальнейшее чтение:
https://developers.google.com/web/fundamentals/security/csp/
https://www.w3.org/TR/CSP/
источник
Не забывайте о font-src, он работает так же, как и любой другой, но если вы используете шрифты, загруженные из других источников - обязательно добавьте его в метатег
источник