“没有找到Content-Security-Policy元标记。” 我的phonegap应用程序中出现错误


94

在系统中更新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个网站链接,也遇到了同样的错误。


3
你有没有正确安装cordova-plugin-whitelist- github.com/apache/cordova-plugin-whitelist插件?之后,您将必须添加<allow-navigation href="http://*/*" />config.xml
Keval,2015年

1
感谢Keval,添加<allow-navigation href =“ http:// * / *” />之后,现在我的应用程序可以正常工作了。再次谢谢你。


3
如果在代码中缺少一个字符时就可以创建错误,那么为什么不允许少于六个字符的编辑呢?这个很容易解决,只是想在将来节省几秒钟。meta标签的content属性的末尾缺少双引号。
Jason D.

Answers:


86

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

您可以将其简单地添加到config.xml中,该文件可以在应用程序的根目录中找到:

在文档中推荐

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

要么:

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

从插件的文档中:

导航白名单

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

怪癖:在Android上,它也适用于非HTTP方案的iframe。

默认情况下,仅允许导航到file:// URL。要允许其他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:*" />


38

您必须在应用程序的头部添加CSP元标记 index.html

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

内容安全政策

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

在Android和iOS上,网络请求白名单(请参见上文)无法过滤所有类型的请求(例如<video>,未阻止&WebSockets)。因此,除了白名单之外,您还应该在所有页面上使用 内容安全策略 <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">

当我添加CSP Decleration时,谷歌地图的以下代码会失败,如下所示。任何想法 ?var pos = new google.maps.LatLng(position.coords.latitude,position.coords.longitude); //第173行11-09 21:17:30.724:D / SystemWebChromeClient(25692):file:///android_asset/www/index.html:第173行:未捕获的ReferenceError:未定义google
shamaleyte

1
我需要使用/>关闭带有/>的meta标签
metamagikum 2015年

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'"/>

注意“ script-src”之后的冒号,以及meta标记的双引号结尾。


3
当我<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"/>在离子框架中添加实时重新加载时,将停止工作,所以请当心其他人员
CommonSenseCode 2015年

@codePlusPlus以再次激活Ionic livereload,将其添加http://localhost:35729到script-scr指令和ws://localhost:35729connect-src指令。
kolli 2016年

@kolli,您能说明一下这些新指令吗?目前尚不清楚如何将它们添加到指令中。
jessewolfe '16

我看到信息在原始帖子中。但是要澄清一下:请注意,通过“添加”,这意味着您可以替换为 script-src 'self' 'unsafe-inline' 'unsafe-eval'script-src 'self' http://localhost:35279 'unsafe-inline' 'unsafe-eval'并且可以在content属性的末尾添加带有分号的新指令:; script-src ws://localhost:35279
jessewolfe

对以上内容的更正...对于第二部分,应为; connect-src 'self' ws://localhost:35279。请注意,在添加“自我”之前,我遇到了一个错误(由于CSP冲突而无法访问file:// <index.html的路径>)。
jessewolfe '16

2

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

cordova plugin remove cordova-plugin-whitelist

然后

cordova plugin add cordova-plugin-whitelist

似乎从先前版本的Cordova更新失败。


1

对我来说,问题是我使用的是科尔多瓦androidios平台的过时版本。因此,升级到android@5.1.1ios@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

您是说Android 5.1.1吗?
mix3d

我遵循@Maxim和Pierre-Alexis de Solminihac的建议,最后使我的App正常运行。谢谢!
Zalakain

0

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

在AndroidManifest.xml中:

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

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

问题终于解决了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.