如何在Windows通用应用程序中设置内容安全策略
我甚至不知道这是我需要的,但在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标签关闭
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
这不正是罗布建议的吗?几个问题,1)这是全新的Win10的权利?内嵌脚本是在Win8.1中确定2)添加你建议我无法访问'Windows.Storage.ApplicationData.current'是预期的? – sebagomez
对不起,我更新了我的例子。您需要添加WindowsRuntimeAccess =“all” –
对于Windows 8,您可以使用内联脚本,但无法轻松更改innerHTML,或者无法动态添加某些类型的属性。我们绝大多数听说这是一个问题。因此,我们拿出了以前的SafeHTML安全模型,并采用了CSP的W3C标准。对于本地内容,唯一的限制是没有内联脚本。我们确实创建了一个[NPM模块](https://www.npmjs.com/package/noin),如果您不想自行完成,它将帮助您删除内联脚本。或者你可以简单地使用ms-apps-web的基于web的协议:/// –
之前,我认为这不是你的实际使用情况,但整体它取决于具体的脚本是否可以在本地或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文档
我添加了你的建议,它确实工作,但我无法访问Windows运行时间:( – sebagomez
你能解决这个问题吗?我使用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中添加了对该文件的引用 – sebagomez
你能提供一个最小的repro? 这应该一般工作。 –
有人可以解释为什么投票吗? – sebagomez