Tokios pačios kilmės politikos problemos.

Ta pati kilmės taisyklė

Norėčiau, kad „wiki“ bendruomenė būtų gana HTML / JS, kuri būtų tos pačios kilmės , tikiuosi, padėti visiems, kurie ieško šios temos. Tai viena iš populiariausių temų, skirtų SO, ir joje nėra konsoliduotų wiki, todėl aš ateinu :)

Ta pati kilmės politika neleidžia dokumentui ar scenarijui, įkeltam iš vienos kilmės, gauti arba nustatyti dokumento nuosavybę iš kitos kilmės. Ši politika visiškai remiasi „Netscape Navigator 2.0“.

Kokie yra jūsų mėgstami būdai, kaip pasiekti tos pačios kilmės politiką?

Prašome pateikti išsamius pavyzdžius ir, pageidautina, susieti savo šaltinius.

150
19 июня '10 в 20:01 2010-06-19 20:01 David Titarenco paprašė birželio 19 d. 10 val. 20:01 2010-06-19 20:01
@ 11 atsakymų

document.domain metodas

  • Metodo tipas: iframe .

Atkreipkite dėmesį, kad tai yra „iframe“ metodas, kuriuo nustatoma document.domain vertė dabartiniam domeno priesagui. Jei taip, trumpesnis domenas naudojamas tolesniam kilmės patikrinimui. Pvz., Tarkime, kad dokumente esantis scenarijus http://store.company.com/dir/other.html atitinka šį pareiškimą:

 document.domain = "company.com"; 

Atlikus šį patvirtinimą, puslapis patikrins kilmę naudojant http://company.com/dir/page.html . Tačiau dėl tų pačių priežasčių bendrovė.com negali įdiegti document.domain kitose kompanijose.

Naudodami šį metodą, galėsite skambinti javascript iš iframe, gauto pagrindiniame domene esančiame subdomene. Šis metodas netinka tarpvalstybiniams ištekliams, nes tokios naršyklės kaip „Firefox“ neleis jums pakeisti document.domain į visiškai užsienio domeną.

Šaltinis: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript

Kryžminio kilmės išteklių dalijimosi metodas

  • Metodo tipas: AJAX .

Išteklių pasidalijimas skirtingiems šaltiniams (CORS) yra W3C darbinis projektas, kuriame apibrėžiama, kaip naršyklė ir serveris sąveikauja naudodamiesi šaltiniais per šaltinį. Pagrindinė CORS idėja yra naudoti pasirinktines HTTP antraštes, kurios leidžia naršyklei ir serveriui pakankamai pažinti vieni kitus. nustatyti, ar užklausa ar atsakymas bus sėkmingas arba nesėkmingas.

Paprasta užklausa, kuri naudoja GET arba POST be vartotojo antraštes ir kurios kūnas yra text/plain , prašymas siunčiamas su papildoma „ Origin antrašte. „Origin“ antraštėje yra užklausos pateikimo puslapio pradžia (protokolas, domeno pavadinimas ir prievadas), kad serveris galėtų lengvai nustatyti, ar jis turėtų reaguoti į atsakymą. Origin antraštės pavyzdys gali atrodyti taip:

 Origin: http://www.stackoverflow.com 

Jei serveris nusprendžia, kad užklausa turėtų būti leista, ji siunčia „ Access-Control-Allow-Origin antraštę, atkurdama tą patį šaltinio kodą, kuris buvo išsiųstas, arba * jei jis yra bendras išteklius. Pavyzdžiui:

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

Jei šios antraštės nėra arba pradinis pavadinimas neatitinka, naršyklė neleidžia užklausos. Jei viskas gerai, naršyklė apdoroja užklausą. Atkreipkite dėmesį, kad nei užklausose, nei atsakymuose nėra informacijos apie slapukus.

