"Kein Meta-Tag für Inhaltssicherheitsrichtlinien gefunden." Fehler in meiner Phonegap-Anwendung

94

Nach dem Update von Cordova 5.0 in meinem System erstelle ich neue Anwendungen. Wenn ich meine Anwendung zu diesem Zeitpunkt auf einem Gerät getestet habe, wird im Konsolenprotokoll eine Fehlermeldung angezeigt:

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

Ich füge Meta im Kopfbereich hinzu

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

Aber auch hier habe ich den gleichen Fehler erhalten, in der Anwendung verwende ich das In-App-Browser-Plugin und 7 andere Website-Links.

Manikandan C.
quelle
3
Haben Sie das Plugin cordova-plugin-whitelist- github.com/apache/cordova-plugin-whitelist korrekt installiert ? Danach müssen Sie <allow-navigation href="http://*/*" />zu Ihrer config.xml
Keval
1
Danke Keval, nach dem Hinzufügen von <allow-navigation href = "http: // * / *" /> funktioniert meine Anwendung jetzt einwandfrei. Nochmals vielen Dank.
3
Wenn ein Fehler erstellt werden kann, wenn ein Zeichen im Code fehlt, warum lässt SO keine Änderungen zu, die weniger als sechs Zeichen umfassen? Dies ist ziemlich einfach zu beheben, ich habe nur versucht, jemand anderem ein paar Sekunden in der Zukunft zu retten. Am Ende des Inhaltsattributs des Meta-Tags fehlt ein doppeltes Anführungszeichen.
Jason D.

Antworten:

86

Nach dem Hinzufügen der Cordova-Plugin-Whitelist müssen Sie Ihre Anwendung anweisen , den Zugriff auf alle Webseiten-Links oder bestimmten Links zuzulassen, wenn Sie diese spezifisch halten möchten.

Sie können dies einfach zu Ihrer config.xml hinzufügen , die sich im Stammverzeichnis Ihrer Anwendung befindet:

Empfohlen in der Dokumentation:

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

oder:

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

Aus der Dokumentation des Plugins:

Navigations-Whitelist

Steuert, zu welchen URLs das WebView selbst navigieren kann. Gilt nur für Navigationen der obersten Ebene.

Macken: Unter Android gilt dies auch für Iframes für Nicht-http-Schemata.

Standardmäßig sind Navigationen nur zu Datei: // URLs zulässig. Um andere URLs zuzulassen, müssen Sie Ihrer config.xml Tags hinzufügen:

<!-- 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
quelle
@AmeePrajapati versuchen stackoverflow.com/questions/37044969/…
Kush Patel
38

Sie müssen ein CSP-Meta-Tag im Kopfbereich Ihrer App hinzufügen index.html

Gemäß https://github.com/apache/cordova-plugin-whitelist#content-security-policy

Inhaltssicherheitsrichtlinie

Steuert, welche Netzwerkanforderungen (Bilder, XHRs usw.) gestellt werden dürfen (direkt über die Webansicht).

Unter Android und iOS kann die Whitelist für Netzwerkanforderungen (siehe oben) nicht alle Arten von Anforderungen filtern (z. B. <video>& WebSockets werden nicht blockiert). Daher sollten Sie zusätzlich zur Whitelist auf allen Ihren Seiten ein Tag für Inhaltssicherheitsrichtlinien <meta> verwenden.

Unter Android beginnt die Unterstützung für CSP in der System-Webansicht mit KitKat (ist jedoch in allen Versionen mit Crosswalk WebView verfügbar).

Hier einige Beispiele für CSP-Deklarationen für Ihre .htmlSeiten:

<!-- 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
quelle
Wenn ich die CSP-Dekleration hinzufüge, schlägt der folgende Code für Google Map wie folgt fehl. Irgendeine Idee ? var pos = new google.maps.LatLng (position.coords.latitude, position.coords.longitude); // Zeile 173 11-09 21: 17: 30.724: D / SystemWebChromeClient (25692): Datei: ///android_asset/www/index.html: Zeile 173: Nicht erfasster Referenzfehler: Google ist nicht definiert
Shamaleyte
1
Ich musste die Meta-Tags mit /> schließen, um erkannt zu werden
Metamagikum
23

Ihr Meta-Tag enthält Fehler.

Deine:

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

Korrigiert:

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

Beachten Sie den Doppelpunkt nach "script-src" und das doppelte Anführungszeichen des Meta-Tags.

Kae Verens
quelle
3
Wenn ich <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"/>Live-Reload mit ionischem Framework
einbinde,
@codePlusPlus, um Ionic Livereload erneut zu aktivieren, fügen Sie http://localhost:35729der script-scr-Direktive und ws://localhost:35729der connect-src-Direktive hinzu.
Kolli
@kolli, kannst du zeigen, wie die neuen Verzeichnisse aussehen würden? Es ist nicht klar, wie sie zu den Richtlinien hinzugefügt werden sollen.
Jessewolfe
Ich sehe, dass die Informationen im Originalbeitrag sind. Aber klären: Beachten Sie, dass durch ‚Hinzufügen‘, das heißt , Sie ersetzen können script-src 'self' 'unsafe-inline' 'unsafe-eval'mit script-src 'self' http://localhost:35279 'unsafe-inline' 'unsafe-eval'und Sie würden eine neue Richtlinie mit einem Trenn Semikolon an das Ende des Inhalts Attribut hinzufügen:; script-src ws://localhost:35279
jessewolfe
Korrektur nach oben ... für den zweiten Teil sollte es sein ; connect-src 'self' ws://localhost:35279. Beachten Sie, dass ich eine Fehlermeldung erhalten habe (ich konnte aufgrund einer CSP-Verletzung nicht auf Datei: // <Pfad zu index.html> zugreifen), bis ich 'self' hinzugefügt habe.
Jessewolfe
2

Für mich war es genug, das Whitelist- Plugin neu zu installieren :

cordova plugin remove cordova-plugin-whitelist

und dann

cordova plugin add cordova-plugin-whitelist

Es sieht so aus, als ob die Aktualisierung von früheren Versionen von Cordova nicht erfolgreich war.

Maxime
quelle
1

Für mich war das Problem , dass ich veraltete Versionen der cordova wurde mit Android und iOS - Plattformen. Ein Upgrade auf [email protected] und [email protected] hat es also gelöst.

Sie können auf diese spezifischen Versionen aktualisieren:

cordova platforms rm android
cordova platforms add [email protected]
cordova platforms rm ios
cordova platforms add [email protected]
Pierre-Alexis de Solminihac
quelle
Meinten Sie Android 5.1.1 ?
mix3d
Ich folgte den Ratschlägen von @Maxim und Pierre-Alexis de Solminihac und brachte meine App endlich zum Laufen. Vielen Dank!
Zalakain
0

Es gibt ein weiteres Problem mit der Verbindung. Einige Android-Versionen können eine Verbindung herstellen, andere nicht. Es gibt also eine andere Lösung

in AndroidManifest.xml:

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

Fügen Sie einfach 'android: usedCleartextTraffic = "true" hinzu.'

und Problem endlich gelöst.

Enes Yurtlu
quelle