10.12. CORS i CSRF#

CORS i CSRF dvije su zaštite na strani preglednika koje kamera otvorena prema internetu treba uz HTTPS i prijavu. Svaka se postavlja u nekoliko redaka. Odjeljci u nastavku definiraju pojam i prikazuju integraciju s microdotom.

10.12.1. Što CORS radi#

Cross-Origin Resource Sharing (CORS) mehanizam je preglednika koji omogućuje poslužitelju da pristane na to da određena druga podrijetla čitaju njegove odgovore. Zadana politika istog podrijetla preglednika blokira to čitanje: JavaScript na https://example.com ne može čitati odgovore s https://yard-cam.example.com, jer se različito glavno računalo broji kao različito podrijetlo. CORS je način na strani poslužitelja za odobravanje iznimaka za odabrane sudionike.

Ako se nadzorna ploča poslužuje s same kamere, svaki je zahtjev istog podrijetla i CORS ne čini ništa. Postavka je važna kada nadzorna ploča živi negdje drugdje – javni URL poput https://app.example.com koji komunicira s kamerom na https://yard-cam.example.com:

from microdot.cors import CORS

cors = CORS(
    app,
    allowed_origins=['https://app.example.com'],
    allow_credentials=True,
    max_age=86400,
)

allowed_origins popis je podrijetala kojima je dopušteno čitati odgovore kamere. Podrijetlo nadzorne ploče i samo podrijetlo nadzorne ploče – ne * – tako da treća strana ne može slučajno čitati odgovore kamere.

allow_credentials=True omogućuje zahtjevima različitog podrijetla da uključe kolačić sesije, što je ono što nadzorna ploča treba kako bi ostala prijavljena preko granice podrijetla.

max_age=86400 govori pregledniku da može pohraniti rezultat predprovjere jedan dan. Preglednici šalju dodatni OPTIONS zahtjev prije svakog poziva različitog podrijetla koji koristi metode osim GET/HEAD/POST ili šalje prilagođena zaglavlja; max_age smanjuje taj dodatni trošak na jednu predprovjeru dnevno po ruti.

10.12.2. Što CSRF radi#

Cross-Site Request Forgery (CSRF) napad je u kojem zlonamjerna stranica navodi korisnikov preglednik da pošalje autenticirani zahtjev pouzdanom poslužitelju. Čak i s uspostavljenim CORS-om, skriveni <form> na evil.com koji šalje POST na https://yard-cam.example.com/config doći će do kamere, a preglednik će priložiti kolačić sesije kamere – kolačići slijede odredišno glavno računalo, a ne podrijetlo stranice koja šalje zahtjev – pa kamera spremno obrađuje POST kao da ga je poslao vlasnik.

CSRF zaštita odbija takve zahtjeve. microdot.csrf.CSRF dodaje međusoftver koji pregledava zaglavlje Sec-Fetch-Site na svakom zahtjevu koji mijenja stanje i odbija sve što nije označeno kao same-origin (ili dolazi iz podrijetla dopuštenog CORS-om):

from microdot.csrf import CSRF

CSRF(app, cors=cors)

Prosljeđivanje instance cors omogućuje međusoftveru da prepozna dopušteno podrijetlo nadzorne ploče – kamera i dalje prihvaća POST zahtjeve nadzorne ploče iako su različitog podrijetla.

Sec-Fetch-Site moderni preglednici postavljaju automatski; kamera ne mora ništa raditi na strani klijenta. Za starije preglednike koji ne šalju zaglavlje, CORS popis dopuštenih je rezervna provjera.

10.12.3. Izuzimanje webhookova#

Ako kameri treba webhook krajnja točka za prihvaćanje POST zahtjeva od usluge treće strane u oblaku – recimo povratni poziv od pružatelja arhive – označite rutu s @csrf.exempt kako bi je međusoftver propustio. Rukovatelj je odgovoran za provjeru zahtjeva na neki drugi način – obično Hash-based Message Authentication Code (HMAC) preko korisnog tereta, izračunat s tajnom koju kamera i treća strana dijele, što dokazuje da je zahtjev došao od nekoga tko je znao tajnu. Dvorišna kamera nema ništa od toga, ali dekorator je tu kada vam zatreba.

10.12.4. Osnova u četiri retka#

Nakon što je HTTPS uspostavljen, preporučeni skup za svaku implementaciju kamere okrenute prema internetu je:

Session(app, secret_key=SECRET,
        cookie_options={'http_only': True, 'secure': True})
login = Login()
cors = CORS(app, allowed_origins=[...], allow_credentials=True)
CSRF(app, cors=cors)

Sesija i prijava ranije u poglavlju, CORS i CSRF ovdje, HTTPS iz prethodne teme. Četiri se dijela slažu jedan na drugi i ostaju izvan puta svake rute.

Kamera je sada sigurna za izlaganje otvorenom internetu – HTTPS, prijava, CSRF, CORS.