Кордова + 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 предоставил хорошую ссылку с примерами настройки политики безопасности контента.
- Здесь - также статья с обзором свойств конфигурации.
Ответ 3
Вы можете проверить следующее:
https://github.com/apache/cordova-plugin-whitelist#content-security-policy
Существует множество конфигураций для политики безопасности контента.
Ответ 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 *">
Это помогло мне