2012-07-02 4 views
10

Я работаю над веб-приложением для мобильных устройств, а jsonp довольно крут для междоменного запроса, но API-сервер не поддерживает параметр обратного вызова. Поэтому я просто могу использовать json для извлечения данных с удаленного сервера.jQuery - Как удалить ограничение перекрестного домена

Я пробовал json в jQuery, кажется, что он не поддерживает междоменный запрос. Я пробовал использовать функцию ajax-запроса на сафари, и он хорошо работает в междоменном пространстве, поэтому могу ли я удалить ограничение междоменной для json-запроса в jQuery? (не jsonp, только json), и как это сделать?

Или есть альтернативная простая библиотека ajax (кросс-браузер) и может использовать json для междоменного запроса.

+1

Вы будете вероятно, найдет ответ на ваш вопрос среди ответов на [Способы обхода политики одного и того же происхождения] (http://stackoverflow.com/questions/3076414/ways-to-circumvent-the-same-origin-policy). Ваш вопрос кажется по существу тем же. –

+0

Я использую YQL + jQuery для доступа к содержимому перекрестного домена. –

ответ

31

Same Origin Policy

Вы пытаетесь обойти Same Origin Policy. Он встроен в каждый браузер и обычно не является чем-то, что вы можете или хотите отключить/обмениваться/etc. Это очень важный договор безопасности между вашим сайтом, пользователем и браузером пользователя.

CORS (возможно)

CORS позволяет ваш веб-сервер, чтобы сообщить браузеру/клиенты, которые имеют доступ к другому домену допустимо. Это делается путем иметь следующий вывод заголовка HTTP на вашем веб-сервере

Access-Control-Allow-Origin: http://www.example.com 

Если вы не можете контролировать свои заголовки HTTP, то вы не можете использовать CORS. Реализация этого является спецификой языка/структуры.

Обратите внимание, что вы должны проверить, чтобы browser compatibility был ограничен у IE8/9. Также имейте в виду, что это потенциальный вектор атаки. Он позволяет откликам сторонних сайтов выполнять атаки XSS, если вы безответственно используете данные ответа.

JSONP (возможно)

JSONP умный способ передачи и получения данных между серверами путем динамического добавления script тег с src atrribute равным "yoururl.com?<your parameter data>" на вашей странице. Это единственный законный способ совершить такой подвиг без веб-прокси (см. Ниже) или апплета (Flash/Java). Однако у него есть свои собственные риски безопасности, если вы не являетесь поставщиком обоих концов запроса. Помните, что JSONP позволяет удаленному серверу выполнять код в вашем контексте, и вы должны быть very careful who you give that power to.

«Vanilla» AJAX (не возможно)

Если вы не используете JSONP для извлечения данных, то вы, скорее всего, пытается использовать запрос AJAX для извлечения данных. Запросы AJAX также подчиняются одной и той же политике происхождения. Библиотеки JavaScript (например, jQuery, Prototype, Dojo и т. Д.) Не могут обойти эту политику как базовое поведение для Ajax-запроса. Тем не менее, они могут поддерживать JSONP (который помнит сейчас, это не AJAX).

AJAX ж/Web Proxy (возможно)

Если вы хотите, чтобы запрашивать данные с другого сервера, вы можете направить запрос. Сервер вашего основного сайта будет действовать как прокси.Вам нужно будет сделать запрос AJAX на свой собственный сервер, этот код на стороне сервера затем отправит запрос другому домену и затем отправит ответ на ваш скрипт с помощью ответа на вызовы AJAX.

Это обычная модель и подробно описана здесь как Web Proxy Pattern и прикольная дружественная Yahoo одна here (but remember it's Yahoo specific, just take the general idea). Это, однако, зависит от языка на стороне сервера. Общая реализация будет одинаковой, однако код для этого будет зависеть от выбранного вами языка на стороне сервера (PHP, Ruby, Python, C и т. Д.). На некоторых языках уже есть библиотеки/modules/etc для поддержки такого шаблона.

Flash (возможно, не по умолчанию)

Вспышка в состоянии по умолчанию не поддерживает перекрестные запросы домена. Он может быть включен в Flash7 + с cross-domain policy files, но настоятельно рекомендуется против. Ваш скрипт должен будет взаимодействовать с Flash API, который будет делать запросы и возвращать данные на ваш JavaScript.

Java Applet (возможно, не по умолчанию)

Java также подвергается той же политики происхождения, но имеет ту же работу вокруг вспышки в качестве described here on its release.

Различных другие «писаки»

Есть другие взломы там, но они, как правило требуют, чтобы контролировать оба конца или имеют согласованный стандарт связи. Например, «window.name» взломает. Я не предлагаю большинство этих методов.

Другие решения

Другой вопрос похож на это было предложено. В нем изложены некоторые другие методы, которые я не покрываем: Ways to circumvent the same-origin policy

Лучшие решения

  1. CORS - если вы доверяете 3 участника
  2. Web Proxy - если вы не

Веб-прокси на вашем собственном домене может позволить вам дезинфицировать извлекаемые данные, он обеспечивает максимальную защиту вашего пользователя. Однако, если вы делаете нулевую санитарию, она не более безопасна, чем любой из описанных здесь методов. Если вы выполняете какой-либо веб-прокси-сервер, убедитесь, что его запросы ограничены и с сайтов, которые вы хотите. Иначе вы, по сути, будете создавать open proxy, которые могут быть подвергнуты злоупотреблениям пользователями, если они обнаружены, и вы получите правовые проблемы.

4

Довольно липкий способ сделать это было бы то, что я сделал ниже, чтобы включить перекрестное выполнение сайта на персональный проект

Обратите внимание, это будет сделано на принимающем сервере не представляемый один

if ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') === FALSE) 
     die('You shouldn\'t be here'); 

    header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']); 
    header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); 
    header('Access-Control-Max-Age: 1000'); 
    header('Access-Control-Allow-Headers: Content-Type'); 

, если вы хотите, чтобы быть немного более безопасным, вы могли бы сделать

if ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') === FALSE) 
     die('You shouldn\'t be here'); 

switch($_SERVER['HTTP_ORIGIN']){ 
case 'domain.com': 
case 'whatever.com': 
     header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']); 
     header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); 
     header('Access-Control-Max-Age: 1000'); 
     header('Access-Control-Allow-Headers: Content-Type'); 
} 

Надеется, что это помогает мне потребовалось навсегда, чтобы понять это лолам.

+8

Вы можете добавить описание [ссылки] (http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) к описываемому методу, а именно [CORS] (http://www.w3.org/TR/ CORS /). –

6

У меня была та же проблема. Попытка получить json с сервера, к которому я не имел доступа (=> нет JSONP).

Я нашел http://benalman.com/projects/php-simple-proxy/ Добавьте php-прокси на свой сервер и сделайте вызов ajax к этому файлу. «Любые параметры GET, которые должны быть переданы удаленному ресурсу URL-адреса, должны быть ур-кодированы в этом параметре».

$.ajax({ 
    type: 'GET', 
    url:'proxy.php?url=http://anyDomain.com?someid=thispage', 
    dataType: "json", 
    success: function(data){ 
     // success_fn(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // error_fn(jqXHR, textStatus, errorThrown); 
    } 
}); 

где proxy.php (файл с Беном Alman) размещается в домене


Alternative (который я нашел, чтобы быть вторым лучше всего к этому): http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

+0

Хорошо, спасибо! – Tom

Смежные вопросы