Pređi na sadržaj

JSONP

S Vikipedije, slobodne enciklopedije

JSONP (JSON sa postavom) je tehnika koju koriste veb programeri kako bi prevazišli međudomenska ograničenja nametnuta od strane polise zajedničkog porekla pregledača koja ograničava pristup resursima čije je poreklo različito od polaznog.

JSON je skraćenica od "JavaScript Object Notation" i predstavlja format u kojem su objekti predstavljeni pomoću parova ključeva i vrednosti.

Princip rada[uredi | uredi izvor]

Da bi videli kako ova tehnika radi, prvo razmotrimo URL zahtev koji isporučuje JSON podatake. JavaScript program može da zatraži ovaj URL preko XMLHttpRequest, na primer. Pretpostavimo da je identifikator korisnik za osobu Foo 1234. Pregledač traži URL http://server.example.com/Users/1234 prosleđujući identifikator 1234, a primiće podatke (uglavnom dinamički generisane) slično ovome:

{
    "Name": "Foo",
    "Id": 1234,
    "Rank": 7
}

Ovde, HTML <script> element određuje za src atribut URL koji vraća JSON:

<script type="application/javascript"
        src="http://server.example.com/Users/1234">
</script>

Pregedač će, redom, preuzeti script datoteku, proceniti njen sadržaj, interpretirati sirove JSON podatke kao block i izbaciti sintaksnu grešku. Čak i da su podaci tretirani kao JavaScript objekat, ne bi im se moglo pristupiti u JavaScript kodu koji pregledač izvršava, bez prethodne dodele ove vrednosti nekoj promenljivoj.

U upotrebi JSONP , URL zahtev ukazuje srcna atribut u <script> deo i vraća JSON podatak, zaokružen JavaScript kodom (uglavnom preko poziva funkcije). Ovaj "wrapped payload" je interpretiran od strane pregledača. Tako, funkcija, koja je već definisana u JavaScript okruženju, može da manipuliše JSON podacima. Tipični JSONP zahtev i odgovor prikazan je dole.

Funkcijski poziv myResponseFunction() je "P" iz JSONP— "padding" oko čistog JSON-a, ili prema nekim[1] "prefiks".

Imajte na umu da za rad sa JSONP, server mora da vrati odgovor koji sadrži JSONP funkciju. JSONP ne radi sa JSON-formatiranim rezultatom. JSONP funkcija "traži" da bude vraćena, dok "payload", koji je primila funkcija, mora biti dogovoren od strane klijenta i servera.

Po konvenciji, pregledač daje ime (poziv) funkcije, prema nazivu vrednosti parametara upita, uglavnom koristeći naziv jsonp ili callback upita - u zahtevu servera, na primer,

<script type="application/javascript"
        src="http://server.example.com/Users/1234?callback=parseResponse">
</script>

U ovom primeru, primljeni "payload" bi bio:

parseResponse({"Name": "Foo", "Id": 1234, "Rank": 7});

Ubacivanje skript elemenata[uredi | uredi izvor]

JSONP ima smisla samo kada se koristi sa skript elementima. Za svaki novi JSONP zahtev, pregledač mora da doda novi <script> element, ili da iskoristi neki postojeći. Bivša opcija—dodavanje novog skript elementa—je urađena preko DOM manipulacije, i poznata je kao ubacivanje skript elementa. <script> element je ubačen u HTML DOM, sa URL od željene JSONP krajnje tačke postavljene kao "src" atribut. Ovo dinamičko ubacivanje skript elementa uglavom je urađeno JavaScript pomoćnom bibliotekom. jQuery i ostali frameworks imaju JSONP pomoćne funkcije; postoje i samostalne opcije.[2][3][4]

Primer dinamičkog ubacivanja skript elementa za JSONP poziv izgleda ovako:

<script type="application/javascript"
        src="http://server.example.com/Users/1234?callback=parseResponse">
</script>

Nakon što je element ubačen, pregledač procenjuje element i obavlja HTTP GET na URL, preuzimajući sadržaj. Pregledač, potom, procenjuje vraćeni "payload" kao JavaScript. Ovo je tipično pozivanje funkcije.

Na taj način, upotreba JSONP može da dozvoli stranici pregledača da radi "same-origin policy" preko ubacivanja skript elementa.

Skripta radi u okviru uključene stranice i, kao takva, i dalje je predmet cross-domain ograničenja u odnosu na domen stranice. To znači da veb stranica ne može, recimo, da učita biblioteku koja se nalazi na drugom sajtu sa JSONP i potom da napravi XMLHttpRequest zahtev za taj sajt (osim ako je cross-origin deljenja resursa podržan), mada se mogu koristiti i takve biblioteke za pravljenje XMLHttpRequests na sopstvenom sajtu.

