Политика одинакового происхождения

Возможно, некоторые из вас помогут мне лучше понять политику одинакового происхождения в javascript.

Такая же политика происхождения определяется следующим образом (http://en.wikipedia.org/wiki/Same_origin_policy):

В вычислениях одна и та же политика происхождения является важной концепцией безопасности для ряда языков программирования на стороне браузера, таких как JavaScript. Политика разрешает скриптам, запущенным на страницах, происходящих с одного и того же сайта, получать доступ к методам и свойствам друг друга без каких-либо конкретных ограничений, но предотвращает доступ к большинству методов и свойств на страницах на разных сайтах.

Я развернул приложение GWT в Google App Engine с URL-адресом

http://metalsandstocks.appspot.com

Поскольку GWT компилирует всю java в javascript, это означает, что мое приложение развернуто как javascript. Поскольку это приложение ajax, я предположил, что от него потребуется придерживаться той же политики происхождения. Приложение использует ajax для звонков в другой домен (http://finance.yahoo.com), чтобы в режиме реального времени получать котировки акций для отправки пользователю. Приложение работает, как описано, но у него другой домен, чем тот, который он запрашивает для его обновлений. Нарушает ли это приложение ту же политику происхождения? Почему или почему нет?


person GimmeShelter    schedule 03.05.2011    source источник


Ответы (4)


Вы можете получить Yahoo Finance, используя JSONP, так что это определенно то, что вы используете.

Пример URL-адреса ...

http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=Apple&callback=YAHOO.Finance.SymbolSuggest.ssCallback

Когда запрос загружен, он вызовет обратный вызов, который вы определяете в параметре GET. Это позволяет обойти политику одного и того же происхождения при условии, что служба поддерживает JSONP.

В качестве альтернативы некоторые люди используют свой сервер в качестве прокси.

person alex    schedule 03.05.2011

CORS (Cross-Origin Resource Sharing) - это стандартный способ разрешить междоменные вызовы AJAX.

Все очень просто. Например, если на страницу добавлен HTTP-заголовок Access-Control-Allow-Origin: * (например, с использованием PHP), тогда JavaScript из любого домена сможет читать страницу с помощью AJAX. Если такой заголовок отсутствует, политика одного и того же происхождения предотвратит чтение страницы вызовами AJAX из другого домена.

Используя CORS, владелец страницы (например, страницы, которая предоставляет определенные данные или API) может предоставить эту страницу (и только эту страницу) другим пользователям для вызова из их собственных доменов. Принцип состоит в том, что если владелец страницы явно говорит «это нормально для других иметь доступ к моим материалам», то CORS разрешает это. В противном случае предполагается, что используется политика одного и того же сайта.

См .: http://www.w3.org/TR/cors/.

person Oliver Moran    schedule 03.05.2011

Доступ к данным между службами - это не то же самое, что вызов функции JavaScript, определенной в одном домене, из другого домена. введите описание изображения здесь

Другими словами, я думаю, вы путаете «политику одного и того же происхождения» (которая предотвращает, например, одну вкладку в моем браузере от вызова функции JS, определенной на сайте в другой вкладке моего браузера) с JS, получающим данные из URL-адреса. (например, цены на акции Yahoo).

person jefflunt    schedule 03.05.2011

Вот что вам нужно сделать: JSONP.

Из-за указанной политики вы не можете отправить запрос AJAX на Yahoo, но есть обходные пути. А именно тег скрипта, который может сделать запрос куда угодно.

Например, предположим, что вы хотите сделать запрос в Yahoo, когда пользователь нажимает кнопку «GO». Вам нужно добавить обработчик событий, чтобы перехватить событие щелчка пользователя, а затем добавить новый тег скрипта в раздел заголовка модели DOM. URL тега скрипта важен, в нем должен быть параметр обратного вызова, например:

http://helloasdf.cloudfoundry.com/get.tokens?callback=xss

Обратите внимание, что обратным вызовом может быть любое произвольное имя функции. Ответ будет таким:

xss(["asdf"])

это означает, что функция xss в вашем коде будет передана ["asdf"].

Или с API Yahoo;

http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=GS&callback=YAHOO.Finance.SymbolSuggest.ssCallback

обратите внимание на callback = YAHOO.Finance.SymbolSuggest.ssCallback, он вызовет эту функцию, когда запрос вернется:

YAHOO.Finance.SymbolSuggest.ssCallback({"ResultSet":{"Query":"gs","Result":[{"symbol":"GS","name": "The Goldman Sachs Group, Inc.","exch": "NYQ","type": "S","exchDisp":"NYSE","typeDisp":"Equity"},{"symbol":"^GSPC","name": "S&P 500 INDEX,RTH","exch": "SNP","type": "I","typeDisp":"Index"},{"symbol":"GSS","name": "Golden Star Resources, Ltd.","exch": "ASE","type": "S","exchDisp":"AMEX","typeDisp":"Equity"},{"symbol":"^GSPTSE","name": "S&P/TSX Composite index (Interi","exch": "TOR","type": "I","exchDisp":"Toronto","typeDisp":"Index"},{"symbol":"GSK","name": "GlaxoSmithKline plc","exch": "NYQ","type": "S","exchDisp":"NYSE","typeDisp":"Equity"},{"symbol":"GSX","name": "Gasco Energy Inc.","exch": "ASE","type": "S","exchDisp":"AMEX","typeDisp":"Equity"},{"symbol":"OIL","name": "iPath S&P GSCI Crude Oil TR Index ETN","exch": "PCX","type": "E","typeDisp":"ETF"},{"symbol":"GSIC","name": "GSI Commerce Inc.","exch": "NMS","type": "S","exchDisp":"NASDAQ","typeDisp":"Equity"},{"symbol":"GST","name": "Gastar Exploration, Ltd.","exch": "ASE","type": "S","exchDisp":"AMEX","typeDisp":"Equity"},{"symbol":"GSI","name": "General Steel Holdings, Inc.","exch": "NYQ","type": "S","exchDisp":"NYSE","typeDisp":"Equity"}]}})

Вот пример js, который вам нужен для динамического добавления тега скрипта:

 var headLoc = document.getElementsByTagName("head").item(0);
 var scriptObj = document.createElement("script");
 var token="localstring"
 var url="http://helloasdf.cloudfoundry.com/get.tokens?callback=xssCallback";
  // Add script object attributes
  scriptObj.setAttribute("type", "text/javascript");
  scriptObj.setAttribute("charset", "utf-8");
  scriptObj.setAttribute("src", url);
  scriptObj.setAttribute("id", 'asf12');

  headLoc.appendChild(scriptObj);

Я подробно описал этот процесс здесь: http://eggie5.com/22-circumvent-same-origin-policy

person eggie5    schedule 03.05.2011