Если вы не знакомы с политикой безопасности контента (CSP), хорошей отправной точкой будет «Введение в политику безопасности контента» . Этот документ охватывает более широкий взгляд на CSP на веб-платформе; CSP приложений Chrome не так гибок.
CSP — это политика, направленная на устранение проблем с межсайтовым выполнением сценариев, а мы все знаем, что межсайтовое выполнение сценариев — это плохо. Мы не собираемся убеждать вас в том, что CSP — это новая, теплая и нечеткая политика. Это работа; вам нужно будет научиться выполнять фундаментальные задачи по-другому.
Цель этого документа — рассказать вам, что именно представляет собой политика CSP для приложений Chrome, что вам нужно сделать, чтобы соответствовать ей, и как вы можете выполнять эти фундаментальные задачи способом, совместимым с CSP.
Что такое CSP для приложений Chrome?
Политика безопасности контента для приложений Chrome запрещает вам выполнять следующие действия:
- Вы не можете использовать встроенные сценарии на страницах приложения Chrome. Ограничение запрещает как блоки
<script>
, так и обработчики событий (<button onclick="...">
). - Вы не можете ссылаться на внешние ресурсы ни в одном из файлов вашего приложения (за исключением видео- и аудиоресурсов). Вы не можете встраивать внешние ресурсы в iframe.
- Вы не можете использовать методы преобразования строки в JavaScript, такие как
eval()
иnew Function()
.
Это реализуется через следующее значение политики:
default-src 'self';
connect-src * data: blob: filesystem:;
style-src 'self' data: 'unsafe-inline';
img-src 'self' data:;
frame-src 'self' data:;
font-src 'self' data:;
media-src * data: blob: filesystem:;
Ваше приложение Chrome может ссылаться только на скрипты и объекты внутри вашего приложения, за исключением медиафайлов (приложения могут ссылаться на видео и аудио вне пакета). Расширения Chrome позволят вам ослабить политику безопасности контента по умолчанию; Приложения Chrome не будут.
Как соблюдать требования CSP
Весь JavaScript и все ресурсы должны быть локальными (все упаковывается в ваше приложение Chrome).
«Но тогда как мне…»
Вполне возможно, что вы используете библиотеки шаблонов, и многие из них не будут работать с CSP. Вы также можете захотеть получить доступ к внешним ресурсам в своем приложении (внешние изображения, контент с веб-сайтов).
Используйте библиотеки шаблонов
Используйте библиотеку, которая предлагает предварительно скомпилированные шаблоны, и все готово. Вы по-прежнему можете использовать библиотеку, которая не предлагает предварительную компиляцию, но это потребует некоторой работы с вашей стороны и существуют ограничения.
Вам нужно будет использовать песочницу, чтобы изолировать любой контент, для которого вы хотите выполнить «оценку». Песочница поднимает CSP для указанного вами контента. Если вы хотите использовать очень мощные API-интерфейсы Chrome в своем приложении Chrome, ваш изолированный контент не сможет напрямую взаимодействовать с этими API (см. Локальное содержимое песочницы ).
Доступ к удаленным ресурсам
Вы можете получать удаленные ресурсы через XMLHttpRequest
и обслуживать их через URL-адреса blob:
, data:
или filesystem:
(см. раздел Ссылки на внешние ресурсы ).
Видео и аудио можно загружать из удаленных служб, поскольку они имеют хорошее резервное поведение в автономном режиме или при нестабильном подключении.
Встраивание веб-контента
Вместо использования iframe вы можете вызвать внешний URL-адрес с помощью тега веб-просмотра (см. Встраивание внешних веб-страниц ).