Zahtevi cross domena koji koriste proksi server[uredi | uredi izvor]

JavaScript polisa zajedničkog porekla normalno sprečava pretraživač da šalje AJAX zahteve različitim domenima i primanje odgovora (noviji pretraživači, koji podržavaju CORS, mogu opustiti ovo ograničenje). Kooperativni proksi server, međutim, nema takva ograničenja i može preneti zahtev pregledača serveru u odvojenom domenu , skladištiti rezultat, i onda vratiti JSON payload, kada pregledač pravi sledeći zahtev. Server će biti upućen u sklopu prvog zahteva da skladišti izlaz (POST vraća JSON payload) privremeno u lokalnom snabdevaču (na primer keširana memorija ili u okviru sesije promenljive), a drugi zahtev pregledača doneće keširani odgovor na početni upit.[5] The xd_arbiter.php korišćen od strane Facebook's JS SDK je popularan primer tehnike sarađivanja servera.[6]

Problemi bezbednosti[uredi | uredi izvor]

Nepouzdanost koda[uredi | uredi izvor]

Uključujući skript oznake, glavnom serveru omogućava se ubacivanje i prikupljanje podataka na/sa veb sajta. Ukoliko su udaljeni serveri ranjivi, koji omogućavaju ubacivanje Javascript-a, strana koju uslužuje originalni server je izložena opasnosti. Ako "napadač" može da sprovede bilo kakav JavaScript kod u originalni veb sajt, onda ovaj kod može da dobije dodatni JavaScript iz bilo kog domena.[7] U sadržaj bezbednosne politike HTTP heder dozvoljava veb sajtovima da "kažu" veb pregledačima koje skripte mogu biti uključene.

Napor je napravljen oko 2011.g. utvrđivanjem sigurnije i rigoriznije definicije za JSON[8] , pa pregledači imaju priliku uključivanja skripte na osnovu MIME tipa "aplikacija/json-p". Ako  odgovor ne prođe kao strogi json-p, pretraživač može da "izda grešku" ili jednostavno ignoriše ceo odgovor. Međutim, ovaj pristup je odbijen od strane CORS-a, i pravi MIME za jsonp ostaje апликација/Јавасцрипт.[9]

Manipulacija poziva i reflektivno preuzimanje podataka[uredi | uredi izvor]

Nepotvrđena povratna imena mogu da se iskoriste pri prenosu marveloznih podataka klijentima zaobilazeći ograničenja u vezi sa апп/јсон sadršajem, kao što je i demonstrirano u napadu pomoću reflektivnog preuzimanja podataka 2014. godine.[10]

Falsifikovanje zahteva[uredi | uredi izvor]

Naivni razvoj JSONP se zasniva na napadima prouzrokovanim falsifikovanju zahteva (CSRF ili XSRF).[11] jer HTML <скрипт> oznaka ne poštuju istu politiku u realizaciji veb pregledača, marvelozne strane mogu preuzeti podatke koje pripadaju drugim sajtovima koristeći JSON. Sajt će omogućiti podacima koji su enkodirani pomoću JSON-a da budu procenjeni u kontekstu marvelozne strane, mogućeg otkrivanja šifre ili drugih osetljivih podataka, pod uslovom da je korisnik ulogovan na neki drugi sajt. 

Ovo je problematično, samo ako, podaci enkodirani pomoću JSON-a, sadrže osetljive informacije koje ne bi trebalo da budu lako dostupne. Server zavisi od pregledača koji može blokirati podatke koji nemaju pravo pristupa. Ova zavisnost privatnosti od pregledača može se zaobići tako što server odlučuje o privatnosti. Kada je zahtev prihvaćen, onda, može samo postaviti podatke na "žicu". Ekskluzivna upotreba kolačića za određivanje da li je zahtev prihvaćen trebalo bi da bude izbegnuta. Kao da je zahtev falsifikovan.

Rosetta Flash[uredi | uredi izvor]

