"未找到Content-Security-Policy元标记。"我的phonegap应用程序出错

时间:2015-05-13 10:34:56

标签: cordova phonegap-plugins whitelist

在我的系统中更新Cordova 5.0后,我创建了新的应用程序。当我在设备上测试我的应用程序时,我在控制台日志中出现错误:

No Content-Security-Policy meta tag found.
Please add one when using the Cordova-plugin-whitelist plugin.: 23.

我在头部添加meta

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src: 'self' 'unsafe-inline' 'unsafe-eval'>

但是,在我使用应用程序内浏览器插件和其他7个网站链接的应用程序中,我得到了同样的错误。

6 个答案:

答案 0 :(得分:86)

添加cordova-plugin-whitelist后,您必须告知您的应用程序允许访问所有网页链接或特定链接,如果您想保持其特定。

您只需将其添加到 config.xml 即可在应用程序的根目录中找到:

文档中的

推荐

<allow-navigation href="http://example.com/*" />

或:

<allow-navigation href="http://*/*" />

从插件的文档:

  

导航白名单

     

控制可以导航到WebView本身的URL。适用于   仅限顶级导航。

     

Quirks:在Android上它也适用于非http(s)方案的iframe。

     

默认情况下,仅允许导航到file:// URL。允许   其他其他网址,您必须添加标签   config.xml中:

<!-- Allow links to example.com -->
<allow-navigation href="http://example.com/*" />

<!-- Wildcards are allowed for the protocol, as a prefix
     to the host, or as a suffix to the path -->
<allow-navigation href="*://*.example.com/*" />

<!-- A wildcard can be used to whitelist the entire network,
     over HTTP and HTTPS.
     *NOT RECOMMENDED* -->
<allow-navigation href="*" />

<!-- The above is equivalent to these three declarations -->
<allow-navigation href="http://*/*" />
<allow-navigation href="https://*/*" />
<allow-navigation href="data:*" />

答案 1 :(得分:37)

您必须在应用的index.html

的主要部分添加CSP元标记

根据https://github.com/apache/cordova-plugin-whitelist#content-security-policy

  

内容安全政策

     

控制允许进行哪些网络请求(图像,XHR等)(直接通过webview)。

     

在Android和iOS上,网络请求白名单(见上文)不是   能够过滤所有类型的请求(例如<video>和WebSockets   没有阻止)。所以,除了白名单,你应该使用   Content Security Policy   所有网页上都有<meta>标记。

     

在Android上,系统webview中对CSP的支持始于   KitKat(但在使用Crosswalk WebView的所有版本上都可用)。

     

以下是.html页面的一些示例CSP声明:

<!-- Good default declaration:
    * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
    * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
    * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
        * Enable inline JS: add 'unsafe-inline' to default-src
        * Enable eval(): add 'unsafe-eval' to default-src
-->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *">

<!-- Allow requests to foo.com -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com">

<!-- Enable all requests, inline styles, and eval() -->
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

<!-- Allow XHRs via https only -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https:">

<!-- Allow iframe to https://cordova.apache.org/ -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">

答案 2 :(得分:23)

您的元标记中存在错误。

此致:

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src: 'self' 'unsafe-inline' 'unsafe-eval'>

修正:

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"/>

注意&#34; script-src&#34;之后的冒号,以及元标记的结尾双引号。

答案 3 :(得分:2)

对我而言,重新安装白名单插件就足够了:

cordova plugin add cordova-plugin-whitelist

然后

ENV AWSKEY @value@

看起来从早期版本的Cordova更新并不成功。

答案 4 :(得分:1)

对我来说问题是我使用的是cordova android ios 平台的过时版本。升级到 android@5.1.1 ios@4.0.1 解决了它。

您可以升级到以下特定版本:

cordova platforms rm android
cordova platforms add android@5.1.1
cordova platforms rm ios
cordova platforms add ios@4.0.1

答案 5 :(得分:0)

还有另一个关于连接的问题。某些android版本可以连接,但有些则不能。因此,还有另一种解决方案

在AndroidManifest.xml中:

<application ... android:usesCleartextTraffic="true">
        ...
    </application>

只需添加'android:usesCleartextTraffic =“ true”'

问题终于解决了。