Jak zabránit volání REST API zvenčí? rubrika: Programování: Jiné

3 JSifalda
položil/-a 13.2.2014

Ahoj,

chci se předem omluvit, pokud vám bude můj problém připadat jasný nebo podstatný, ale ačkoliv používání Rest api je denní hleba, pořád se mi nepodařilo pořádně vyřešit následující porblém:

Jde o to, jak ochrátnit api proti volání zvenčí. Api je však "veřejná" - o získání dat si může říci každý a api vrátí správný výsledek (i když toto není vyžadováno).

Problém nástává jak ošetřit např. vložení dat do DB, která beží pod api vrstvou. Jedná se tedy o nějaký POST request, kdy ho potřebuji omezit tak, aby ho mohla volat jen určitá app (client-side).
A v tomto bodě mě nenapadá jak to správně ošetřit. O to více se mi to komplikuje, že na client-side, která pracuje s api, nevyžaduji žádnou authentikaci uživatelů, aby mohli s app pracovat.

Když použiji nějaký authentikační token, který ovšem uložím do zdrojáku na client-side, každý si ho může přečíst a nebude to mít žádný efekt. Ať použiji jakékoliv jiné řešení na tomto principu, nikam to nevede. Kdokoliv přijde, můžete si přečíst potřebné údaje. (Minifikace kódu nic neřeší.)

Mohl by mi prosím někdo nastínit, jak se tyto situace řeší?

odkaz
8 rmaslo
odpověděl/-a 14.2.2014

Takže zákazník vidí celý zdrojový kód aplikace, včetně přístupových klíčů a přesto by neměl mít možnost toto api volat ručně ?
Podle mě teoreticky neřešitelné. Je to stejná situace jako u DVD - když máš k dispozici soft který umí přečíst DVD (jsou v něm klíče i program) tak ho nakonec někdo zaanalyzuje jak to funguje, klíče získá a přečte DVD i z jiného programu.
Vzhledem k tomu, že je to na netu tak lze případného útočníka "docela prudit" třeba změnou definice API při každém requestu ... ale neprolomytelný to nikdy nebude.

Komentáře

  • JSifalda : Přesně tak. Což je ale problém všech dnešních client (js bude vždy "čitelné") & server (api) side applikacích, nebo se snad mýlím? :) Změnu definice api při každém requestu si nějak nedokážu představit. 14.2.2014
  • Anonym : Než měnit definici API tak bych použil něco na způsob Challenge-response kdy před provedením akce požádám o token kterým vlastně podepíšu následující request. Dalším prvkem by mělo být filtrování dle IP a v hlavičce si posílat ID aplikace. Navíc bych ještě implementoval řešení, že pokud aplikace sama neprovede odhlášení od API serveru tak její přihlašovací údaje nejdou použít. 15.2.2014
  • rmaslo : @JSifalda: Změna API při každém requestu: Mezi JS aplikaci a standardní api bych vložil prudící (překládací, proxy) vrstvu. Standardní api by samozřejmě bylo skryté třeba na základě IP aby ho JS aplikace nemohla volat. Takže třeba: místo www.server.cz/source=clanky&action=get by se muselo volalo www.server.cz/api=ver185&source=blebleble&action=get tj názvy jednotlivých services by byly pokaždé jiné a překládací vrstva by je překládala a pak volala standardní api. Útočníkovi pak nestačí udělat 1x statickou (ruční) analýzu JS, ale musí analýzu JS dělat dynamicky tj. musí si udělat nějakej program, který si udržuje tabulku kde má napsáno "teď platí:" clanky=>api=ver185&source=blebleble. Platnost tohoto převodu je samozřejmě omezena (onunload + voláním tohoto api + časově) tj. za chvilku už to není platné a platí clanky=>api=ver186&source=jinyblebleble. Osobně jako útočník bych si teda 2x rozmyslel jestli se na takovýhle zvěrstvo mám připojovat a musel bych k tomu mít zatraceně dobrej důvod. Rozhodně to tedy nelze považovat za zabezpečení - ale k odrazení, aby někdo nevyužíval moje API mi to přijde celkem dobrý. 15.2.2014
  • rmaslo : @Václav Pávek: Souhlas změna API a držení verze API a nebo držení tokenu získaného z posledního requestu je skoro to samé. Ten token je trochu jednoduší (jak pro útočníka tak pro obránce), ale princip je stejný. 15.2.2014
  • rmaslo : @Václav Pávek: To s tim odhlášením je poměrně brutální (co když spadne spojení na net), ale pokud by se nový heslo zasílalo třeba pomocí SMS tak si to dovedu představit. 15.2.2014
  • Anonym : @rmaslo: tak by to nemělo mít vliv poněvadž aplikace neprovedla odhlášení = zneplatnění tokenu který je vázán na aplikaci a IP. Po nahození netu by aplikace by měla jet dál. 15.2.2014
  • Stefano : @rmaslo - "Změna API při každém requestu" Tak taketo api by som nechcel pouzivat. 15.2.2014
  • rmaslo : @Václav Pávek: Pokud by uživatel mezitím token nezahodil (třeba zavření prohlížeče)... 15.2.2014
  • rmaslo : @Stefano. No to je účelem - aby to API nepoužíval nikdo nepovolaný :-) 15.2.2014
  • Stefano : @rmaslo - len aby to api potom neskoncilo v tomto vlakne http://devel.cz/otazka/s-jakym-nejobskurnejsim-a-nejzpackanejsim-api-jst... 15.2.2014

Pro zobrazení všech 12 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.