Preuzimanje resursa sa različitih izvora

Из Википедије, слободне енциклопедије

Preuzimanje resursa sa različitih izvora - u daljem tekstu PRRI (енгл. Cross-origin resource sharing - CORS) je mehanizam koji dopušta da se resursi koji nisu dostupni (kao što su fontovi, JavaScript kod, i slično), a koji se nalaze na veb stranici, zahtevaju od drugog domena koji je van onog iz kog je zahtev za resursom potekao.

Veb stranica može slobodno da ugrađuje slike, stil, skriptove, video i ostale potrebne sadržaje (kao što je Adobe Flash) sa bilo kog drugog domena. Međutim, ugrađeni veb fontovi i AJAX (XMLHttpRequest) zahtevi su tradicionalno bili ograničeni na pristup sa istog domena kao roditelja veb stranice (zbog bezbednosti). Zahtevi za AJAX-om sa različitih domena su podrazumevano zabranjeni zbog mogućnosti da se vrše napredni zahtevi (POST, PUT i DELETE, kao i druge vrste HTTP zahteva, uključujući i specifična HTTP zaglavlja) što može dovesti do raznih bezbednosnih problema.

Kako PPRI funkcioniše[уреди]

PRRI opisuje način na koji pretraživač i server mogu da komuniciraju i određuje da li je bezbedno da se dozvole zahtevi za sadržajem sa drugih domena. Ovaj vid dozvoljava više slobode i funkcionalnosti nego zahtevi sa izvora istog porekla, ali je mnogo bezbedniji nego kad bi se dopustili svi vidovi razmene između domena. Takođe, ovaj vid komunikacije je preporucen od strane W3C.

PRRI standard opisuje nova HTTP zaglavlja koja omogućuju pregledačima i serverima da zahtevaju udaljene veb adrese samo kada imaju dozvolu. Iako neke od potvrda i autorizacija mogu biti izvedena od strane servera, uglavnom se od pretraživača očekuje da podržava ta zaglavlja i restrikcije koje oni donose[1].

Za AJAX i HTTP metode koje mogu da izmene informacije, specifikacija nalaže da sami pretraživači ,,prelete" zahtev, zahtevajući podržane metode od servera sa HTTP OPTIONS zaglavljem za zahteve, a potom, po potvrdi od strane servera, šalju stvarne zahteve sa stvarnim HTTP metodom za zahteve. Serveri takođe mogu da obaveste klijenta da li bi "potvrde"(uključujući kolačiće i HTTP podatke za verifikaciju) trebalo da budu poslate zajedno sa zahtevima.[1]

Jednostavan primer[уреди]

Bazičan PRRI se sastoji iz dva koraka:

  1. Pregledač šalje zahtev sa Origin HTTP zaglavljem. Dato zaglavlje sadrži domen koji je opslužio roditeljsku stranicu. Kada stranica sa http://www.foo.com pokuša da pristupi korisničkim podacima na bar.com, sledeći zahtev sa šalje ka bar.com:
Origin: http://www.foo.com
  1. Server može da odgovori sa :
    • Access-Control-Allow-Origin zaglavljem čime stavlja do znanja koje veb stranice su dostupne. Na primer:
      Access-Control-Allow-Origin: http://www.foo.com
      
    • Stranicom za grešku
    • Access-Control-Allow-Origin zaglavljem sa naznakom da dozvoljava sve domene:
      Access-Control-Allow-Origin: *
      

Ovo generalno nije odgovarajući način kada se koristi polisa zajedničkog porekla. Jedini slučaj kada jeste je kada se radi o nekom domenu koji se smatra da je svima javno dostupan kao što je na primer Google fonts.

Sa druge strane, navedeni primer komunikacije je prikladan ako se koristi model bezbednosti koji se na engleskom naziva object-capability model gde stranice imaju sakriven URL i jedino im mogu pristupiti oni koji imaju ključ.

Primetimo da u PRRI arhitekturi, ACAO zaglavlje postavlja spoljna veb strana (bar.com), a ne originalna strana (foo.com). PRRI omogućava spoljnim veb servisima da daju autorizaciju veb aplikacijama da koriste njihove servise i ne kontroliše spoljne servise kojima pristupaju veb aplikacije.

