web-dev-qa-db-de.com

Cordova + JqueryMobile: Ajax schlägt mit fehl

(War schon die letzten 6 Stunden dabei) Ich versuche, eine Phonegap/Cordova App zu erstellen. Ich kann keinen Ajax-Aufruf über den Android-Emulator durchführen (API Version 22, Android> 4.4). Der Ajax-Aufruf funktioniert auf Firefox-Desktops, schlägt jedoch auch im Chrome-Browser fehl (mit der gleichen Ausnahme wie im Emulator).

cordova - Version 5.0.0

Code:

$.ajax({
    url: serverUrl,
    type: 'GET',
    contentType: "application/json",
    async: true,
    dataType: 'jsonp',
    callback: 'callback',
    jsonpCallback: 'yourcallback',
    crossDomain: true,
    success: function (result) {
            $("#message").html("location sent");
        },
        error: function (request, error) {
            alert('Error ' + error);
        }
    });

Der Fehler, den ich sehe, ist:

Auf dem Chrome-Remote-Debugger:

Die Verbindung zu ' http://10.0.2.2/test/getLocation.php ' wurde abgelehnt, weil Es verstößt gegen die folgende Richtlinie zur Inhaltssicherheitsrichtlinie: "default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'" . Beachten Sie, dass 'connect-src' nicht explizit gesetzt wurde, also 'default-src' .__ ist. als Fallback verwendet.

Ich habe alle Arten von Einstellungen in Blogs und Posts gesehen, aber keine Verwendung. Hier einige setzen, um die üblichen Verdächtigen zu entfernen.

$.support.cors = true;
$.mobile.allowCrossDomainPages = true;

AppManifest hat Internetzugang:

<uses-permission Android:name="Android.permission.INTERNET" />

Config.xml:

<access Origin="*" /> (have tried all variation, with putting actual server name here like "http://10.0.2.2" ).

Brauche wirklich deine Hilfe dazu. Müde und verletzt :(

16
user439521

Mein Fehler...

Ich verwendete Phonegap als Beispiel für eine HTML-Vorlage, die den folgenden Meta-Tag hatte, der XSS blockierte.

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">

Ich bin nicht sicher, solche Dinge in einen Beispielcode zu setzen, ist das Richtige oder nicht .. Für mich waren es meine 2 Tage.

25
user439521

Sie sollten die Inhaltssicherheitsrichtlinie aus Sicherheitsgründen beibehalten:

Ein kritischer Sicherheitsmechanismus ist die Same-Origin-Richtlinie. Dies begrenzt, wie ein Dokument oder Skript aus Origin A mit einer Ressource aus Origin B interagieren kann. Dies bedeutet, dass die URL http://store.comany.com/dir/page.html auf folgende URLs zugreifen kann:

Aber nicht das Folgende:

(Mehr unter: https://developer.mozilla.org/en-US/docs/Web/Security/Same-Origin_policy )

Angreifer können diese Richtlinie jedoch mit Cross-Site-Scripting (XSS) umgehen. 

Um Angriffe gegen XSS und Dateninjektion zu verhindern, können Sie Content Security Policy (von Here ) verwenden:

Content Security Policy (CSP) ist eine zusätzliche Sicherheitsebene, mit der bestimmte Arten von Angriffen, einschließlich Cross Site Scripting (XSS) und Dateninjektionsangriffe, erkannt und abgemildert werden können. Diese Angriffe werden für alles verwendet, von Datendiebstahl über die Entfernung von Websites bis hin zur Verbreitung von Malware. CSP ist so konzipiert, dass es vollständig abwärtskompatibel ist. Browser, die es nicht unterstützen, funktionieren immer noch mit Servern, die es implementieren, und umgekehrt. Browser, die CSP nicht unterstützen, ignorieren dies einfach und funktionieren wie gewohnt. Dabei wird die Standardrichtlinie für Origin von Same-Origin für Webinhalte verwendet. Wenn die Site den CSP-Header nicht bietet, verwenden Browser ebenfalls die Standardrichtlinie "Same-Origin".



tl; dr

Es ist eigentlich schön, dass dies bereits im Beispielcode enthalten ist. Aber lohnt sich vielleicht Nizza =). Sie sollten diese Konfiguration für mehr Sicherheit beibehalten.

In Ihrem Fall müssten Sie die Konfiguration folgendermaßen ändern:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src 'self' http://10.0.2.2">

connect-src begrenzt die Herkunft, zu der Sie eine Verbindung herstellen können (über XHR, WebSockets und EventSource). Sie müssen hier "self" (für die Scripts, die sich auf Ihrem Gerät befinden) und die Remote-URL (z. B. http://10.0.2.2 ) angeben.

  1. @Harry Martel hat einen Link zu Nice mit Beispielen zur Konfiguration Ihrer Inhaltssicherheitsrichtlinie bereitgestellt. 
  2. Hier ist auch ein Artikel mit einer Übersicht über die Konfigurationseigenschaften. 
10
devz

Sie können Folgendes überprüfen:

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

Es gibt viele Konfigurationen für Inhaltssicherheitsrichtlinien.

3
Harry Martel

Einfach platzieren

<meta http-equiv="Content-Security-Policy" content="script-src * data: https://ssl.gstatic.com 'unsafe-inline' 'unsafe-eval'; media-src *">

Es hat mir geholfen

Fehlermeldung:

Die Verbindung zu ' http: // some-address ' wurde abgelehnt, da die folgende Richtlinie zur Richtlinie zur Inhaltssicherheit verletzt wird: "default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval' ". Beachten Sie, dass 'connect-src' nicht explizit gesetzt wurde. Daher wird 'default-src' als Fallback verwendet.

Cordova 4/5/6 "Cordova create" -Befehl

cordova create yourproject com.yoursite.yourproject yourproject

Erzeugt Projekte mit diesem Meta-Tag

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">

Überprüfen Sie Ihre index.html-Datei

vi YourProject/plattforms/ios/www/index.html

oder

vi YourProject/plattforms/Android/www/index.html

Sie können diese Zeile auskommentieren, denken Sie jedoch nur daran, dass dies eine Richtlinie ist, die Sie an die Anforderungen Ihrer eigenen App anpassen könnten. Es gibt tatsächlich einen Link, der weitere Informationen enthält:

README: Inhaltssicherheitsrichtlinie

Einige Notizen:

        * 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 inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
            * Enable inline JS: add 'unsafe-inline' to default-src
0
d1jhoni1b