web-dev-qa-db-ja.com

Cordova + JqueryMobile:Ajaxが失敗する

(過去6時間使用していた)電話ギャップ/ Cordovaアプリを作成しようとしています。 Android emulator(API ver 22、Android> 4.4)を介してAjax呼び出しを行うことができません。Ajax呼び出しはFirefoxデスクトップで機能しますが失敗しますchromeブラウザでも)(エミュレータと同じ例外を除く)

cordova-バージョン5.0.0

コード:

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

私が見るエラーは:

chromeリモートデバッガ:

次のコンテンツセキュリティポリシーディレクティブに違反しているため、「 http://10.0.2.2/test/getLocation.php 」への接続を拒否しました:「default-src 'self' data:gap: https://ssl.gstatic.com 'unsafe-eval' "。 「connect-src」は明示的に設定されていないため、「default-src」がフォールバックとして使用されることに注意してください。

ブログや投稿にあらゆる種類の設定が表示されていますが、使用されていません。通常の容疑者を取り除くためにここにいくつかを置く。

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

AppManifestはインターネットにアクセスできます。

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

私の悪い...

XSSをブロックする次のメタタグが含まれるPhonegapサンプルHTMLテンプレートを使用していました。

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

サンプルコードにそのようなものを入れることが正しいかどうかはわかりませんが、私にとっては2日間無駄になりました。

25
user439521

セキュリティ上の理由から、コンテンツセキュリティポリシーを保持する必要があります。

重要なセキュリティメカニズムはSame-Originポリシーです。これにより、Origin AのドキュメントまたはスクリプトがOrigin Bのリソースと対話する方法が制限されます。これは、URL http://store.comany.com/dir/page.html が次のURLにアクセスできることを意味します:

しかし、次のことではありません。

(詳細: https://developer.mozilla.org/en-US/docs/Web/Security/Same-Origin_policy

ただし、攻撃者は クロスサイトスクリプティング(XSS)を使用してこのポリシーをバイパスできます

XSSおよびデータインジェクション攻撃を防ぐために、コンテンツセキュリティポリシーここから から)を使用できます。

コンテンツセキュリティポリシー(CSP)は、クロスサイトスクリプティング(XSS)やデータインジェクション攻撃など、特定の種類の攻撃を検出して軽減するのに役立つセキュリティの追加レイヤーです。これらの攻撃は、データの盗難からサイトの改ざんやマルウェアの配布まで、すべてに使用されます。 CSPは完全に下位互換性を持つように設計されています。それをサポートしていないブラウザは、それを実装するサーバーでも動作し、逆もまた同様です。 CSPをサポートしていないブラウザーは、それを単に無視し、通常どおり機能し、デフォルトでWebコンテンツの標準の同じオリジンポリシーを使用します。サイトがCSPヘッダーを提供していない場合、ブラウザーは同様に標準の同じオリジンポリシーを使用します。



tl; dr

これがすでにサンプルコードに含まれているのは、実際にはいいことです。しかし、たぶん称賛されるでしょうニース=)。セキュリティを強化するために、この構成を維持する必要があります。

あなたの場合、設定を次のように変更する必要があります:

<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は、(XHR、WebSockets、およびEventSourceを介して)接続できるオリジンを制限します。ここに「自分」(デバイスにあるスクリプト用)とリモートURL(例: http://10.0.2.2 )を入力する必要があります

  1. @Harry Martelは、コンテンツセキュリティポリシーの設定方法の例を含む素晴らしいリンクを提供しました。
  2. ここ も設定プロパティの概要を説明した記事です。
10
devz

次のことを確認できます。

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

コンテンツセキュリティポリシーには多くの構成があります。

3
Harry Martel

置くだけ

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

それは私を助けました

エラーメッセージ:

次のコンテンツセキュリティポリシーディレクティブに違反しているため、「 http:// some-address 」への接続を拒否しました: "default-src 'self' data:gap: https:// ssl .gstatic.com 'unsafe-eval' "。 「connect-src」は明示的に設定されていないため、「default-src」がフォールバックとして使用されることに注意してください。

Cordova 4/5/6の「cordova create」コマンド

cordova create yourproject com.yoursite.yourproject yourproject

このメタタグでプロジェクトを生成しています

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

Index.htmlファイルを確認する

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

または

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

あなたはその行をコメントアウトすることができますが、これはあなた自身のアプリのニーズに合わせることができるポリシーであることを念頭に置いてください、実際にあなたはより多くのガイダンスのために見ることができるリンクがあります:

README:コンテンツセキュリティポリシー

いくつかのメモ:

        * 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