Вопрос: Как установить политику безопасности контента в приложениях Windows Universal


Я даже не знаю, что мне нужно, но через несколько дней Сообщение форума MSDN  без ответов вообще я думал, что я бы выстрелил в ТАК.

Моя проблема : У меня много приложений для Windows 8.1 и Windows Phone 8.1 HTML / Javascripts, которые немного <script> предложение в <head> каждой страницы html. Я начал переносить свои приложения на Windows 10 как одно универсальное приложение Windows, но я получил следующую ошибку:

CSP14312: Resource violated directive 'script-src ms-appx: data: 'unsafe-eval'' in Host Defined Policy: inline script. Resource will be blocked

и, конечно, ничего не исполнилось ... Я что-то упустил?

редактировать:  Для воспроизведения просто создайте пустое приложение Windows Universal с VS2015 RC и добавьте

<script>
    console.log('hello');
</script>

прямо перед закрытием тега заголовка


5


источник


Ответы:


У Роб это правильно, по умолчанию у вас не может быть встроенного скрипта в мс-appx: ///  протокол. Это протокол по умолчанию для приложения и имеет политику CSP по умолчанию, которая не позволяет встроенный скрипт.

Если вы действительно хотите использовать встроенный скрипт, вы можете перейти к содержимому через мс-appx-веб: ///  протокол, где политика CSP по умолчанию отсутствует.

Одно замечание состоит в том, что у вас нет доступа к некоторым возможностям в этом протоколе.

Единственное различие, которое у меня выше того, что сказал Роб, заключается в том, что вы, скорее всего, захотите установить правило URI для контента приложения (ACUR), подобное этому

<uap:ApplicationContentUriRules>
   <uap:Rule Type="include" Match ="ms-appx-web:///" WindowsRuntimeAccess="all"/>
</uap:ApplicationContentUriRules>

Чтобы перейти к своему контенту, вы можете установить StartPage в манифесте мс-appx-веб: ///default.html  


3



Я предполагаю, что это не ваш реальный прецедент, но в целом это зависит от конкретного сценария, будет ли он работать в локальном или веб-контексте. Видеть Особенности и ограничения по контексту  для обзора. Если вы можете вытащить скрипт в локальный JS-файл, а не называть его из головы, я бы рекомендовал вместо этого использовать контексты безопасности приложения.

Ваш пример console.log работает, если он запускается из пакета (как вы заметили) или работает в веб-контексте. Вы можете принудительно запустить все приложение в веб-контексте, изменив стартовую страницу на ms-appx-web: ///default.html в манифесте.

Однако, поскольку приложение теперь находится в ограниченном веб-контексте, у него не будет доступа ко всем Windows Runtime. Вы можете открыть это, добавив в свой манифест следующий раздел приложения:

<uap:ApplicationContentUriRules>
   <uap:Rule Type="include" Match ="ms-appx-web:///" WindowsRuntimeAccess="allowForWebOnly"/>
</uap:ApplicationContentUriRules>

Вам нужно будет открыть манифест в редакторе кода, а не в редакторе манифеста, чтобы изменить этот раздел.

Подробнее об ошибке см. Edge Кодовая ошибка и коды состояния  документация


3



Могли ли вы решить эту проблему? Я занимаюсь разработкой приложений и игр с использованием инфраструктуры Enyo и столкнулся с той же проблемой. Я смог разрешить его, введя строки, которые я обычно вношу в тег в файле default.js в этом разделе:

        if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            // TODO: This application has been newly launched. Initialize your application here.
            initializemyapp();
            console.log("starting");
        } else {
            // TODO: This application was suspended and then terminated.
            // To create a smooth user experience, restore application state here so that it looks like the app never stopped running.
        }

Может быть, немного поздно, но надеюсь, что это поможет.


1