10.12. CORS och CSRF¶
CORS och CSRF är de två skydd på webbläsarsidan som en kamera på öppet internet behöver vid sidan av HTTPS och inloggning. Vart och ett tar några rader att konfigurera. Avsnitten nedan definierar termen och visar microdot-integrationen.
10.12.1. Vad CORS gör¶
Cross-Origin Resource Sharing (CORS) är webbläsarmekanismen som låter en server välja att tillåta specifika andra ursprung att läsa dess svar. Webbläsarens standard-same-origin policy blockerar den läsningen: JavaScript på https://example.com kan inte läsa svar från https://yard-cam.example.com, eftersom en annan värd räknas som ett annat ursprung. CORS är det serversidiga sättet att bevilja undantag för utvalda motparter.
Om instrumentpanelen serveras från kameran själv är varje förfrågan samma ursprung och CORS gör ingenting. Konfigurationen spelar roll när instrumentpanelen bor någon annanstans – en publik URL som https://app.example.com som pratar med en kamera på 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 är listan över ursprung som tillåts läsa kamerans svar. Instrumentpanelens ursprung och endast instrumentpanelens ursprung – inte * – så att en tredjepartssida inte kan läsa kamerans svar av misstag.
allow_credentials=True låter förfrågningar med olika ursprung inkludera sessionscookien, vilket är vad instrumentpanelen behöver för att förbli inloggad över en ursprungsgräns.
max_age=86400 talar om för webbläsaren att den kan cacha preflight-resultatet i en dag. Webbläsare skickar en extra OPTIONS-förfrågan före varje anrop med annat ursprung som använder andra metoder än GET/HEAD/POST eller skickar anpassade huvuden; max_age skär ner den omkostnaden till en preflight per dag per rutt.
10.12.2. Vad CSRF gör¶
Cross-Site Request Forgery (CSRF) är attacken där en skadlig sida får användarens webbläsare att skicka en autentiserad förfrågan till en betrodd server. Även med CORS på plats kommer ett dolt <form> på evil.com som POST:ar till https://yard-cam.example.com/config att nå kameran, och webbläsaren bifogar kamerans sessionscookie – cookies följer destinationsvärden, inte ursprunget för sidan som gör förfrågan – så kameran behandlar glatt POST:en som om den kom från ägaren.
CSRF-skydd avvisar de förfrågningarna. microdot.csrf.CSRF lägger till mellanprogram som inspekterar huvudet Sec-Fetch-Site på varje tillståndsändrande förfrågan och avvisar allt som inte är märkt same-origin (eller kommer från ett CORS-tillåtet ursprung):
from microdot.csrf import CSRF
CSRF(app, cors=cors)
Att skicka in cors-instansen låter mellanprogrammet undanta instrumentpanelens tillåtna ursprung – kameran accepterar fortfarande instrumentpanel-POST:ar trots att de har olika ursprung.
Sec-Fetch-Site sätts automatiskt av moderna webbläsare; kameran behöver inte göra något på klientsidan. För äldre webbläsare som inte skickar huvudet är CORS-tillåtelselistan reservkontrollen.
10.12.3. Undanta webhooks¶
Om kameran behöver en webhook-endpoint för att acceptera POST:ar från en tredjeparts molntjänst – ett återanrop från arkivleverantören, säg – märk rutten @csrf.exempt så att mellanprogrammet släpper igenom den. Hanteraren ansvarar för att verifiera förfrågan på något annat sätt – vanligtvis en Hash-based Message Authentication Code (HMAC) över nyttolasten, beräknad med en hemlighet som kameran och tredje parten delar, vilket bevisar att förfrågan kom från någon som kände till hemligheten. Bakgårdskameran har ingen av dessa, men dekoratorn finns där när du behöver den.
10.12.4. Fyraradersbaslinjen¶
När HTTPS väl är på plats är den rekommenderade stacken för varje internetvänd kameradistribution:
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)
Session och inloggning tidigare i kapitlet, CORS och CSRF här, HTTPS från föregående ämne. De fyra delarna staplas ovanpå varandra och håller sig utanför varje rutts väg.
Kameran är nu säker att vända mot det öppna internet – HTTPS, inloggning, CSRF, CORS.