Preflight primer[уреди]

Moderni pregledači koju podržavaju PRRI pri radu sa AJAX zahtevima ka različitim izvorima će dodati ,,preflight" zahtev da utvrde da li imaju potrebna ovlašćenja.

OPTIONS /
Host: bar.com
Origin: http://foo.com

Ako bar.com odobrava zahtev, onda će odgovoriti sa sledećim zaglavljima:

Access-Control-Allow-Origin: http://foo.com
Access-Control-Allow-Methods: PUT, DELETE

Zaglavlja[уреди]

HTTP zaglavlja koju su vezana za PRRI su:

Zaglavlja za zahteve[уреди]

  • Origin
  • Access-Control-Request-Method
  • Access-Control-Request-Headers

Zaglavlja za odgovore[уреди]

  • Access-Control-Allow-Origin
  • Access-Control-Allow-Credentials
  • Access-Control-Expose-Headers
  • Access-Control-Max-Age
  • Access-Control-Allow-Methods
  • Access-Control-Allow-Headers

Podrška za pregledače[уреди]

PRRI je podržan od svih pregledača koji koriste sledeće raspoređivačke mašine (u zagradama su najniže podržane verzije):

Istorija[уреди]

Podrška za preuzimanje resursa sa više domena je originalno predložena Marta 2004. od strane Meta Ošrija (енгл. Matt Oshry), Breda Portera (енгл. Brad Porter) i Majkla Bodela (енгл. Michael Bodell) iz kompanije Tellme Networks kao dodatak standardu VoiceXML 2.1[8] u cilju da omogući bezbedan prenos podataka sa više domena. Primetilo se da se mehanizam može uopštiti, odnosno da nije usko povezan sa VoiceXML-om, te je izdvojen u zaseban projekat, odnosno ,,implementation NOTE". Poseban deo W3C-a koji se naziva zadužen za razvoj softvera za veb (eng. The WebApps Working Group) zajedno sa razvojnim timovima najpoznatijih Veb pregledača je počeo da formalizuje predloženi projekat u W3C radni nacrt (енгл. W3C Working Draf) koji polako napreduje ka tome da dobije W3C preporuku (енгл. W3C Recommendation).

PRRI ili JSONP[уреди]

PRRI se može koristiti kao modernija alternativa za JSONP uzorak (eng. Jason with padding). Dok JSONP podržava samo GET metod za zahteve, PRRI podržava i druge tipove HTTP zahteva. Korišćenje PRRI-ja dopušta programeru za veb da koristi obične XMLHttp zahteve (XMLHttpRequest), koji podržavaju bolje rukovanje greškama od JSONP-a. Sa druge strane, JSONP radi na starijim pregledačima koji ne podržavaju PRRI. PRRI je podržan od većine modernih pregledača.

Vidi još[уреди]

Reference[уреди]

  1. 1,0 1,1 „cross-site xmlhttprequest with CORS”. MOZILLA. Приступљено 5. 9. 2012. 
  2. „HTTP access control (CORS) - MDN”. Developer.mozilla.org. Приступљено 5. 7. 2012. 
  3. „Gecko - MDN”. Developer.mozilla.org. 8. 6. 2012. Приступљено 5. 7. 2012. 
  4. „What makes Camino Special”. Приступљено 20. 2. 2013. 
  5. „59940: Apple Safari WebKit Cross-Origin Resource Sharing Bypass”. Osvdb.org. Приступљено 5. 7. 2012. 
  6. Tony Ross; Program Manager; Internet Explorer (9. 2. 2012). „CORS for XHR in IE10”. MSDN. Приступљено 14. 12. 2012. 
  7. David Honneffer, Documentation Specialist (23. 4. 2012). „Opera Software: Web specifications support in Opera Presto 2.10”. Opera.com. Приступљено 5. 7. 2012. 
  8. „Voice Extensible Markup Language (VoiceXML) 2.1”. W3.org. 23. 3. 2004. Приступљено 5. 7. 2012. 

Spoljašnje veze[уреди]