Rosetta Flash je eksplotaciona tehnika koja omogućava napadaču da koristiti server sa ranjivim JSONP krajnjim tačkama (izazvana od strane Adobe Flash Player) da uveri napadača da je njegov aplet nastao na ranjivom serveru. Applet može zatim poslati podatke nazad do napadača.  Exploit koristi ActionScript kompajliran u SVF fajl koji je sačinjen u potpunosti od alfa-numeričkih karaktera, praveći  zlib strim sa određenim hederom  i DEFLATE blokovima sa hofmanovim kodiranjem. Dobijeni alfanumerički SVF-fajl, koji, zatim, koristi poziv parametara JSONP. Veliki sajtovi, poput Google, Youtube, Facebook, Yahoo!, Yandex, Linkedin, eBay, Instagram i Tumblr bili su ranjivi do jula 2014. godine.[12] Ova ranjivost otkrivena je i objavljena od strane kompanije Google, a otkrio je bezbednosni inženjer Michele Spagnuolo[13]. Ranjivosti imaju CVE 2014-4671[14] i CVE 2014-5333.[15] Adobe Flash Player verzija 14.0.0.145, objavljena 8. jula 2014. godine, uvedena je stroža provera datoteka Flash fajlova,[16] a u verziji 14.0.0.176, objavljenoj 12. avgusta 2014. godine, trajno su rešili problem,[17] sprečavanjem rada exploit-a.

Istorija[uredi | uredi izvor]

U julu 2005. godine Džordž Jempti predložio opcionu dodelu promenljivih  u JSON-u.[18][19] Originalni predlog za JSONP, gde je punjenje  poziv funkcije, predložio je  Bob Ippolito u decembru 2005. godine,[20] i sada je koriste mnoge veb 2.0 aplikacije, kao što su dojo alat, Google veb-alat i veb-usluga.

Vidi još[uredi | uredi izvor]

  • Zajedničko korišćenje resursa (ZKR)
  • Metode za razmenu poruka

Reference[uredi | uredi izvor]

  1. ^ „Experimental RDF result set to JSON translator”. Arhivirano iz originala 15. 11. 2014. g. Pristupljeno 20. 2. 2012. 
  2. ^ „example jsonp library on pastebin”. 
  3. ^ „Basic JSONP helper (pure JS)”. 
  4. ^ „jQuery's $.getJSON utility”. 
  5. ^ „Arhivirana kopija”. Arhivirano iz originala 09. 02. 2014. g. Pristupljeno 15. 05. 2016. 
  6. ^ Kinsey, Sean. „Facebook and Cross domain messaging clarification?”. Stack Exchange, Inc. Pristupljeno 22. 11. 2013. 
  7. ^ Ben Hayak (17. 10. 2014). „Same Origin Method Execution” (PDF). Pristupljeno 22. 10. 2014. 
  8. ^ „Safer cross-domain Ajax with JSON-P/JSONP”. JSON-P.org. Arhivirano iz originala 04. 03. 2016. g. Pristupljeno 30. 10. 2011. 
  9. ^ Grey, Eli (27. 6. 2010). „Is this safe for providing JSONP?”. stackoverflow.com. Pristupljeno 7. 9. 2012. 
  10. ^ Oren Hafif (2014). „Reflected File Download - A New Web Attack Vector”. TrustWave. Arhivirano iz originala 28. 03. 2015. g. Pristupljeno 25. 3. 2015. 
  11. ^ Grossman, Jeremiah (27. 1. 2006). „Advanced Web Attack Techniques using GMail”. Pristupljeno 3. 7. 2009. 
  12. ^ Michele, Spagnuolo. „Abusing JSONP with Rosetta Flash”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 20. 7. 2014. 
  13. ^ „Google - list of software vulnerabilities discovered or fixed by Googlers”. Pristupljeno 29. 7. 2014. 
  14. ^ „MITRE: CVE-2014-4671”. Arhivirano iz originala 23. 09. 2015. g. Pristupljeno 29. 7. 2014. 
  15. ^ „MITRE: CVE-2014-5333”. Arhivirano iz originala 23. 09. 2015. g. Pristupljeno 21. 8. 2014. 
  16. ^ „Adobe Security Bulletin APSB14-17”. Pristupljeno 29. 7. 2014. 
  17. ^ „Adobe Security Bulletin APSB14-18”. Pristupljeno 21. 8. 2014. 
  18. ^ „eval'ing JSON”. 19. 7. 2005. Arhivirano iz originala 12. 02. 2006. g. Pristupljeno 15. 05. 2016. 
  19. ^ „json: Message: Re: Comments”. 17. 8. 2005. Arhivirano iz originala 22. 07. 2012. g. Pristupljeno 15. 05. 2016. 
  20. ^ „Remote JSON - JSONP”. from __future__ import *. Bob.pythonmac.org. 5. 12. 2005. Arhivirano iz originala 08. 06. 2012. g. Pristupljeno 8. 9. 2008.