web-dev-qa-db-fra.com

Cordova + JqueryMobile: Ajax échoue avec

(J'y suis depuis 6 heures) J'essaie de faire une différence de téléphone/application Cordova. Je ne parviens pas à effectuer un appel Ajax via l'émulateur Android (API version 22, Android> 4.4). L'appel Ajax fonctionne sur le bureau de Firefox mais échoue même sur le navigateur Chrome (avec la même exception que sur l'émulateur)

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);
        }
    });

L'erreur que je vois est:

Sur le débogueur distant chrome:

Refusé de se connecter à ' http://10.0.2.2/test/getLocation.php ' car elle enfreint la directive de sécurité du contenu suivante: "default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'" . Notez que 'connect-src' n'était pas explicitement défini, donc 'default-src' est utilisé comme solution de secours.

J'ai vu toutes sortes de paramètres sur les blogs et les messages, mais aucune utilisation. En mettre ici pour éliminer les suspects habituels.

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

AppManifest dispose d'un accès Internet:

<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" ).

Vraiment besoin de votre aide à ce sujet. Fatigué et blessé :(

16
user439521

Ma faute...

J'utilisais l'exemple de template HTML Phonegap ... qui avait la balise META suivante qui bloquait XSS.

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

Je ne suis pas sûr de mettre de telles choses dans un exemple de code, est la bonne chose ou non .. pour moi cela a perdu mes 2 jours.

25
user439521

Vous devez conserver la stratégie de sécurité du contenu pour des raisons de sécurité:

Un mécanisme de sécurité essentiel est la politique Même origine. Cela limite la manière dont un document ou un script de Origin A peut interagir avec une ressource de Origin B. Cela signifie que l'URL http://store.comany.com/dir/page.html peut accéder aux URL suivantes:

Mais pas ce qui suit:

(Plus d'informations sur: https://developer.mozilla.org/en-US/docs/Web/Security/Same-Origin_policy )

Cependant, les attaquants peuvent contourner cette politique avec Script intersite (XSS) 

Pour empêcher les attaques XSS et d'injection de données, vous pouvez utiliser Politique de sécurité du contenu (from Here ):

La politique de sécurité du contenu (CSP) est une couche de sécurité supplémentaire qui permet de détecter et d'atténuer certains types d'attaques, notamment les attaques XSS (Cross Site Scripting) et les attaques par injection de données. Ces attaques sont utilisées pour tout, du vol de données à la dégradation de site ou à la distribution de logiciels malveillants. CSP est conçu pour être totalement compatible avec les versions antérieures. les navigateurs qui ne le prennent pas en charge fonctionnent toujours avec les serveurs qui l'implémentent, et inversement. Les navigateurs qui ne prennent pas en charge CSP l'ignorent simplement, fonctionnant comme d'habitude, adoptant par défaut la stratégie standard de même origine pour le contenu Web. Si le site ne propose pas l'en-tête CSP, les navigateurs utilisent également la politique standard de même origine.



tl; dr

C'est en fait bien que cela soit déjà dans l'exemple de code. Mais peut-être que la recommandation serait bien =). Vous devriez vraiment garder cette configuration pour plus de sécurité.

Dans votre cas, vous devrez changer la configuration pour quelque chose comme:

<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 limite les origines auxquelles vous pouvez vous connecter (via XHR, WebSockets et EventSource). Vous devez indiquer ici "self" (pour les scripts se trouvant sur votre appareil) et l'URL distante (par exemple, http://10.0.2.2 ).

  1. @Harry Martel a fourni un lien Nice avec des exemples sur la façon de configurer votre politique de sécurité du contenu. 
  2. Ici est également un article avec une vue d'ensemble des propriétés de configuration. 
10
devz

Vous pouvez vérifier les éléments suivants:

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

Il existe de nombreuses configurations pour la stratégie de sécurité du contenu.

3
Harry Martel

Message d'erreur:

A refusé de se connecter à ' http: // une-adresse ' car elle enfreint la directive de sécurité du contenu suivante: "default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval' ". Notez que 'connect-src' n'a pas été défini explicitement, donc 'default-src' est utilisé comme solution de secours.

Cordova 4/5/6 commande "cordova create"

cordova create yourproject com.yoursite.yourproject yourproject

Génère des projets avec cette balise META

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

Vérifiez votre fichier index.html

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

ou

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

Vous pouvez commenter cette ligne, mais gardez bien à l’esprit que c’est une politique qui peut répondre aux besoins de votre propre application. En fait, il existe un lien que vous pouvez voir pour plus de conseils:

README: politique de sécurité du contenu

Quelques notes:

        * 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