Как работает политика безопасности контента?
Я получаю кучу ошибок в консоли разработчика:
отказался оценивать строку
отказано в выполнении встроенного сценария, поскольку он нарушает следующую директиву политики безопасности контента
отказано в загрузке скрипта
отказался загружать таблицу стилей
что все это значит? Как работает политика безопасности контента? Как я могу использовать Content-Security-Policy HTTP заголовок?
в частности, как...
- ...разрешить несколько источников?
- ...использовать разные директивы?
- ...использовать несколько директив?
- ...обрабатывать порты?
- ...обрабатывать разные протоколы?
- ...разрешить
file://протокол? - ...использовать встроенные стили, скрипты и теги
<style>и<script>? - ...разрешить
eval()?
и наконец:
- что именно
'self'в смысле?
2 ответов:
The
Content-Security-Policyмета-тег позволяет снизить риск XSS атаки, позволяя определить, где ресурсы могут быть загружены из, предотвращая браузеры от загрузки данных из любых других местах. Это затрудняет злоумышленнику внедрение вредоносного кода на ваш сайт.я ударился головой о кирпичную стену, пытаясь понять, почему я получаю ошибки CSP один за другим, и, похоже, не было никаких кратких, четких инструкций о том, как именно это работает. Так вот моя попытка объяснить некоторые пункты CSP кратко, в основном концентрируясь на вещах, которые мне было трудно решить.
для краткости я не буду писать полный тег в каждом образце. Вместо этого я только покажу
contentсвойство, так что образец, который говоритcontent="default-src 'self'"значит так:<meta http-equiv="Content-Security-Policy" content="default-src 'self'">1. Как разрешить несколько источников?
вы можете просто перечислить свои источники после директивы как пробел список:
content="default-src 'self' https://example.com/js/"обратите внимание, что нет никаких кавычек вокруг параметров, кроме специальные, например,
'self'. Кроме того, нет двоеточия (:) после директивы. Просто директива, затем разделенный пробелом список параметров.все, что ниже указанных параметров неявно допускается. Это означает, что в приведенном выше примере это будут достоверные источники:
https://example.com/js/file.js https://example.com/js/subdir/anotherfile.jsэто, однако, не было бы действительно:
http://example.com/js/file.js ^^^^ wrong protocol https://example.com/file.js ^^ above the specified path2. Как использовать разные директивы, что каждый из них делает?
наиболее распространенными директивами являются:
default-srcполитика по умолчанию для загрузки javascript, изображений, CSS, шрифтов, AJAX-запросов и т. дscript-srcопределяет допустимые источники для файлов javascriptstyle-srcопределяет допустимые источники для файлов cssimg-srcопределяет допустимые источники для изображенияconnect-srcопределяет допустимые цели для XMLHttpRequest (AJAX), WebSockets или EventSource. Если попытка подключения сделана к хосту, который здесь не разрешен, браузер эмулирует400есть и другие, но это те, которые вам, скорее всего, понадобятся.
3. Как использовать несколько директив?
вы определяете все свои директивы внутри одного мета-тега, завершая их с помощью точка с запятой (
;):content="default-src 'self' https://example.com/js/; style-src 'self'"4. Как обрабатывать порты?
все, кроме портов по умолчанию, должно быть разрешено явно, добавив номер порта или звездочку после разрешенного домена:
content="default-src 'self' https://ajax.googleapis.com http://example.com:123/free/stuff/"вышеизложенное приведет к:
https://ajax.googleapis.com:123 ^^^^ Not ok, wrong port https://ajax.googleapis.com - OK http://example.com/free/stuff/file.js ^^ Not ok, only the port 123 is allowed http://example.com:123/free/stuff/file.js - OKкак я уже упоминал, вы также можете использовать звездочку, чтобы явно разрешить все порты:
content="default-src example.com:*"5. Как обращаться с разными протоколы?
по умолчанию разрешены только стандартные протоколы. Например, чтобы разрешить веб-сокетов
ws://вам придется разрешить это явно:content="default-src 'self'; connect-src ws:; style-src 'self'" ^^^ web sockets are now allowed on all domains and ports6. Как разрешить файловый протокол
file://?если вы попытаетесь определить его как таковой, он не будет работать. Вместо этого, вы позволите это с :
content="default-src filesystem"7. Как использовать встроенные скрипты и стиль определения?
если явно не разрешено, вы не можете использовать встроенные определения стилей, код внутри
<script>теги или в свойствах тегов, таких какonclick. Вы позволяете им вот так:content="script-src 'unsafe-inline'; style-src 'unsafe-inline'"вы также должны явно разрешить встроенные, base64 закодированные изображения:
content="img-src data:"8. Как разрешить
eval()?я уверен, что многие люди скажут, что вы этого не делаете, так как "eval-это зло" и наиболее вероятная причина для надвигающийся конец света. Эти люди были бы неправы. Конечно, вы можете определенно пробить большие дыры в безопасности вашего сайта с помощью eval, но у него есть совершенно правильные варианты использования. Вы просто должны быть умны в его использовании. Вы позволяете это так:
content="script-src 'unsafe-eval'"9. Что именно делает
'self'в смысле?вы можете взять
'self'означает localhost, локальную файловую систему или что-либо на том же хосте. Это ничего не значит. Это означает, что источники есть та же схема (протокол), тот же хост и тот же порт, что и файл, в котором определена политика содержимого. Обслуживание вашего сайта через HTTP? Нет https для вас тогда, если вы не определяете его явно.я использовал
'self'в большинстве случаев, как это обычно имеет смысл включить его, но это не обязательно. Оставьте его, если он вам не нужен.но подождите минутку! я не могу просто использовать
content="default-src *"и покончим с этим?нет. В дополнение к очевидные уязвимости безопасности, это оставит его также не будет работать, как вы ожидали бы. Даже если документы утверждают, что он позволяет все, что угодно, это неправда. Он не позволяет встраивать или оценивать, поэтому, чтобы действительно, действительно сделать ваш сайт более уязвимым, вы бы использовали это:
content="default-src * 'unsafe-inline' 'unsafe-eval'"... но я верю, что ты этого не сделаешь.
далее чтение:
APACHE2 MOD_HEADERS
вы также можете включить Apache2 mod_headers, на Fedora он уже включен по умолчанию, если вы используете Ubuntu / Debian включите его следующим образом:
# First enable headers module for Apache2, # then restart the Apache2 service a2enmod headers apache2 -k gracefulна Ubuntu / Debian вы можете настроить заголовки в файле
/etc/apache2/conf-enabled/security.conf# # Setting this header will prevent MSIE from interpreting files as something # else than declared by the content type in the HTTP headers. # Requires mod_headers to be enabled. # #Header set X-Content-Type-Options: "nosniff" # # Setting this header will prevent other sites from embedding pages from this # site as frames. This defends against clickjacking attacks. # Requires mod_headers to be enabled. # Header always set X-Frame-Options: "sameorigin" Header always set X-Content-Type-Options nosniff Header always set X-XSS-Protection "1; mode=block" Header always set X-Permitted-Cross-Domain-Policies "master-only" Header always set Cache-Control "no-cache, no-store, must-revalidate" Header always set Pragma "no-cache" Header always set Expires "-1" Header always set Content-Security-Policy: "default-src 'none';" Header always set Content-Security-Policy: "script-src 'self' www.google-analytics.com adserver.example.com www.example.com;" Header always set Content-Security-Policy: "style-src 'self' www.example.com;"Примечание: это нижняя часть файла, только последние 3 записи настроек ППКП.
первый параметр-это директива, второй-это источники, которые должны быть в белом списке. Я добавил Google analytics и adserver, который у вас может быть. Кроме того, я обнаружил, что если у вас есть псевдонимы, например, www.example.com и example.com настроенный в Apache2, вы также должны добавить их в белый список.
HTML-код считается вредным, вы должны избегать его. Скопируйте все javascripts и css в отдельные файлы и добавьте их в белый список.
В то время как вы на него вы можете взглянуть на другие настройки заголовка и установить mod_security
читайте далее:
https://developers.google.com/web/fundamentals/security/csp/
Comments