"No se ha encontrado ninguna metaetiqueta Content-Security-Policy". error en mi aplicación phonegap

94

Después de actualizar Cordova 5.0 en mi sistema, creo nuevas aplicaciones. Cuando probé mi aplicación en un dispositivo esa vez, aparece un error en el registro de la consola:

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

Agrego meta en la sección de la cabeza

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

Pero nuevamente, obtuve el mismo error, en la aplicación utilizo el complemento del navegador en la aplicación y 7 de otros enlaces de sitios web.

Manikandan C
fuente
3
¿Ha instalado correctamente el complemento cordova-plugin-whitelist- github.com/apache/cordova-plugin-whitelist ? Después de eso, tendrá que agregar <allow-navigation href="http://*/*" />a su config.xml
Keval
1
Gracias Keval, después de agregar <allow-navigation href = "http: // * / *" /> ahora mi aplicación funciona bien. Gracias de nuevo.
3
Cuando se puede crear un error cuando falta un carácter en el código, ¿por qué SO no permite ediciones de menos de seis caracteres? Este es bastante fácil de arreglar, solo estaba tratando de salvar a alguien más unos segundos en el futuro. Falta una comilla doble al final del atributo de contenido de la metaetiqueta.
Jason D.

Respuestas:

86

Después de agregar la lista blanca cordova-plugin , debe indicarle a su aplicación que permita el acceso a todos los enlaces de la página web o enlaces específicos, si desea mantenerlo específico.

Simplemente puede agregar esto a su config.xml , que se puede encontrar en el directorio raíz de su aplicación:

Recomendado en la documentación:

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

o:

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

De la documentación del complemento:

Lista blanca de navegación

Controla a qué URL se puede navegar el WebView. Se aplica solo a navegaciones de nivel superior.

Quirks: en Android también se aplica a iframes para esquemas no http (s).

De forma predeterminada, se permiten las navegaciones solo a file: // URL. Para permitir otras URL, debe agregar etiquetas a su 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:*" />
Keval
fuente
@AmeePrajapati prueba stackoverflow.com/questions/37044969/…
Kush Patel
38

Debe agregar una metaetiqueta CSP en la sección principal de la index.html

Según https://github.com/apache/cordova-plugin-whitelist#content-security-policy

Política de seguridad de contenido

Controla qué solicitudes de red (imágenes, XHR, etc.) se pueden realizar (a través de webview directamente).

En Android e iOS, la lista blanca de solicitudes de red (ver arriba) no puede filtrar todos los tipos de solicitudes (por ejemplo, los <video>& WebSockets no están bloqueados). Por lo tanto, además de la lista blanca, debe usar una etiqueta de Política de seguridad de contenido <meta> en todas sus páginas.

En Android, la compatibilidad con CSP dentro de la vista web del sistema comienza con KitKat (pero está disponible en todas las versiones que usan Crosswalk WebView).

A continuación, se muestran algunos ejemplos de declaraciones de CSP para sus .htmlpáginas:

<!-- 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">
tomtastico
fuente
Cuando agrego el CSP Decleration, el siguiente fragmento de código para el mapa de Google falla así. Alguna idea ? var pos = new google.maps.LatLng (position.coords.latitude, position.coords.longitude); // línea 173 11-09 21: 17: 30.724: D / SystemWebChromeClient (25692): file: ///android_asset/www/index.html: Línea 173: Error de referencia no
detectado
1
Necesitaba cerrar las metaetiquetas con /> para ser reconocido
metamagikum
23

Hay errores en su metaetiqueta.

Tuya:

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

Corregido:

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

Tenga en cuenta los dos puntos después de "script-src" y las comillas dobles finales de la metaetiqueta.

Kae Verens
fuente
3
cuando <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"/>incluyo la recarga en vivo con el marco iónico deja de funcionar, así que ten cuidado con los demás
CommonSenseCode
@codePlusPlus para activar Ionic livereload nuevamente, agregue http://localhost:35729a la directiva script-scr y ws://localhost:35729a la directiva connect-src.
Kolli
@kolli, ¿puedes mostrar cómo serían los nuevos directores? no está claro cómo agregarlos a las directivas.
jessewolfe
Veo que la información está en la publicación original. Pero para aclarar: tenga en cuenta que al 'agregar', esto significa que puede reemplazar script-src 'self' 'unsafe-inline' 'unsafe-eval'con script-src 'self' http://localhost:35279 'unsafe-inline' 'unsafe-eval'y agregaría una nueva directiva con un punto y coma de separación al final del atributo de contenido:; script-src ws://localhost:35279
jessewolfe
Corrección de arriba ... para la segunda parte, debería ser ; connect-src 'self' ws://localhost:35279. Tenga en cuenta que recibí un error (no pude acceder al archivo: // <ruta a index.html> debido a una infracción de CSP) hasta que agregué 'self'.
jessewolfe
2

Para mí fue suficiente reinstalar el complemento de lista blanca :

cordova plugin remove cordova-plugin-whitelist

y entonces

cordova plugin add cordova-plugin-whitelist

Parece que la actualización de versiones anteriores de Cordova no fue exitosa.

Máxima
fuente
1

Para mí, el problema era que estaba usando versiones obsoletas de las plataformas cordova android e ios . Entonces, actualizar a [email protected] e [email protected] lo resolvió.

Puede actualizar a estas versiones específicas:

cordova platforms rm android
cordova platforms add [email protected]
cordova platforms rm ios
cordova platforms add [email protected]
Pierre-Alexis de Solminihac
fuente
¿Quisiste decir Android 5.1.1 ?
mix3d
Seguí los consejos de @Maxim y Pierre-Alexis de Solminihac, y por fin conseguí que mi aplicación funcionara bien. ¡Gracias!
Zalakain
0

Hay otro problema con la conexión. Algunas versiones de Android pueden conectarse pero otras no. Entonces hay otra solución

en AndroidManifest.xml:

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

Simplemente agregue 'android: usesCleartextTraffic = "true"'

y problema resuelto finalmente.

Enes Yurtlu
fuente