Polisa zajedničkog porekla

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

U računarstvu, polisa zajedničkog porekla je bitan koncept u sigurnosnom modelu veb aplikacije. Ona dozvoljava skriptama koje rade na stranicama poreklom sa istog sajta – kombinacija sheme (енгл. URI scheme), hostname-a i računarskog porta (енгл. Port (computer networking)) [1] – da pristupe međusobnom objektnom modelu dokumenata (DOM) bez posebnih ograničenja, ali sprečava pristup DOMu drugih sajtova.[1] Polisa zajedničkog porekla se takodje primenjuje na XMLHttpRequest-ove osim u slučaju da server pruža Access-Control-Allow-Origin (CORS) zaglavlje. WebSocket-i naročito nisu podležni ovom konceptu.

Mehanizam nosi posebni značaj za moderne web-aplikacije koje veoma zavise od HTTP kolačića (енгл. cookie) da bi održali korisničke sesije, zato što se serveri ponašaju u zavisnosti od informacije HTTP kolačića kako bi otkrili osetljive informacije ili kako bi promenili stanje. Striktna razdvojenost od sadržaja koji snabdeva nepovezani sajt mora biti održana od strane klijenta kako bi se izbegao gubitak poverljivosti i integriteta podataka.

Istorija[уреди]

Koncept polise zajedničkog porekla datira od pretrazivača Netscape Navigator 2 pretraživača iz 1995. godine. Svi moderni pretraživači koriste neku formu poreklo-polise jer je to kamen temeljac pretraživačke bezbednosti[2]. Polise ne moraju da se poklapaju sa nekom preciznom specifikacijom[3] ali se često koriste kako bi definisali ugrubo kompatibilne bezbednosne granice za druge skriptne jezike kao što su Adobe Flash ili Adobe Acrobat, ili za mehanizme nevezane za direktnu DOM manipulaciju, kao na primer XMLHttpRequest.

Pravila određivanja porekla[уреди]

Algoritam koji se koristi da izračuna „poreklo” URI-a je precizirano u RFC 6454, četvrti odeljak. Za apsolutne URI-je, poreklo je trodelno (protokol, host, port). Ako URI ne koristi hijerarhijski element kao nazivni autoritet (videti RFC 3986, odeljak 3.2) ili ako URI nije apsolutni URI, onda se koristi globalno jedinstven identifikator. Za dva resursa se smatra da su istog porekla samo ako su njihove vrednosti potpuno jednake.

Ilustracije radi, naredna tabela nam daje pregled tipičnih ishoda koristeci URL "http://www.example.com/dir/page.html".

URL sa kojim se upoređuje Ishod Razlog
http://www.example.com/dir/page2.html Success Same protocol and host
http://www.example.com/dir2/other.html Success Isti protokol i host
http://username:password@www.example.com/dir2/other.html Success Same protocol and host
http://www.example.com:81/dir/other.html Failure Same protocol and host but different port
https://www.example.com/dir/other.html Failure Different protocol
http://en.example.com/dir/other.html Failure Different host
http://example.com/dir/other.html Failure Different host (exact match required)
http://v2.www.example.com/dir/other.html Failure Different host (exact match required)
http://www.example.com:80/dir/other.html Deppends Port explicit. Depends on implementation in browser.

Za razliku od drugih pretrazivača, Internet Explorer ne uključuje port u računanju porekla, on koristi Security Zone umesto toga[4] .

Opuštanje polise zajedničkog porekla[уреди]

U nekim okolnostima polisa zajedničkog porekla je previše restriktivna, pa predstavlja problem za velike web-sajtove koji koriste više poddomena. Evo četiri načina da se polisa opusti :

document.domain odlike[уреди]

Ako dva prozora (ili frejma) sadrže skriptu koja postavlja domen na istu vrednost, polisa zajedničkog porekla je opuštena za ova dva prozora, i oni mogu međusobno dejstvovati. Na primer, sarađujući skripti u dokumentima očitanim iz orders.example.com i catalog.example.com mogu postaviti da njihov document.domain bude „example.com”, i tako bi dokumenti izgledali kao da su isto porekla i dozvolili bi svakom dokumentu da pročita odlike ovog drugog. Ovo možda neće svaki put raditi, jer bi port sklonjen u internu reprezentaciju mogao da bude oznacen sa null. Drugim rečima, example.com port 80 će postati example.com port null zato što se document.domain update-uje. Port null se ne može tretirati kao 80 (u zavisnosti od korišćenog pretraživača) i zato može da propadne ili uspe u zavisnost od pretraživača.[5]

