10.12. CORS és CSRF¶
A CORS és a CSRF az a két böngészőoldali védelem, amelyre egy nyílt internetre néző kamerának a HTTPS és a bejelentkezés mellett szüksége van. Mindegyik néhány sorba telik. Az alábbi szakaszok meghatározzák a fogalmat, és bemutatják a microdot-integrációt.
10.12.1. Mit csinál a CORS¶
A Cross-Origin Resource Sharing (CORS) az a böngészőmechanizmus, amely lehetővé teszi a szervernek, hogy beleegyezzen abba, hogy bizonyos más eredetek (originek) olvassák a válaszait. A böngésző alapértelmezett same-origin policy-ja blokkolja ezt az olvasást: a https://example.com címen futó JavaScript nem olvashatja a https://yard-cam.example.com válaszait, mert a különböző gazdagép különböző eredetnek számít. A CORS a szerveroldali módja annak, hogy kivételeket adjunk a választott partnereknek.
Ha az irányítópultot maga a kamera szolgálja ki, minden kérés azonos eredetű, és a CORS nem csinál semmit. A beállítás akkor számít, amikor az irányítópult máshol él – egy nyilvános URL, mint a https://app.example.com, amely egy https://yard-cam.example.com címen lévő kamerával beszél:
from microdot.cors import CORS
cors = CORS(
app,
allowed_origins=['https://app.example.com'],
allow_credentials=True,
max_age=86400,
)
Az allowed_origins azoknak az eredeteknek a listája, amelyek olvashatják a kamera válaszait. Az irányítópult eredete és csak az irányítópult eredete – nem * – így egy harmadik fél webhelye nem olvashatja véletlenül a kamera válaszait.
Az allow_credentials=True lehetővé teszi, hogy a cross-origin kérések tartalmazzák a munkamenet sütijét, amire az irányítópultnak szüksége van ahhoz, hogy bejelentkezve maradjon egy eredethatáron át.
A max_age=86400 megmondja a böngészőnek, hogy a preflight eredményét egy napig gyorsítótárazhatja. A böngészők egy extra OPTIONS kérést indítanak minden olyan cross-origin hívás előtt, amely a GET/HEAD/POST-tól eltérő metódusokat használ, vagy egyéni fejléceket küld; a max_age ezt a többletterhet útvonalanként napi egy preflightra csökkenti.
10.12.2. Mit csinál a CSRF¶
A Cross-Site Request Forgery (CSRF) az a támadás, ahol egy rosszindulatú oldal ráveszi a felhasználó böngészőjét, hogy hitelesített kérést indítson egy megbízható szerver felé. Még CORS-szal a helyén is, egy rejtett <form> az evil.com oldalon, amely a https://yard-cam.example.com/config címre POST-ol, eléri a kamerát, és a böngésző csatolja a kamera munkamenet-sütijét – a sütik a célgazdagépet követik, nem a kérést indító oldal eredetét – így a kamera boldogan feldolgozza a POST-ot, mintha a tulajdonostól származna.
A CSRF-védelem elutasítja ezeket a kéréseket. A microdot.csrf.CSRF olyan middleware-t ad hozzá, amely minden állapotot módosító kérésen megvizsgálja a Sec-Fetch-Site fejlécet, és elutasít mindent, ami nincs same-origin-ként megjelölve (vagy nem egy CORS-engedélyezett eredetről érkezik):
from microdot.csrf import CSRF
CSRF(app, cors=cors)
A cors példány átadása lehetővé teszi a middleware-nek, hogy meghagyja az irányítópult engedélyezett eredetét – a kamera továbbra is elfogadja az irányítópult POST-jait, még ha azok cross-origin is.
A Sec-Fetch-Site fejlécet a modern böngészők automatikusan beállítják; a kamerának semmit sem kell tennie a kliensoldalon. A fejlécet nem küldő régebbi böngészők esetén a CORS engedélyezési lista a tartalék ellenőrzés.
10.12.3. Webhookok kivételezése¶
Ha a kamerának szüksége van egy webhook-végpontra, hogy POST-okat fogadjon egy harmadik fél felhőszolgáltatásától – mondjuk egy visszahívás az archívumszolgáltatótól –, jelöld meg az útvonalat a @csrf.exempt dekorátorral, hogy a middleware átengedje. A kezelő felelős a kérés valamilyen más módon történő ellenőrzéséért – általában egy Hash-based Message Authentication Code (HMAC) a payloadon, amelyet a kamera és a harmadik fél által megosztott titokkal számítanak ki, és amely bizonyítja, hogy a kérés valakitől származik, aki ismerte a titkot. A hátsó udvari kamerának egyik sincs ezekből, de a dekorátor ott van, amikor szükséged van rá.
10.12.4. A négysoros alapszint¶
Ha a HTTPS a helyén van, a javasolt stack bármely internetre néző kamerás telepítéshez:
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)
Munkamenet és bejelentkezés a fejezet korábbi részében, CORS és CSRF itt, HTTPS az előző témából. A négy darab egymásra épül, és kimarad az egyes útvonalak útjából.
A kamera most már biztonságosan nézhet a nyílt internetre – HTTPS, bejelentkezés, CSRF, CORS.