2015-06-25 41 views
5

我甚至不知道这是我需要的,但在MSDN Forum post几天后根本没有答案,我认为我会在SO中投篮。如何在Windows通用应用程序中设置内容安全策略

我的问题:我有一个在每一个HTML页面的<head>有点<script>句子许多Windows 8.1和Windows Phone 8.1 HTML/Javascript角应用。我开始迁移我的应用程序到Windows 10为一个通用的Windows应用程序,但我得到以下错误:

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标签关闭

+0

你能提供一个最小的repro? 这应该一般工作。 –

+0

有人可以解释为什么投票吗? – sebagomez

回答

3

Rob则是正确的,默认情况下你不能有内嵌脚本MS-APPX:///协议。这是应用程序的默认协议,并且具有不允许内联脚本的默认CSP策略。

如果您确实希望使用内联脚本,则可以通过ms-appx-web:///协议导航到内容,其中没有默认的CSP策略。

需要注意的是,您无法访问此协议中的某些功能。

我已经超越了罗布说,唯一的区别是,你很可能希望将应用程序内容URI规则(ACUR)这样

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

导航到你的内容,你可以在设置起始页清单ms-appx-web:///default.html

+0

这不正是罗布建议的吗?几个问题,1)这是全新的Win10的权利?内嵌脚本是在Win8.1中确定2)添加你建议我无法访问'Windows.Storage.ApplicationData.current'是预期的? – sebagomez

+0

对不起,我更新了我的例子。您需要添加WindowsRuntimeAccess =“all” –

+1

对于Windows 8,您可以使用内联脚本,但无法轻松更改innerHTML,或者无法动态添加某些类型的属性。我们绝大多数听说这是一个问题。因此,我们拿出了以前的SafeHTML安全模型,并采用了CSP的W3C标准。对于本地内容,唯一的限制是没有内联脚本。我们确实创建了一个[NPM模块](https://www.npmjs.com/package/noin),如果您不想自行完成,它将帮助您删除内联脚本。或者你可以简单地使用ms-apps-web的基于web的协议:/// –

3

之前,我认为这不是你的实际使用情况,但整体它取决于具体的脚本是否可以在本地或Web上下文中使用。有关概览,请参阅Features and restrictions by context。如果您可以将脚本拖入本地JS文件而不是从头部调用它,那么我会建议您不要摆弄应用程序的安全上下文。

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

但是,由于该应用程序现在处于受限制的Web环境中,因此无法访问所有Windows运行时。您可以打开了通过添加以下到应用程序部分您的清单:

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

你需要在代码编辑器,而不是在清单编辑器修改此节开清单。

欲了解更多的错误看到边缘Console error and status codes文档

+0

我添加了你的建议,它确实工作,但我无法访问Windows运行时间:( – sebagomez

1

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

也许是有点晚,但希望这有助于。

+0

我确实解决了这个问题,你完全是这样做的......我在js文件中添加了我的脚本,并且只是从html中添加了对该文件的引用 – sebagomez