"Aucune balise Meta Content-Security-Policy trouvée." erreur dans mon application phonegap


94

Après la mise à jour de Cordova 5.0 dans mon système, je crée de nouvelles applications. Lorsque j'ai testé mon application sur un appareil, j'obtiens une erreur dans le journal de la console:

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

J'ajoute méta dans la section head

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

Mais encore une fois, j'ai eu la même erreur, dans l'application, j'utilise le plugin de navigateur intégré à l'application et 7 autres liens vers des sites Web.


3
Avez-vous correctement installé le plugin cordova-plugin-whitelist- github.com/apache/cordova-plugin-whitelist ? Après cela, vous devrez ajouter <allow-navigation href="http://*/*" />à votre config.xml
Keval

1
Merci Keval, après avoir ajouté <allow-navigation href = "http: // * / *" /> maintenant mon application fonctionne correctement. Merci encore.


3
Lorsqu'une erreur peut être créée lorsqu'un caractère manque dans le code, pourquoi SO n'autorise-t-il pas les modifications de moins de six caractères? Celui-ci est assez facile à réparer, essayant juste de sauver quelqu'un d'autre quelques secondes dans le futur. Il manque un guillemet double à la fin de l'attribut de contenu de la balise meta.
Jason D.

Réponses:


86

Après avoir ajouté la liste blanche de cordova-plugin , vous devez dire à votre application d'autoriser l'accès à tous les liens de page Web ou à des liens spécifiques, si vous souhaitez le garder spécifique.

Vous pouvez simplement l'ajouter à votre config.xml , qui se trouve dans le répertoire racine de votre application:

Recommandé dans la documentation:

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

ou:

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

Depuis la documentation du plugin:

Liste blanche de navigation

Contrôle les URL vers lesquelles la WebView elle-même peut être parcourue. S'applique uniquement aux navigations de niveau supérieur.

Quirks: sur Android, cela s'applique également aux iframes pour les schémas non-http (s).

Par défaut, les navigations uniquement vers les URL file: // sont autorisées. Pour autoriser d'autres URL, vous devez ajouter des balises à votre 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

Vous devez ajouter une balise Meta CSP dans la section head de votre application index.html

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

Politique de sécurité du contenu

Contrôle les requêtes réseau (images, XHR, etc.) autorisées (via la vue Web directement).

Sur Android et iOS, la liste blanche des requêtes réseau (voir ci-dessus) n'est pas capable de filtrer tous les types de requêtes (par exemple, les <video>WebSockets ne sont pas bloqués). Ainsi, en plus de la liste blanche, vous devez utiliser une balise de stratégie de sécurité du contenu <meta> sur toutes vos pages.

Sur Android, la prise en charge de CSP dans la vue Web du système commence avec KitKat (mais est disponible sur toutes les versions utilisant Crosswalk WebView).

Voici quelques exemples de déclarations CSP pour vos .htmlpages:

<!-- 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">

Lorsque j'ajoute la déclinaison CSP, le morceau de code suivant pour google map échoue comme ceci. Une idée ? var pos = new google.maps.LatLng (position.coords.latitude, position.coords.longitude); // ligne 173 11-09 21: 17: 30.724: D / SystemWebChromeClient (25692): file: ///android_asset/www/index.html: Ligne 173: Uncaught ReferenceError: google n'est pas défini
shamaleyte

1
J'avais besoin de fermer les balises meta avec /> pour être reconnu
metamagikum

23

Il y a des erreurs dans votre balise Meta.

Le tiens:

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

Corrigée:

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

Notez les deux points après "script-src" et la fin de la balise meta.


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

@codePlusPlus pour réactiver Ionic livereload, ajoutez http://localhost:35729à la directive script-scr et ws://localhost:35729à la directive connect-src.
kolli

@kolli, pouvez-vous montrer à quoi ressembleraient les nouvelles diretives? on ne sait pas comment les ajouter aux directives.
jessewolfe

Je vois que les informations sont dans le message d'origine. Mais pour clarifier: notez qu'en `` ajoutant '', cela signifie que vous pouvez remplacer script-src 'self' 'unsafe-inline' 'unsafe-eval'par script-src 'self' http://localhost:35279 'unsafe-inline' 'unsafe-eval'et que vous ajouteriez une nouvelle directive avec un point-virgule séparateur à la fin de l'attribut de contenu:; script-src ws://localhost:35279
jessewolfe

Correction ci-dessus ... pour la deuxième partie, ça devrait être ; connect-src 'self' ws://localhost:35279. Notez que j'obtenais une erreur (je n'ai pas pu accéder au fichier: // <chemin vers index.html> en raison d'une violation du CSP) jusqu'à ce que j'aie ajouté «self».
jessewolfe

2

Pour moi, il suffisait de réinstaller le plugin de liste blanche :

cordova plugin remove cordova-plugin-whitelist

puis

cordova plugin add cordova-plugin-whitelist

Il semble que la mise à jour à partir des versions précédentes de Cordova n'ait pas réussi.


1

Pour moi, le problème était que j'utilisais des versions obsolètes des plates-formes cordova android et ios . Donc, mise à niveau vers android@5.1.1 et ios@4.0.1 résolu.

Vous pouvez passer à ces versions spécifiques:

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

vouliez-vous dire android 5.1.1 ?
mix3d

J'ai suivi les conseils de @Maxim et de Pierre-Alexis de Solminihac, et j'ai enfin réussi à faire fonctionner mon application. Merci!
Zalakain

0

Il y a un autre problème de connexion. Certaines versions d'Android peuvent se connecter mais d'autres non. Il y a donc une autre solution

dans AndroidManifest.xml:

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

Ajoutez simplement 'android: usesCleartextTraffic = "true"'

et problème résolu finalement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.