CSRF-skydd och skydd mot manipulerade formulär

Förstå CSRF-attacker och hur formulärtoken hindrar angripare från att kapa dina formulär. Lär dig varför varje formulär behöver CSRF-skydd.

Utkast

Tänk dig att någon lurar en besökare att klicka på en länk medan hen är inloggad i sin internetbank. Länken leder till ett dolt formulär som, utan att besökaren vet om det, skickar en begäran till banken om att överföra pengar. Banken ser en legitim begäran från en inloggad användare och genomför den. Angriparen har nu flyttat pengar från offrets konto utan att någonsin ha känt till lösenordet.

Det här är CSRF (Cross-Site Request Forgery): en attack där en angripare lurar någon att omedvetet skicka ett formulär eller en begäran till en annan webbplats där hen redan är inloggad.

Det här lär du dig: vad CSRF-attacker är och hur de fungerar, varför de är så farliga även när andra säkerhetsåtgärder finns på plats, hur CSRF-token förhindrar dem och hur du inför skydd i dina formulär.

Vad är CSRF?

CSRF (uttalas "sea-surf") står för Cross-Site Request Forgery. Det är en attack där angriparen utnyttjar att webbläsaren, när du är inloggad på en webbplats, automatiskt litar på din session och skickar med den i varje begäran till den webbplatsen, även om begäran kommer från en annan webbplats.

Attacken går ut på att lura en inloggad besökare att omedvetet skicka ett formulär till en webbplats där hen har ett konto. Angriparen kan inte se offrets lösenord. Det behövs inte. Offret behöver bara redan vara inloggat, och sedan luras hen att göra en begäran (som att skicka ett dolt formulär) som gör något som angriparen vill.

CSRF skiljer sig från andra attacker eftersom den inte kräver att någon stjäl inloggningsuppgifter eller knäcker kryptering. Den utnyttjar offrets förtroende för webbplatsen. Offret är redan inloggat, så webbplatsen litar på begäranden som verkar komma från hen.

Så fungerar CSRF-attacker

En CSRF-attack sker i tre steg.

Steg 1: Offret är inloggat på din webbplats

Någon besöker din webbplats och loggar in på sitt konto. Webbläsaren har nu en aktiv sessionscookie som bevisar att personen är inloggad. Sessionen förblir aktiv så länge personen fortsätter använda webbplatsen.

Steg 2: Angriparen lockar offret till en skadlig sida

Medan offret fortfarande är inloggat på din webbplats besöker hen en sida som angriparen kontrollerar (kanske en länk från sociala medier, en vilseledande annons eller en webbplats som ser seriös ut). På den sidan finns dold kod som skickar ett formulär tillbaka till din webbplats.

Steg 3: Formuläret skickas automatiskt med offrets session

Det dolda formuläret skickas till din webbplats. Eftersom offret redan är inloggat skickar webbläsaren automatiskt med sessionscookien. Ur formulärets perspektiv är det här en legitim begäran från en inloggad användare. Formuläret behandlar den som om offret skickat den med avsikt.

Angriparen har nu gjort något på din webbplats med offrets konto utan att offret vet om det. Hen kan ha ändrat lösenordet, överfört pengar, uppdaterat profilen eller skickat in uppgifter.

Därför fungerar attacken trots andra säkerhetsåtgärder

CSRF-attacker kringgår flera vanliga säkerhetsfunktioner:

HTTPS stoppar inte CSRF. Uppgifterna krypteras under överföringen, men angriparen behöver inte avlyssna dem. Hen skickar bara begäran från offrets webbläsare, som webbplatsen redan litar på.

Lösenordsskydd stoppar inte CSRF. Angriparen behöver aldrig offrets lösenord. Hen utnyttjar bara att offret redan är inloggat.

Ett starkt inloggningssystem stoppar inte CSRF. Även om inloggningen är perfekt fungerar attacken så länge offret är inloggat.

Därför är CSRF-skydd ett eget lager. Det förhindras inte av andra säkerhetsåtgärder. Du måste utforma dina formulär särskilt för att stå emot CSRF-attacker.

