Кордова + JqueryMobile: Ajax не работает

(Были на нем в течение последних 6 часов) Я пытаюсь сделать телефонный пробел/приложение Cordova. Я не могу сделать Ajax-вызов через эмулятор Android (API ver 22, Android> 4.4). Вызов Ajax работает на рабочем столе Firefox, но не работает даже в браузере Chrome (с тем же исключением, что и в эмуляторе)

кордова --version 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, потому что это нарушает следующую директиву Политики безопасности контента: msgstr "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" ).

Ответы

Ответ 1

Мой плохой...

Я использовал шаблон html для примера Phonegap, у которого был следующий метатег, который блокировал 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 *">

Я не уверен, что такие вещи приводятся в примерном коде, это правильно или нет. Для меня это потратило мои 2 дня.

Ответ 2

Вы должны сохранить политику безопасности содержимого по соображениям безопасности:

Критический механизм безопасности - это политика с одинаковым исходным кодом. Это ограничивает, как документ или script из источника A может взаимодействовать с ресурсом из источника 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) - это дополнительный уровень безопасности, который помогает обнаруживать и смягчать определенные типы атак, включая Cross Scripting (XSS) и атаки на инъекции данных. Эти атаки используются для всего: от кражи данных до повреждения сайта или распространения вредоносного ПО. CSP разработан для обеспечения полной обратной совместимости; браузеры, которые его не поддерживают, по-прежнему работают с серверами, которые его реализуют, и наоборот. Браузеры, которые не поддерживают CSP, просто игнорируют его, функционируя как обычно, не соблюдая стандартную политику одинакового происхождения для веб-контента. Если сайт не предлагает заголовок 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)

  • @Harry Martel предоставил хорошую ссылку с примерами настройки политики безопасности контента.
  • Здесь - также статья с обзором свойств конфигурации.

Ответ 4

Сообщение об ошибке:

Отказался от подключения к http://some-address ', поскольку он нарушает следующую директиву политики безопасности содержимого: "данные по умолчанию" src ": gap: https://ssl.gstatic.com 'небезопасно-eval'". Обратите внимание, что "connect-src" явно не задан, поэтому "default-src" используется как резерв.

Кордова 4/5/6 команда "кордова создать"

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

Ответ 5

Просто поместите

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

Это помогло мне