【问题标题】:How to set Content Security Policy in Windows Universal apps如何在 Windows 通用应用程序中设置内容安全策略
【发布时间】:2015-08-14 12:30:09
【问题描述】:

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

我的问题:我有许多 Windows 8.1 和 Windows Phone 8.1 HTML/Javascripts 应用程序在每个 html 页面的 <head> 中有一个小的 <script> 句子。我开始将我的应用程序作为单个通用 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 标签关闭之前

【问题讨论】:

  • 你能提供一个最小的复制吗?这应该可以正常工作。
  • 有人能解释为什么投反对票吗?

标签: javascript win-universal-app windows-10


【解决方案1】:

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

【讨论】:

  • 这不正是 Rob 建议的吗?几个问题,1)这对Win10来说是全新的吧?内联脚本在 Win8.1 中是可以的 2) 添加你建议我无法访问的内容 Windows.Storage.ApplicationData.current 是预期的吗?
  • 抱歉,我更新了我的示例。您需要添加 WindowsRuntimeAccess="all"
  • 对于 Windows 8,您可以使用内联脚本,但您无法轻松更改 innerHTML,或动态添加某些类型的属性。压倒性地我们听说这是一个问题。所以我们去掉了之前的SafeHTML安全模型,转而采用CSP的W3C标准。对于本地内容,唯一的限制是没有内联脚本。我们确实创建了一个NPM module,如果您不想自己这样做,它将帮助您删除内联脚本。或者您可以简单地使用基于 Web 的协议 ms-apps-web:///
  • 太棒了,这正是我所期待的答案/评论!欢迎来到 SO ;)
  • 该死的微软,从来没有让开发者的事情变得简单!!!你不能只是从其他人那里复制吗?像 Android 这样的应用程序使用沙盒?总是带有新的奇怪的安全模型,没有人理解和如此可怕的文档,然后每个人都以同样的方式闯入你的系统......无论如何,这个解决方案对我不起作用,并且相同的代码在 8.1 上运行没有问题。 Cordova 应用程序,更新到 Win 10 后 VS 2015 中的通用应用程序解决方案。我总是得到 CSP14312 :/
【解决方案2】:

我认为这不是您真正的用例,但总体而言,它是否会在本地或 Web 环境中工作取决于具体的脚本。有关概述,请参阅Features and restrictions by context。如果您可以将脚本拉入本地 JS 文件而不是从头调用它,那么我建议您这样做,而不是摆弄应用程序的安全上下文。

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

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

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

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

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

【讨论】:

  • 我添加了您的建议,它确实有效,但我无法访问 Windows 运行时 :(
【解决方案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.
        }

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

【讨论】:

  • 我确实按照您所做的那样解决了它...我在 js 文件中添加了我的脚本,并从 html 中添加了对该文件的引用
猜你喜欢
  • 2021-03-02
  • 2022-09-24
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 2021-12-06
  • 2022-01-08
  • 1970-01-01
  • 2021-06-28
相关资源
最近更新 更多