CSRF-token: så stoppas attacken

Lösningen är en CSRF-token. Det är en unik, oförutsägbar sträng som din server skapar för varje formulär. Så här fungerar det:

Din server skapar en unik token för varje besökare

När någon laddar en sida med ett formulär skapar servern en slumpmässig token och kopplar den till användarens session. Token är olika varje gång och unik för just den användaren.

Token bäddas in i formuläret

Token läggs in som ett dolt fält i HTML-formuläret. När besökaren skickar formuläret följer token med.

Din server kontrollerar token innan inskicket behandlas

När formuläret skickas kontrollerar servern om token i inskicket stämmer med den token du skapade för användarens session. Om den gör det behandlas formuläret. Om den inte gör det (eller om token saknas) avvisas formuläret.

Angriparens dolda formulär kan inte innehålla en giltig token, eftersom token är oförutsägbara och unika för varje session. En angripare på en annan domän kan varken se eller gissa token. Därför misslyckas attacken. Det dolda formuläret skickas, men din server avvisar det eftersom token inte stämmer.

Så ser en CSRF-token ut i praktiken

I HTML ser ett formulär med CSRF-skydd ut så här:

<form method="POST" action="/submit-form"> <input type="hidden" name="csrf_token" value="a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"> <input type="email" name="email" placeholder="Your email"> <button type="submit">Submit</button> </form>

Fältet `csrf_token` är dolt. Besökaren ser det inte, men det skickas med formulärets övriga data. Din server kontrollerar det innan e-postadressen eller andra uppgifter behandlas.

CSRF-skydd för olika typer av formulär

Traditionella HTML-formulär

Vanliga HTML-formulär (de som POST:ar data till din server) behöver CSRF-token. Det gäller kontaktformulär, inloggningsformulär, formulär för återställning av lösenord och alla formulär som ändrar data på din server.

AJAX- och JavaScript-formulär

Formulär som skickas via JavaScript till en API-slutpunkt behöver också CSRF-skydd. Token kan bäddas in i själva formuläret, lagras i en cookie eller hämtas från en metataggen innan begäran skickas.

API-begäranden utan sessioner

Om ditt API använder tokenbaserad autentisering (som JWT) fungerar CSRF-skyddet annorlunda. Webbläsaren kan inte automatiskt bifoga en JWT-token på samma sätt som en sessionscookie, så traditionell CSRF är ett mindre hot. Ändå är bästa praxis att lägga till en extra CSRF-token för ett starkare skydd.

Andra skydd som fungerar tillsammans med CSRF-token

CSRF-token är det främsta försvaret, men de fungerar bäst tillsammans med andra säkerhetsrutiner.

SameSite-cookies

När du skapar en sessionscookie kan du lägga till attributet `SameSite`, som säger åt webbläsaren att inte skicka med cookien när begäran kommer från en annan domän. Då kan angriparens dolda formulär inte använda offrets session alls.

Kontroll av Referer-huvudet

Din server kan kontrollera Referer-huvudet för att se var begäran kom ifrån. Om ett inskick påstår sig komma från din domän men Referer visar en annan domän är det troligen en attack. (Referer-huvuden kan dock förfalskas, så det är inget fullständigt skydd.)

Double-submit cookie-mönstret

I den här metoden lagras CSRF-token både i en cookie och i ett formulärfält. Din server kontrollerar att de stämmer överens innan inskicket behandlas. Det är mindre vanligt än traditionella token men fungerar bra för applikationer utan sessioner.

Så inför du CSRF-skydd

Detaljerna beror på din teknikstack, men mönstret är detsamma:

  1. Skapa en unik token per session. När en användare startar en session eller laddar en formulärsida skapar din backend en ny token.
  2. Lagra token på serversidan. Spara den kopplad till användarens session.
  3. Lägg in token i formuläret. Lägg till den som ett dolt fält i HTML eller som en metatagg som JavaScript kan läsa.
  4. Validera vid inskick. Innan någon formulärdata behandlas ska du kontrollera att den skickade token stämmer med den lagrade token för sessionen.
  5. Skapa en ny token efter känsliga åtgärder. När en användare byter lösenord eller gör något kritiskt skapar du en ny token.

