Почему возможно использование междоменных скриптов для локальных файлов на мобильном устройстве?

Что я сделал:

Я создал index.html с xss.js, который вызывает функцию jQuery.get (). Затем я открыл index.html в браузере (Firefox, Chrome, IE и Opera) и попытался вызвать запрос ajax.

Код

Вот мой index.html:

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>XSS</title> <script src="libs/js/jquery-1.7.2.js" ></script> </head> <body> <button id="request" >fire</button> <script src="libs/js/xss.js" ></script> </body> </html> 

И мой xss.js:

 function init() { $('#request').click(loadContent); } function loadContent() { $.get('http://www.example.com/', null, function(data){ alert('success'); $('body').html(data); }, 'html'); } init(); 

Если я открою index.html в браузере ( file:///C:/workspace/xss%20test/index.html ), после нажатия кнопки получаю следующие ответы:

  • Firefox : нет кода ошибки ( HTTP/1.1 200 OK ), но ответ пуст

  • IE : нет ответа

  • Chrome : XMLHttpRequest cannot load http://www.example.com/. Origin null is not allowed by Access-Control-Allow-Origin. XMLHttpRequest cannot load http://www.example.com/. Origin null is not allowed by Access-Control-Allow-Origin.

  • Opera : нет кода ошибки ( HTTP/1.1 200 OK ) и полного html-файла в качестве ответа, но ничего не будет отображаться (обратный вызов успеха не запускается)

Этот код загрузит index.html в мой Android WebView:

 public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView webview = (WebView) findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); webview.setWebChromeClient(new WebChromeClient()); webview.setWebViewClient(new WebViewClient()); webview.loadUrl("file:///android_asset/www/index.html"); } } 

Вызывает обратный вызов успеха, а также отображает содержимое www.example.com в теле моего файла index.html после index.html кнопки.

(То же самое возможно на устройствах iPhone – я не тестировал это на устройствах Windows Phone) .

Tl; dr – Вопрос:

Почему можно загружать контент с удаленного сервера на мое мобильное устройство – разве это не сценарий междоменного скрипта, или я чего-то не хватает?

Из-за ограничений безопасности браузера большинство запросов «Ajax» подчиняются одной и той же политике происхождения; Запрос не может успешно извлекать данные из другого домена, субдомена или протокола.

Также: Почему Opera получает ответ, но ничего не отображает?

Заранее спасибо.

На самом деле ваш код не работает в мобильных браузерах, включая ICS и Chrome на Android, а также Safari на iPhone. Однако то, что вы показали, не загружает html-файл в браузере – он загружает его в WebView – совсем другое животное.

WebView или Webkit – это просто виджет пользовательского интерфейса, который реализует функции, подобные браузерам. Они не браузеры. Они не предоставляют такие вещи, как обычный браузер Chrome, и по умолчанию у них очень либеральные модели безопасности по сравнению с браузерами. Хотя вы можете добавить код для реализации таких вещей, как политика с одним и тем же источником и т. Д., Если хотите.

Это не только на мобильных устройствах. Попробуйте создать приложение Webkit на рабочем столе, и вы увидите то же самое.

Я считаю, что причиной этого является то, что WebViews и Webkits предполагается использовать для отображения контента, на который вы контролируете 100%. В отличие от браузеров, где пользователи могут вводить любой URL-адрес в адресной строке. Поэтому вам решать ветеринарную погоду, что вы загружаете, безопасны или нет.