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.