如何在 Windows 通用应用程序中设置内容安全策略

How to set Content Security Policy in Windows Universal apps

我什至不知道这是否是我所需要的,但经过几天 MSDN Forum post 完全没有答案,我想我会尝试一下。

我的问题:我有很多 Windows 8.1 和 Windows Phone 8.1 HTML/Javascripts 应用程序有一点 <script> 句子在每个 html 页的 <head> 中。我开始将我的应用程序作为单个通用 Windows 应用程序迁移到 Windows 10,但出现以下错误:

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

当然,什么也没有执行……我是不是遗漏了什么?

编辑: 要重现,只需使用 VS2015 RC 创建一个空白 Windows 通用应用程序并添加

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

就在 head 标签关闭之前

我假设这不是您的真实用例,但总的来说,它取决于特定脚本是在本地环境还是网络环境中工作。有关概述,请参阅 Features and restrictions by context。如果您可以将脚本拉入本地 JS 文件而不是从头部调用它,那么我建议您这样做而不是摆弄应用程序的安全上下文。

您的 console.log 示例如果 运行 来自包(如您所注)或者如果它 运行 在网络上下文中,则有效。您可以通过在清单中将起始页更改为 ms-appx-web:///default.html 来强制整个应用在 Web 上下文中 运行。

但是,由于该应用现在处于受限网络上下文中,因此它无法访问所有 Windows 运行时。您可以通过将以下内容添加到清单中的“应用程序”部分来打开它:

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

您需要在代码编辑器中而不是在清单编辑器中打开清单来修改此部分。

有关错误的更多信息,请参阅 Edge Console error and status codes 文档

Rob 说得对,默认情况下您不能在 ms-appx:/// 协议中使用内联脚本。这是应用程序的默认协议,并且具有不允许内联脚本的默认 CSP 策略。

如果您真的想使用内联脚本,您可以通过 ms-appx-web:/// 协议导航到没有默认 CSP 策略的内容。

请注意,您无权使用此协议中的某些功能。

与 Rob 所说的唯一不同之处在于,您很可能希望像这样设置应用程序内容 URI 规则 (ACUR)

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

要导航到您的内容,您可以将清单中的 StartPage 设置为 ms-appx-web:///default.html

你能解决这个问题吗?我使用 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.
        }

也许有点晚了,但希望这对您有所帮助。