"Nessun meta tag Content-Security-Policy trovato." errore nella mia applicazione phonegap


94

Dopo aver aggiornato Cordova 5.0 nel mio sistema, creo nuove applicazioni. Quando ho testato la mia applicazione su un dispositivo quella volta ricevo un errore nel log della console:

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

Aggiungo meta nella sezione della testa

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

Ma ancora una volta, ho ricevuto lo stesso errore, nell'applicazione utilizzo il plug-in del browser in-app e 7 di altri collegamenti a siti Web.


3
Hai installato correttamente il plugin cordova-plugin-whitelist- github.com/apache/cordova-plugin-whitelist ? Dopodiché, dovrai aggiungere <allow-navigation href="http://*/*" />al tuo config.xml
Keval

1
Grazie Keval, dopo aver aggiunto <allow-navigation href = "http: // * / *" /> ora la mia applicazione funziona bene. Grazie ancora.


3
Quando è possibile creare un errore quando un carattere manca nel codice, perché SO non consente modifiche inferiori a sei caratteri? Questo è abbastanza facile da risolvere, stava solo cercando di salvare qualcun altro qualche secondo in futuro. Manca una virgoletta doppia alla fine dell'attributo di contenuto del meta tag.
Jason D.

Risposte:


86

Dopo aver aggiunto cordova-plugin-whitelist , devi dire alla tua applicazione di consentire l'accesso a tutti i link della pagina web o link specifici, se vuoi mantenerlo specifico.

Puoi semplicemente aggiungerlo al tuo config.xml , che può essere trovato nella directory principale della tua applicazione:

Consigliato nella documentazione:

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

o:

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

Dalla documentazione del plugin:

Whitelist di navigazione

Controlla a quali URL è possibile navigare nella WebView stessa. Si applica solo alle navigazioni di primo livello.

Stranezze: su Android si applica anche agli iframe per schemi non http (s).

Per impostazione predefinita, sono consentite solo le navigazioni a file: // URL. Per consentire altri altri URL, devi aggiungere tag al tuo 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

Devi aggiungere un meta tag CSP nella sezione principale della tua app index.html

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

Politica sulla sicurezza dei contenuti

Controlla quali richieste di rete (immagini, XHR, ecc.) Possono essere effettuate (tramite webview direttamente)

Su Android e iOS, la whitelist delle richieste di rete (vedi sopra) non è in grado di filtrare tutti i tipi di richieste (ad esempio i <video>& WebSocket non sono bloccati). Quindi, oltre alla whitelist, dovresti utilizzare un tag Content Security Policy <meta> su tutte le tue pagine.

Su Android, il supporto per CSP all'interno della webview di sistema inizia con KitKat (ma è disponibile su tutte le versioni che utilizzano Crosswalk WebView).

Ecco alcuni esempi di dichiarazioni CSP per le tue .htmlpagine:

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

Quando aggiungo la dichiarazione CSP, il seguente pezzo di codice per google map fallisce in questo modo. Qualche idea ? var pos = new google.maps.LatLng (position.coords.latitude, position.coords.longitude); // riga 173 11-09 21: 17: 30.724: D / SystemWebChromeClient (25692): file: ///android_asset/www/index.html: riga 173: Uncaught ReferenceError: google non è definito
shamaleyte

1
Avevo bisogno di chiudere i meta tag con /> per essere riconosciuto
metamagikum

23

Ci sono errori nel tuo meta tag.

Il tuo:

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

Corretto:

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

Nota i due punti dopo "script-src" e le virgolette doppie finali del metatag.


3
quando includo la <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"/>ricarica live con il framework ionico smette di funzionare, quindi fai attenzione agli altri là fuori
CommonSenseCode

@codePlusPlus per attivare nuovamente Ionic livereload, aggiungere http://localhost:35729alla direttiva script-scr e ws://localhost:35729alla direttiva connect-src.
kolli

@kolli, puoi mostrare come sarebbero le nuove direttive? non è chiaro come aggiungerli alle direttive.
jessewolfe

Vedo che le informazioni sono nel post originale. Ma per chiarire: nota che "aggiungendo" significa che puoi sostituire script-src 'self' 'unsafe-inline' 'unsafe-eval'con script-src 'self' http://localhost:35279 'unsafe-inline' 'unsafe-eval'e aggiungere una nuova direttiva con un punto e virgola di separazione alla fine dell'attributo del contenuto:; script-src ws://localhost:35279
jessewolfe

Correzione a sopra ... per la seconda parte, dovrebbe essere ; connect-src 'self' ws://localhost:35279. Nota che stavo ricevendo un errore (impossibile accedere a file: // <path to index.html> a causa di una violazione CSP) fino a quando non ho aggiunto "self".
jessewolfe

2

Per me è stato sufficiente reinstallare il plugin whitelist :

cordova plugin remove cordova-plugin-whitelist

e poi

cordova plugin add cordova-plugin-whitelist

Sembra che l'aggiornamento dalle versioni precedenti di Cordova non abbia avuto successo.


1

Per me il problema era che stavo usando versioni obsolete delle piattaforme Android e iOS di Cordova . Quindi l'aggiornamento a android@5.1.1 e ios@4.0.1 lo ha risolto.

Puoi eseguire l'aggiornamento a queste versioni specifiche:

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

intendevi Android 5.1.1 ?
mix3d

Ho seguito entrambi i consigli di @Maxim e Pierre-Alexis de Solminihac e finalmente la mia app funzionava bene. Grazie!
Zalakain

0

C'è un altro problema sulla connessione. Alcune versioni di Android possono connettersi ma altre no. Quindi c'è un'altra soluzione

in AndroidManifest.xml:

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

Aggiungi semplicemente "android: usesCleartextTraffic =" true ""

e problema risolto finalmente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.