JSONP - JSONP
JSONPnebo JSON-P (JSON s polstrováním), je historický JavaScript technika pro vyžádání dat načtením a <script>
štítek;[1] to jsou značky určené k načtení běžného JavaScriptu. Navrhl to Bob Ippolito v roce 2005.[2] JSONP umožňuje sdílení obcházení dat politika stejného původu, který zakazuje spuštění kódu JavaScript ke čtení médií DOM prvky nebo XMLHttpRequest data načtená z místa mimo původní web stránky. Původní stránka je označena kombinací Schéma URI, název hostitele a číslo portu.
Je zranitelný vůči zdroji dat, který nahrazuje volání neškodné funkce škodlivým kódem, takže byl nahrazen sdílení zdrojů mezi zdroji (k dispozici od roku 2009[3]) v moderních aplikacích.
Funkčnost
HTML <script>
element je obecně povoleno spouštět JavaScriptový kód získaný z cizích původů. Služby, které odpovídají čistě JSON data však nebyla schopna sdílet data zahraničního původu před přijetím CORS (Sdílení zdrojů mezi zdroji ).
Například požadavek na zahraniční službu http://server.example.com/Uživatelé/1234
může vrátit záznam pro osobu jménem Alice ve formátu JSON. Syntaxe JSON je v souladu se syntaxí objektu JavaScriptu.
1 {2 "Název": "Alice",3 „ID“: 1234,4 "Hodnost": 75 }
Bez podpory CORS vede pokus o použití dat mezi doménami k chybě JavaScriptu.
1 <skript typ=„application / javascript“2 src=„http://server.example.com/Users/1234“>3 </skript>
Prohlížeč stáhne <script>
soubor, vyhodnotit jeho obsah, nesprávně interpretovat surová data JSON jako blok a vyvolat syntaktickou chybu. I když byla data interpretována jako literál objektu JavaScriptu, nemohl být přístupný pomocí JavaScriptu spuštěného v prohlížeči, protože bez přiřazení proměnné jsou literály objektů nepřístupné.
Ve vzoru použití JSONP požadavek na adresu URL, na který ukazuje src
atribut v <script>
element vrací data JSON, kolem kterých je zabalen kód JavaScript (obvykle volání funkce). Toto „zabalené užitečné zatížení“ je poté interpretováno prohlížečem. Tímto způsobem může funkce, která je již definována v prostředí JavaScriptu, manipulovat s daty JSON. Níže je uveden typický požadavek a odpověď JSONP.
Volání funkce parseResponse () je „P“ JSONP - „výplň“ nebo „předpona“ kolem čistého JSON.[4] Aby JSONP fungoval, musí server odpovědět odpovědí, která zahrnuje funkci JSONP. JSONP nefunguje s výsledky ve formátu JSON. Vyvolání funkce JSONP, které se odešle zpět, a užitečné zatížení, které funkce obdrží, musí být odsouhlaseny klientem a serverem. Podle konvence server poskytující data JSON nabízí žádajícímu webu pojmenovat funkci JSONP, obvykle pomocí názvu jsonp nebo zpětné volání jako pojmenovaný parametr řetězce dotazu ve svém požadavku na server: <script src="http://server.example.com/Users/1234?callback=parseResponse"></script>
.
V tomto příkladu by přijaté užitečné zatížení bylo:
parseResponse({"Název": "Alice", „ID“: 1234, "Hodnost": 7});
Vložení prvku skriptu
JSONP dává smysl pouze při použití s prvkem skriptu. Pro každý nový požadavek JSONP musí prohlížeč přidat nový <script>
prvek nebo znovu použít existující. Předchozí možnost - přidání nového prvku skriptu - se provádí pomocí dynamické manipulace DOM a je známá jako vložení prvku skriptu. The <script>
prvek je vložen do HTML DOM s URL požadovaného koncového bodu JSONP nastaveným jako atribut „src“. Tato dynamika vložení prvku skriptu se obvykle provádí pomocí pomocné knihovny JavaScriptu. jQuery a další rámce mají pomocné funkce JSONP; existují také samostatné možnosti.
Příklad použití jQuery na dynamicky vstřikovat prvek skriptu pro volání JSONP vypadá takto:
$.getScript(„http://server.example.com/Users/192.168.73.96?callback=parseResponse“);
Po vložení prvku prohlížeč vyhodnotí prvek a provede HTTP GET na adrese src URL a načte obsah. Poté prohlížeč vyhodnotí zpětné užitečné zatížení jako JavaScript. Toto je obvykle vyvolání funkce. Tímto způsobem může použití JSONP umožnit stránkám prohlížeče obejít politika stejného původu prostřednictvím vložení prvku skriptu.[Citace je zapotřebí ]
Skript běží v rámci stránky zahrnující stránku a jako takový stále podléhá omezením mezi doménami ve vztahu k doméně stránky včetně. To znamená, že webová stránka nemůže například načíst knihovnu hostovanou na jiném webu prostřednictvím JSONP a poté na tento web odeslat požadavky XMLHttpRequest (pokud sdílení zdrojů mezi zdroji (CORS) is supported), though one could use such a library to make XMLHttpRequests to someone own site.
Bezpečnostní obavy
Nedůvěryhodný kód třetí strany
Zahrnutí značek skriptu ze vzdálených serverů umožňuje vzdáleným serverům vkládat žádný obsah na webovou stránku. Pokud mají vzdálené servery chyby zabezpečení, které umožňují vkládání JavaScriptu, je stránka poskytovaná z původního serveru vystavena zvýšenému riziku. Pokud může útočník vložit jakýkoli JavaScript na původní webovou stránku, může tento kód načíst další JavaScript z jakékoli domény a obejít politika stejného původu.[5] Záhlaví HTTP Zásady zabezpečení obsahu umožňuje webovým serverům sdělit webovým prohlížečům, ze kterých skriptů domény mohou být zahrnuty.
Kolem roku 2011 bylo vyvinuto úsilí k definování bezpečnější přísné definice podmnožiny pro JSONP[1] že prohlížeče by byly schopny vynutit na žádostech o skript konkrétní MIM zadejte například „application / json-p“. Pokud odpověď nebyla analyzována jako striktní JSONP, mohl prohlížeč vyvolat chybu nebo jednoduše ignorovat celou odpověď. Od tohoto přístupu se však upustilo ve prospěch CORS a zůstane správný typ MIME pro JSONP aplikace / javascript
.[6]
Rozdíly v mezerách
JSONP nese stejné problémy jako řešení JSON s eval ()
: oba interpretují text JSON jako JavaScript, což znamená rozdíly ve zpracování U + 2028 a U + 2029 od vlastního JSON. Díky tomu jsou některé řetězce JSON v JSONP nelegální; servery poskytující JSONP musí před přenosem těmto znakům uniknout.[7]
Manipulace se jménem zpětného volání a útok na odražené stahování souborů
K předávání škodlivých dat klientům lze obejít omezení spojená s aplikace / JSON
typ obsahu, jak ukazuje útok odraženého stahování souborů (RFD) z roku 2014.[8]
Do nezabezpečených koncových bodů JSONP lze vložit také škodlivá data.[9]
Padělání žádosti napříč weby
Naivní nasazení JSONP podléhá padělání žádosti napříč weby (CSRF nebo XSRF) útoky.[10] Protože HTML <script>
značka nerespektuje politika stejného původu v implementacích webového prohlížeče může škodlivá stránka vyžadovat a získávat data JSON patřící jinému webu. To umožní vyhodnotit data kódovaná JSON v kontextu škodlivé stránky, případně vyzradit hesla nebo jiná citlivá data, pokud je uživatel aktuálně přihlášen na jiný web.
To je problematické pouze v případě, že data kódovaná ve formátu JSON obsahují citlivé informace, které by neměly být poskytovány třetí straně, a server závisí na politika stejného původu prohlížeče zablokovat doručování citlivých informací.
Rosetta Flash
Rosetta Flash je vykořisťovací technika, která umožňuje útočníkovi zneužít servery se zranitelným koncovým bodem JSONP Adobe Flash Player věřit, že na zranitelném serveru vznikl applet Flash určený útočníkem. Flash Player implementuje politika stejného původu umožňující člověku podávat žádosti (pomocí cookies) a přijímat odpovědi z hostitelského webu. Applet pak může odeslat načtená data zpět útočníkovi. Toto je exploit křížového původu s dopadem podobným jako vložení libovolného appletu Flash do zranitelné domény. Exploit využívá užitečné zatížení jazyka ActionScript zkompilované do souboru SWF složeného výhradně z alfanumerických znaků vytvořením zlib stream s konkrétní hlavičkou a DEFLATE bloky s ad-hoc Huffmanovo kódování. Výsledný alfanumerický pouze soubor SWF se poté použije jako parametr zpětného volání volání JSONP. Weby s vysokým profilem, jako jsou Google, YouTube, Twitter, Yahoo !, Yandex, LinkedIn, eBay, Instagram a Tumblr, byly všechny zranitelné až do července 2014.[11] Tuto chybu zabezpečení objevil a publikoval bezpečnostní technik společnosti Google Michele Spagnuolo[12] a má CVE -2014-4671[13] a CVE-2014-5333.[14] Vydání Adobe Flash Player verze 14.0.0.145, vydané 8. července 2014, představilo silnější ověřování souborů Flash,[15] a ve verzi 14.0.0.176, vydané 12. srpna 2014, byla dokončena oprava,[16] zabránění tomuto zneužití v práci.
Dějiny
V červenci 2005 George Jempty navrhl doplnění volitelného přiřazení proměnné před JSON.[17][18] Zdá se, že původní návrh JSONP, kde je výplň funkcí zpětného volání, vytvořil Bob Ippolito v prosinci 2005.[19] a nyní je využíván mnoha Web 2.0 aplikace jako Dojo Toolkit, Google Web Toolkit a webové služby.
Viz také
Reference
- ^ A b „Safer cross-domain Ajax with JSON-P / JSONP“. JSON-P.org. Archivovány od originál 4. března 2016. Citováno 2011-10-30.
- ^ Ippolito, Bob (5. prosince 2005). „Remote JSON - JSONP“. Bob Ippolito na Haskell, Python, Erlang, JavaScript atd. Archivovány od originál dne 8. 6. 2012. Citováno 2017-02-10.
- ^ „Sdílení zdrojů mezi zdroji“. Mohu použít... Citováno 4. května 2020.
- ^ „Experimentální výsledek RDF nastaven na překladač JSON“. Archivovány od originál dne 15. listopadu 2014. Citováno 20. února 2012.
- ^ Ben Hayak (2014-10-17). „Provedení metodou stejného původu“ (PDF). Citováno 2014-10-22.
- ^ Gray, Eli (2010-06-27). „Je bezpečné poskytovat JSONP?“. stackoverflow.com. Citováno 2012-09-07.
- ^ „JSON: Podmnožina JavaScriptu, která není“. Magnus Holm. Citováno 16. května 2011.
- ^ Oren Hafif (2014). „Stažení odraženého souboru - nový vektor webového útoku“. TrustWave. Citováno 2015-03-25.
- ^ „Praktická injekce JSONP“.
- ^ Grossman, Jeremiah (27. ledna 2006). „Pokročilé techniky webového útoku využívající GMail“. Citováno 3. července 2009.
- ^ Michele, Spagnuolo. „Zneužití JSONP s Rosetta Flash“. Archivovány od originál 21. července 2014. Citováno 20. července 2014.
- ^ „Google - seznam softwarových chyb zjištěných nebo opravených zaměstnanci společnosti Google“. Citováno 29. července 2014.
- ^ „MITER: CVE-2014-4671“. Citováno 29. července 2014.
- ^ „MITER: CVE-2014-5333“. Citováno 21. srpna 2014.
- ^ „Bulletin zabezpečení Adobe APSB14-17“. Citováno 29. července 2014.
- ^ „Bulletin zabezpečení Adobe APSB14-18“. Citováno 21. srpna 2014.
- ^ „eval'ing JSON“. 19. července 2005. Archivovány od originál dne 12. února 2006.
- ^ "json: Zpráva: Re: Komentáře". 17. srpna 2005.
- ^ „Remote JSON - JSONP“. z __future__ importu *. Bob.pythonmac.org. 5. prosince 2005. Archivovány od originál 4. prosince 2009. Citováno 8. září 2008.