Cross-Origin deljenje resursa[уреди]

Druga tehnika za opuštanje postaje standardizovana kao Cross-Origina deljenje resursa (Cross-Origin resource sharing). On produžava HTTP sa novim Origin request zaglavljem i novim CORS uzajamnim zaglavljem. To dozvoljava serverima da koristi zaglavlja da eksplicitno navodi porekla koja mogu da traže fajl ili da iskoriste „wildcard” i dozvole fajlu da bude tražen od strane bilo kog sajta. Pretraživači kao što je Firefox 3.5 i Safari 4 koriste ovo novo zaglavlje da dozvole cross-origin HTTP zahteve sa XMLHttpRequest-om koji bi inače bili zabranjeni polisom zajedničkog porekla.[6]

Cross-document messaging[уреди]

Još jedna nova tehnika, cross-document messaging dozvoljava skriptu sa jedne strane da prosleđuje tekstualne poruke skripti na drugoj stranici nezavisno od porekla skripta. Calling the postMessage() method on a Window object asynchronously fires an "onmessage" event in that window, triggering any user-defined event handlers. Skript na jednoj strani i dalje ne može direktno pristupiti metodama ili varijablama na drugoj strani, ali oni mogu komunicirati bez opasnosti koristeći ovu metodu.

JSONP[уреди]

JSONP dozvoljava stranici da primi JSON podatke sa različitog domena tako što doda <script> element stranici koja očitava JSON odgovor sa drugog domena.

Corner slučajevi i izuzeci[уреди]

Ponašanje provera i sličnih mehanizama polise zajedničkog porekla nije dobro definisana u nekoliko corner slučajeva kao na primer za pseudo-protokole koji nemaju jasno definisano host ime ili port povezan sa svojim URLom (file:, data:, itd.). Ovo je stvaralo popriličan broj sigurnosnih problema, kao što su generalno nepoželjna mogućnost svakog lokalno sačuvanog HTML fajla da pristupi svim drugim fajlovima na disku, ili da komunicira sa bilo kojim sajtom na internetu. Takodje, mnoge cross-domain operacije koje su bile pre JavaScript-a nisu podležne proveri polise zajedničkog porekla. Jedan takav primer je mogućnost uključivanja skripta preko domena. Na kraju, određeni tipovi napada, kao što je DNS rebinding ili serverski proksiji, dozvoljavaju da se provera host name-a obori, i omogućavaju odbeglim veb stranicama interakciju sa sajtovima kroz adrese koje nisu njihovog pravog porekla. Ovi napadi su opasnost samo u posebnim situacijama, zato što pretraživač i dalje veruje da interakciju vrši sa napadačkim sajtom, i zato ne deli kolačiće trećih lica ili druge osetljive podatke napadaču.

Ublažavanja[уреди]

Da bi omogucili projektantu da zaobiđe polisu zajedničkog porekla, nekoliko „hakova”, kao što je na primer identifikator fragmenata ili window.name odlika su korišćeni za prosleđivanje podataka između dokumenata koji su u različitim domenima. Sa HTML5 standardom, metoda je formalizovana za ovo : postMessage interfejs,[7][8] koji se jedino nalazi na novijim pretraživačima.[9] JSONP takođe može da se iskoristi kako bi omogućio pozive slične Ajax-u drugim domenima.[10]

Reference[уреди]

  1. 1,0 1,1 Same Origin Policy - Web Security. W3.org. Retrieved on 2013-08-20.
  2. „Browser Security Handbook, part 2”. google.com. Приступљено 31. 1. 2014. 
  3. „Same Origin Policy”. W3C. Приступљено 31. 1. 2014. 
  4. Lawrence, Eric. „IEInternals - Same Origin Policy Part 1”. Приступљено 22. 10. 2013. 
  5. LePera, Scott. „Cross-domain security woes”. The Strange Zen Of JavaScript. Приступљено 4. 4. 2014. 
  6. Cross-Origin Resource Sharing. W3.org. Retrieved on 2013-08-20.
  7. HTML Living Standard. Communication: Cross-document messaging: Posting messagesWHATWG.
  8. HTML5. Communication: Cross-document messaging: Posting messagesW3C.
  9. When can I use: Support for Cross-document messaging
  10. „Blog Post: Using CORS with all (modern) browsers”. 

Spoljašnje veze[уреди]