Та же политика происхождения - PullRequest
5 голосов
/ 03 мая 2011

Возможно, некоторые из вас могут помочь мне лучше понять политику одинакового происхождения 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)in чтобы получать котировки акций в реальном времени для отображения пользователю.Приложение работает, как описано, но оно имеет домен, отличный от того, к которому оно обращается за обновлениями.Это приложение нарушает ту же политику происхождения?Почему или почему нет?

Ответы [ 4 ]

5 голосов
/ 03 мая 2011

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

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

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

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

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

4 голосов
/ 03 мая 2011

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

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

4 голосов
/ 03 мая 2011

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

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

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

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

0 голосов
/ 03 мая 2011

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

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

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

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, который вам нужно динамически добавитьтег script:

 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

...