„Mozilla“ komanda savo CORS pranešime siūlo patikrinti su „ withCredentials nuosavybe, kad nustatytumėte, ar naršyklė palaiko CORS per XHR. Tada galite susieti su „ XDomainRequest objekto buvimu, kad XDomainRequest apimtų visas naršykles:

 function createCORSRequest(method, url){ var xhr = new XMLHttpRequest(); if ("withCredentials" in xhr){ xhr.open(method, url, true); } else if (typeof XDomainRequest != "undefined"){ xhr = new XDomainRequest(); xhr.open(method, url); } else { xhr = null; } return xhr; } var request = createCORSRequest("get", "http://www.stackoverflow.com/"); if (request){ request.onload = function() { // ... }; request.onreadystatechange = handler; request.send(); } 

Atkreipkite dėmesį, kad norint dirbti CORS, turite turėti prieigą prie bet kokio tipo serverio antraštės tvarkytojo ir negali tiesiog pasiekti jokio trečiosios šalies išteklių.

Šaltinis: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/

window.postMessage metodas

  • Metodo tipas: iframe .

Kai skambinama, window.postMessage sukelia MessageEvent tiksliniame >window.postMessage skambina iš įvykių tvarkytojo, anksčiau nustatyto laukimo ir pan.). MessageEvent turi pranešimo tipą, data nuosavybę, kuri nustatoma į pirmojo argumento eilutės reikšmę, pateiktą window.postMessage , Origin savybę, atitinkančią pagrindinio dokumento pradžią >window.postMessage metu window.postMessage ir source nuosavybės, kuri yra >window.postMessage .

Norėdami naudoti window.postMessage , turite prijungti įvykio klausytoją:

  // Internet Explorer window.attachEvent('onmessage',receiveMessage); // Opera/Mozilla/Webkit window.addEventListener("message", receiveMessage, false); 

Ir „ receiveMessage funkcija turi būti deklaruota:

 function receiveMessage(event) { // do something with event.data; } 

Neprisijungus iframe taip pat turėtų tinkamai siųsti įvykius per postMessage :

 <script>window.parent.postMessage('foo','*')</script> 

Bet kuris >nesugebėjimas patikrinti „ Origin ir, galbūt, source savybių, leidžia užpulti kryžminius scenarijus.

Šaltinis: https://developer.mozilla.org/en/DOM/window.postMessage

84
19 июня '10 в 21:06 2010-06-19 21:06 Atsakymą davė Davidas Titarencas birželio 19 d. 10 val. 21:06 2010-06-19 21:06

Atvirkštinis proxy metodas

  • Metodo tipas: Ajax

Nustatant paprastą atvirkštinio tarpinio serverio serverį, naršyklė galės naudoti „Ajax“ užklausų santykinius kelius, o serveris veiks kaip tarpinis serveris bet kurioje nuotolinėje vietoje.

Naudojant mod_proxy „Apache“, pagrindinė grįžtamojo tarpinio serverio nuostatų konfigūravimo direktyva yra „ ProxyPass . Jis paprastai naudojamas taip:

 ProxyPass /ajax/ http://other-domain.com/ajax/ 

Tokiu atveju naršyklė galės paprašyti /ajax/web_service.xml kaip santykinio URL, tačiau serveris jį aptarnaus kaip tarpinį serverį, skirtą http://other-domain.com/ajax/web_service.xml .

Vienas įdomus šio metodo bruožas yra tai, kad atvirkštinis proxy gali lengvai skleisti daugialypės grąžinimo turinio užklausas, veikdamas kaip apkrovos balansavimas .

41
19 июня '10 в 20:07 2010-06-19 20:07 Atsakymas duotas Danieliui Vassallo birželio 10 d. 20:07 2010-06-19 20:07

Aš naudoju JSONP.

Iš esmės jūs pridedate

 <script src="http://..../someData.js?callback=some_func"/> 

puslapyje.

Some_func () turėtų būti vadinamas, kad gautumėte pranešimą, kad duomenys yra.

17
19 июня '10 в 20:09 2010-06-19 20:09 Atsakymą pateikė Nicolas Viennot birželio 19 d. 10 val. 20:09 2010-06-19 20:09

AnyOrigin neveikė su kai kuriomis https svetainėmis, todėl aš tiesiog parašiau atviro kodo alternatyvą, vadinamą anyorigin.org, kuris, atrodo, gerai veikia su https.

Kodas github .

13
27 окт. atsakymas duotas ripper234 27 spalis. 2011-10-27 03:45 „11 at 3:45 am 2011-10-27 03:45

Aš negaliu reikalauti kreditų už šį įvaizdį, bet jis tinka viskas, ką aš žinau šiuo klausimu ir tuo pačiu metu siūlau šiek tiek humoro.

http://www.flickr.com/photos/iluvrhinestones/5889370258/

12
14 нояб. Atsakymą pateikė Mat Schaffer , lapkričio 14 d. 2011-11-14 05:50 '11, 5:50, 2011-11-14 05:50

Naujausias būdas įveikti tą pačią politiką, kaip ir aš, yra http://anyorigin.com/

Svetainė sukurta taip, kad paprasčiausiai suteiktumėte jai URL, ir sukuria jums javascript / jquery kodą, kuris leidžia jums gauti html / duomenis, nepriklausomai nuo jų kilmės. Kitaip tariant, jis pateikia bet kokį URL arba tinklalapį JSONP prašymu.

Man tai buvo gana naudinga :)

Čia pateikiamas bet kokio JavaScript kodo pavyzdys:

 $.getJSON('http://anyorigin.com/get?url=google.com function(data){ $('#output').html(data.contents); }); 
12
24 мая '11 в 3:03 2011-05-24 03:03 atsakymą pateikė rk1s gegužės 24 d., 11 d., 03:03 2011-05-24 03:03

JSONP primena:

„JSONP“ arba „„ JSON “pildymas - tai pagrindinio JSON duomenų formato papildymas, naudojimo modelis, leidžiantis pageidaujamam puslapiui ir prasmingiau naudoti JSON iš kito serverio nei pagrindinis serveris. JSONP yra alternatyva vėlesniam metodui, vadinamam kryžminio kilmės išteklių dalijimu.

3
19 июня '10 в 22:07 2010-06-19 22:07 atsakymą pateikė Sarfrazas birželio 10 d. 10:07 2010-06-19 22:07
1
20 апр. Chris Cinelli atsakymas, pateiktas balandžio 20 d 2012-04-20 02:56 '12 at 2:56 2012-04-20 02:56

Na, aš naudodavau garbaną php, kad galėčiau tai padaryti. Turiu interneto paslaugą, veikiančią 82.

 <?php $curl = curl_init(); $timeout = 30; $ret = ""; $url="http://localhost:82/put_val?val=".$_GET["val"]; curl_setopt ($curl, CURLOPT_URL, $url); curl_setopt ($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt ($curl, CURLOPT_MAXREDIRS, 20); curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5"); curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout); $text = curl_exec($curl); echo $text; ?> 

Čia yra javascript, kuris vadina PHP failą.

 function getdata(obj1, obj2) { var xmlhttp; if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest(); else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4  xmlhttp.status==200) { document.getElementById("txtHint").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","phpURLFile.php?eqp="+obj1+" xmlhttp.send(); } 

Mano HTML paleidžiamas WAMP 80 porte. Taigi, čia mes einame tą pačią kilmės politiką: -)

1
12 апр. atsakymas duotas Harihb Bal 12 2011-04-12 12:05 '11 12:05 PM 2011-04-12 12:05

Asmeniškai, window.postMessage yra patikimiausias metodas, kurį rasta šiuolaikinėms naršyklėms. Turite šiek tiek daugiau dirbti, kad įsitikintumėte, jog nepaliksite atviri XSS atakoms, tačiau tai yra pagrįstas kompromisas.

Taip pat yra keletas populiarių „Javascript“ įrankių, kuriuose yra window.postMessage , kurie suteikia panašias funkcijas ir senesnėms naršyklėms, naudojant kitus aukščiau aprašytus metodus, papildinius.

1
19 июня '10 в 20:06 2010-06-19 20:06 Justin Niessner atsakė į birželio 19 '10 d. 20:06 2010-06-19 20:06

Pateikiame keletą problemų ir tos pačios kilmės politikos paaiškinimų:
„Thiru“ tinklaraštis - naršyklės naršyklės apėjimo politika

1
12 дек. Atsakymą pateikė user1094140 12 Dec. 2011-12-12 19:37 '11, 19:37 PM 2011-12-12 19:37