De flesta moderna ramverk (Django, Rails, Laravel, ASP.NET) hanterar skapande och validering av CSRF-token automatiskt. Om du använder ett ramverk är CSRF-skyddet oftast påslaget som standard. Se bara till att du inte råkar stänga av det.

Vanliga misstag som lämnar formulär sårbara

Att stänga av CSRF-skyddet för bekvämlighets skull. Vissa utvecklare stänger av CSRF-kontrollerna för att göra API-testning enklare eller koden kortare. Gör inte det. Det skapar en verklig sårbarhet.

Att använda en statisk token för alla användare. Token måste vara unik för varje användares session. En token som är densamma för alla (eller densamma alla dagar) skyddar inte mot CSRF.

Att inte skapa nya token. Om du använder samma token i flera veckor har en angripare mer tid att utnyttja den. Skapa nya token regelbundet och alltid efter känsliga åtgärder.

Att bara förlita sig på SameSite-cookies. SameSite hjälper men räcker inte. Använd CSRF-token som främsta försvar och SameSite som reserv.

Att glömma token i vissa formulär. Skyddar du vissa formulär med token men inte andra kommer angripare att använda de oskyddade. Varje formulär som ändrar data behöver skydd.

Så skyddar WEMASY mot CSRF

WEMASY:s formulär har automatiskt CSRF-tokenskydd i varje formulär du skapar. Du behöver inte ställa in något eller tänka på det. När en besökare skickar ett formulär validerar WEMASY token innan inskicket sparas. Skyddet är inbyggt och påslaget som standard.

Läs mer om säkerhetsalternativ för formulär på prissidan.

Vanliga frågor

Kan en angripare gissa en CSRF-token?
I teorin nej. CSRF-token är kryptografiskt slumpmässiga och byts ofta. En angripare som försöker gissa en token skulle behöva testa miljarder möjligheter. I praktiken är CSRF-token så oförutsägbara att gissning inte är en användbar attack. Token får sin styrka av slumpmässighet och unikhet, inte av att hållas hemlig.
Vad händer om en besökare skickar ett formulär och token är ogiltig?
Inskicket avvisas. Din server behandlar inte formulärdatan och sparar inte inskicket. Besökaren ser oftast ett felmeddelande (som "Sessionen har gått ut" eller "Ogiltig begäran") och ombeds försöka igen. Ur angriparens perspektiv fungerar det dolda formuläret helt enkelt inte.
Behöver jag CSRF-skydd om mitt formulär inte kräver inloggning?
Ja. CSRF-attacker kan fungera på formulär som inte kräver inloggning. En angripare kan använda CSRF för att lura en besökare att skicka oönskad data till vilket formulär som helst, oavsett om besökaren är inloggad eller inte. Varje formulär som tar emot inskick behöver CSRF-skydd.
Hur skiljer sig CSRF från XSS?
Cross-Site Scripting (XSS) är när en angripare lägger in skadlig kod på din webbplats som körs i besökarnas webbläsare. CSRF är när en angripare lurar en besökares webbläsare att skicka ett formulär till en annan webbplats. Det är olika attacker med olika försvar. CSRF-token skyddar mot CSRF, medan validering och rengöring av inmatning skyddar mot XSS.
Hur är det med attacker mot mobilappar? Fungerar CSRF-token?
Mobilappar är mindre sårbara för traditionella CSRF-attacker eftersom de inte automatiskt bifogar cookies som webbläsare gör. Mobilappar bör ändå använda token- eller certifikatbaserad autentisering. Om en mobilapp använder cookies eller token som skickas automatiskt med begäranden bör den också validera CSRF-token som ett extra skyddslager.

Använd det direkt
på din egen webbplats.

Börja gratis med WEMASY och bygg din sajt på några minuter.