[Перевод] Улучшение сетевой безопасности с помощью Content Security Policy

de7dadf55b794ee5ba1af9f773cd6cf9.jpg

Content Security Policy (CSP, политика защиты контента) — это механизм обеспечения безопасности, с помощью которого можно защищаться от атак с внедрением контента, например, межсайтового скриптинга (XSS, cross site scripting). CSP описывает безопасные источники загрузки ресурсов, устанавливает правила использования встроенных стилей, скриптов, а также динамической оценки JavaScript — например, с помощью eval. Загрузка с ресурсов, не входящих в «белый список», блокируется.

Принцип действия


CSP сейчас является кандидатом в рекомендации консорциума W3C. Для использования политики страница должна содержать HTTP-заголовок Content-Security-Policy с одной и более директивами, которые представляют собой «белые списки». В версии 1.0 поддерживаются следующие директивы:

  • default-src
  • script-src
  • object-src
  • style-src
  • img-src
  • media-src
  • frame-src
  • font-src
  • connect-src


В default-src перечисляются разрешённые источники по умолчанию для остальных директив. Если какая-то директива не указана в заголовке, то политика применяется согласно списку default-src.

Для всех директив действуют следующие правила:

  • Для ссылки на текущий домен используется self.
  • В перечне URL адреса разделяются пробелами.
  • Если в рамках данной директивы ничего не должно загружаться, то применяется none. Например, object-src 'none' запрещает загрузку любых плагинов, включая Java и Flash.


Простейший пример политики, разрешающей загрузку ресурсов только указанного домена:

Content-Security-Policy: default-src 'self';

Попытка загрузки ресурсов из иных доменов будут пресекаться браузером с выдачей уведомления в консоли:

d832ae338b0a4792bffa2b019939df8c.png

По умолчанию CSP ограничивает исполнение JavaScript путём запрета встроенных скриптов и динамической оценки кода. В комбинации с «белыми списками» это позволяет предотвращать атаки с внедрением контента. Например, XSS-атаку с внедрением тэга инлайн-скрипта:

c967aae5ab854076ad47c316123cc34d.png

Загрузка внешних скриптов, которые не включены в CSP, также будет пресечена:

b9dde44107a543e584fe6404ada3f9d1.png

На данный момент в перечне URL нельзя прописывать пути (http://cdn.example.com/path), можно лишь перечислять сами домены (http://cdn.example.com). Зато поддерживаются символы подстановки, так что вы можете описать сразу все поддомены (http://*.example.com).

Директивы не наследуют права от предыдущих директив. Каждая директива, включённая в заголовок CSP, должна содержать перечень разрешённых доменов/поддоменов. В следующем примере default-src и style-src содержат ключевое слово self, а script-src и style-src содержат домен http://cdn.example.com:

Content-Security-Policy:    default-src 'self'; 
                            style-src 'self' http://cdn.example.com; 
                            script-src http://cdn.example.com;


Если вам нужно указать хосты для загрузки данных, то нужно указать ключевое слово data: img-src 'data:';.

Помимо списков доменов, директивы script-src и style-src поддерживают ключевые слова unsafe-inline и unsafe-eval.

  • unsafe-inline используется для разрешения инлайн-стилей и скриптов