Ohladom tej session, odhliadnuc od toho, ze je to bezny stateful system, ktory vie spravit vacsina frameworkov a netreba ho kodit manualne, a taktiez odhliadnuc od toho ze je to, ako pisal snajpa, zbytocna komplikacia, tak ono si to pyta pruser. A sice, pruser zvany CSRF resp. XSRF (cross-site request forgery).
Jeden priklad to krasne vysvetli: VpsFree ma takto ako si pisal nakodenu autentifikaciu k API. Chcem Ta nasrat, prip. sa pobavit na Tvoj ucet a nejako som sa dopracoval k informacii ake je cislo Tvojej VPS (resp. nemusim, rovno vyskusam cisla od 1 po niekolko tisic, tak vela ich zas nie je a raz sa urcite trafim :) ). Vytvorim shortcut
https://bit.ly/xyz za ktorym sa skryva
https://api.vpsfree.cz/v1/vpses/:999?action=stop a dokopem Ta k tomu aby si na to klikol (napr. poslem Ti spravu “Tuto je super clanok o tom, preco stateful API nie je dobre:
https://bit.ly/xyz “), alebo, este lepsie, aby to vyzeralo doveryhodnejsie, urobim si blog, kde ten clanok naozaj napisem a vlozim do toho aj <img src=“
https://api.vpsfree.cz/v1/vpses/:999?action=stop” /> a poslem neskratenu url, aby si ma nepodozrieval, zvysok roboty urobi browser za Teba ked sa bude snazit vyrenderovat ten obrazok. Pokial mas este neexpirovanu session na vpsfree.cz, tak som Ti prave vypol VPSku :) Lebo ten cookie browser odosle automaticky. Pekne, nie? :)
Pri stateless api sa Ti toto nemoze stat. A kludne si aj ten token mozes ulozit do cookie, ale pod podmienkou, ze ten cookie pouzijes iba ako storage (pouzivam pri browseroch ktore nepodporuju local storage). Ten cookie sa sice odosle, ale server ho ignoruje, pre vykonanie API potrebuje mat token v Authorization header-i. A toto uz tymto sposobom nesfalsujem, lebo ja sa k tym udajom neviem dostat, ja iba zneuzivam fakt, ze tie data browser posiela automaticky s kazdym requestom. Token sice na rozdiel od cookie neuchranim pred pristupom Javascriptu (cookie mozem nastavit ako HttpOnly) a teda je to nachylnejsie na XSS, avsak proti XSS sa da branit velmi lahko, zabranenim injectovaniu. Ale proti XSRF sa realne pri stateful cookie/session based autentifikacii nemas sancu ubranit. Request totiz vykona Tvoj browser, na serveri nemas ako odlisit takyto podvrhnuty request od skutocneho, sedi uplne vsetko, cookie, user-agent, IP, atd.
A teraz ceresnicka na torte, zeby browser automaticky doplnal pri http-basic aj ten Authorization header? A navyse session pri http-basic expiruje az zavretim browseru? Takze snajpa, toto nie je o revolucii, toto je o relativne elementarnej bezpecnosti, myslim ze nik z nas nema o vyssie popisane vypnutie VPSky zaujem :)
Inak co sa tyka API, vrele odporucam knihu RESTful Web APIs (O’Reilly,
http://shop.oreilly.com/product/0636920028468.do), tam su popisane aj dalsie veci, ako napr. ze nie je uplne vhodne pouzit cisty JSON, nakolko ten nema specialy typ na linky/url-ky a teda take API nemoze byt RESTful, lebo nesplna zakladnu podmienku - nema hypermedia. Pocitac totiz nerozumie co znamena “url”: “….”, pre PC to je iba dalsi field typu String s nazvom “url”. Tym padom sa znacne komplikuje automatizacia a prakticky nie je mozny scanning celeho api, taketo api realne nie je self-descriptive. Zial, toto je este iba v plienkach a standardy neexistuju, ja som to riskol s draftom HAL+JSON (
http://tools.ietf.org/html/draft-kelly-json-hal-06 resp.
http://stateless.co/hal_specification.html).
Ale uz sa asi hram na prilis mudreho :)
Jano
Ahojte,
v poslednej dobre intenzívne využívam jedno REST-ové API, tak pridávam dva postrehy, o ktorých si myslím, že by mohli byť zaujímavé.
Súhlasím s tým prihlasovaním. V mojom prípade prihlasovanie riešime tak, že máme authentication request, v ktorom sa odošlú prihlasovacie údaje. Po úspešnom prihlásení server vytvorí session a v hlavičke odpovede odošle okrem iného Set-Cookie SESSIONID=xxx, kde xxx je nejaký unikátny kľúč. Ten sa potom odosiela v hlavičke ostatných requestov a server podľa toho overí užívateľa. Platnosť session ID vyprší po 30 minutách nečinnosti alebo po odoslaní logout requestu.
Operácie typu start/stop/restart a podobne by som riešil takto: POST /v1/vpses/:vps_id?action=start Je to asi len kozmetická zmena, ale mne to pripadá byť trochu viac logické. start/stop/restart nereprezentujú žiadne resources na serveri.
Peťo
_______________________________________________
Community-list mailing list
Community-list@lists.vpsfree.cz
http://lists.vpsfree.cz/listinfo/community-list