У меня есть iframe в веб-просмотре, который загружает скрипт из актива приложения Android, используя следующее: -

<script src='file:///android_asset/trusted-iframe-script.js'></script>

Теперь я хочу иметь политику безопасности контента в iframe, чтобы никакой другой скрипт не мог быть загружен. Для этого я добавил в iframe CSP:

script-src: 'file:///android_asset/trusted-iframe-script.js';

Это не работает, поскольку файл uri игнорируется хромом.

The source list for Content Security Policy directive 'script-src' contains an invalid source: 'file:///android_asset/trusted-iframe-script.js'. It will be ignored.
Refused to load the script 'file:///android_asset/trusted-iframe-script.js' because it violates the following Content Security Policy directive: "script-src file:///android_asset/trusted-iframe-script.js".

Я читал о файловой системе uri, но для этого требуется запросить доступ к пользователю, но на самом деле мне нужен только доступ к моим собственным активам, а не к файловой системе в целом. Я также читал о blob: urls, но это похоже на встраивание всего скрипта

Как правильно ограничить csp только URL-адресами файлов?

2
gvijay 8 Сен 2016 в 13:53

3 ответа

Лучший ответ

Короче говоря, это невозможно сделать для изолированного iframe.

Chrome CSP не позволяет добавлять URL-адреса файлов в белый список как скрипт src. Вы можете использовать файл директивы: (без какого-либо URL-адреса), и это будет работать, если iframe не был изолирован. Но это плохая идея, так как

A. мой iframe изолирован, и

Б. это недокументированное ключевое слово, которое может перестать работать в любой момент.

Я также попытался создать URL-адрес большого двоичного объекта для контента и вместо этого передать его в iframe, но это тоже не сработает, если вы не установите allow-same-origin в атрибуте песочницы iframe.

0
gvijay 10 Окт 2016 в 21:37

Если CSP установлен на «странице», содержащей iframe, вы должны использовать директива child-src: вместо script-src: (Источник)

Тогда я не использую, как включать файл assert, и вы можете попробовать:

  • Дочерний-источник: файл: ///android_asset/trusted-iframe-script.js

    // я не могу это проверить

  • Child-src: файловая система: ///android_asset/trusted-iframe-script.js

    // источник и проверьте, требуется ли по-прежнему запрашивать доступ к пользователю

  • child-src: https://your.trusted.website.com/trusted-iframe -script.js

    // это должно работать, но для этого требуется доверенный сервер, а приложение должно подключаться к Интернету (нет очевидного условия)

0
Mirko Conti 19 Сен 2016 в 14:38

В URI CSP нет кавычек - попробуйте script-src: file:///android_asset/trusted-iframe-script.js;

Если это не сработает, большинство браузеров Android теперь поддерживают CSP2, который позволяет указать хеш для поддерживаемого сценария.

0
Keith 9 Сен 2016 в 06:20