Добавлен , опубликован

XGM - Next

Содержание:

Описание

Так как вэб развивался хаотически и во все стороны, то внезапно оказалось, что безопасность дышыт на ладан. Чтоб как-то испраить эту ситуацию был придуман CSP - набор правил, который ограничивает используемые ресурсы. Например скрипты из внешних источников.

Директивы

Базовый набор правил выглядит так:
default-src 'self'
Подключается на страницу с помощью meta:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
Это значит, что все ресурсы должны принадлежать этому же домену. Подробней это описано на официальном сайте.
Правило default-src должно быть указано обязательно, так как оно будет применено ко всем остальным типам ресурсов:

Исключения

Как вы заметили в прошлой статье, мы использовали инлайн скрипт. Открыв консоль мы увидим ошибку, в которой описаны механизмы исключений:
Refused to execute inline script because it violates the following Content Security Policy directive: "default-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-Fgb/aJLaSNh3z2r+k6Y1y6tJlZ+P2tLz1c58hTPrzJc='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'script-src' was not explicitly set, so 'default-src' is used as a fallback.
Первый простой как топор - разрешить unsafe-inline. Но это не наш выход, мы за безопасность и против взломов.

Второй способ довольно прост при наличии сервера. Необходимо при каждой отдаче страницы сгененрировать уникальный nonce и указывать его в каждом скрипте:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'nonce-rAnd0m'">
<script nonce="rAnd0m">
	doWhatever();
</script>

Третий, тоже простой, но сопряжён с неудобством - просто указать хэш из сообщения об ошибке. Неудобство в том, что скрипты часто правятся и каждый раз указывать хэш муторно.
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'sha256-Fgb/aJLaSNh3z2r+k6Y1y6tJlZ+P2tLz1c58hTPrzJc='">

Результат

На данный момент, наши правила будут выглядеть так:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'nonce-rAnd0m' 'sha256-C9Pc74x5BP660fRg4HJ6AmFM9IpoprZO7TSDFKmjYzw='; worker-src 'self'">
Для удобства nonce был захардкоден, но это ограничение платформы GitHub Pages. На реальном сервере он будет генериться как положено.
В будущем правила будут дополняться, о чём конечно-же будет указано.

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...