Se for deg et oppdrag, som går ut på å lage en – etter din mening – svært enkel nettbasert applikasjon som skal gjøre det mulig for brukerne å sjekke om det finnes ledige timer til tannlegebehandling eller hjulskift eller noe annet, som krever timebestilling.
Heldigvis har det bakenforliggende systemet et rikt, dokumentert REST-API, som gjør det mulig å gjøre alt i systemet.
Du bestemmer deg derfor for å lage en effektiv, klientbasert applikasjon, som gjør direkte kall mot det eksterne systemet.
Du er naturligvis svært fornøyd med deg selv, for du tror du bare trenger å forholde deg til klientsiden og slipper å bry deg om serverbaserte greier. Serveren skal bare sende statiske filer med HTML, JavaScript, CSS og noen bilder.
"Cross-Origin Request"
Ettersom kunden ikke har noe test-system, koder du raskt en enkel server som er i stand til å tilby kompatibelt API, og du setter i gang med utviklingen og alt går kjempesmidig…
Når du er ferdig, ber du kunden om å få tilgang til API til produksjonssystemet, får API-nøkkel og tester.
Med det funker ikke! I nettleserkonsollen ser du en feilmelding: «Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource». Hæ?
Heldigvis gjør moderne nettlesere det litt vanskelig å gjøre veldig dumme ting. Og det kan være veldig dumt å forsøke å få tilgang til et eksternt system direkte fra nettleseren, selv om systemet har et HTTP-basert API.
Poenget er at noen API-er gir ganske fri tilgang til bakenforliggende systemer, og man gir derfor potensielt hele internettet tilgang til alle funksjoner som API-et eksponerer.
Dokumentasjon blir ofte nedprioritert. Brage fant løsningen, med OpenAPI
Jo, API-nøklene deles
Hæ? Jo, API-nøkkelen blir jo delt med alle.
Hæ? Jo, ta gjerne en titt på hvilke forespørsler nettleseren gjør og hva den sender med av headere og sånt.
Ooops…. Hva er da løsningen?
Løsningen avhenger av hva man ser på som et problem.
Hvis man mener at CORS er problemet, så lager man en dum serverbasert proxy som formidler alt videre til API for det bakenforliggende systemet, sender API-kall dit og ender opp med å sette i drift en løsning med et latent sikkerhetshull.
Ellers lager man fremdeles noe på serversiden, men kontrollerer forespørsler og også kontrollerer hva som sendes videre til det bakenforliggende systemet.
«Jeg mistenker problemet er ganske utberedt.»
Ser eksempler
I løpet av det siste året så jeg iallfall to løsninger, hvor utvikleren lot API-nøkler med omfattende rettigheter bli sendt til vilkårlige nettbrukere for bruk i API-kall fra nettlesere.
Jeg mistenker problemet er ganske utberedt, og gjelder i kanskje enda større grad i mobilapplikasjoner, hvor CORS ikke lenger står i veien når man skal gjøre noe veldig dumt.