🔒
Webb Säkerhet
Slide 1 / 20
🔒

Webb­säkerhet

Lär dig hur attacker fungerar, vad de kan orsaka — och framför allt hur man skyddar sig.

⚔️
Attacker
XSS, SQL Injection, CSRF och fler
🛡️
Försvar
HTTPS, CSP, hashing, headers
📋
OWASP
Branschstandard för web-risker
Introduktion

Vad är webb-säkerhet?

Webb-säkerhet handlar om att skydda webbplatser, API:er och användares data mot obehörig åtkomst, manipulation och förstörelse.

  • 🌐Nästan allt sker via webben idag — banker, sjukvård, sociala medier
  • 💸Dataintrång kan kosta företag miljarder kronor
  • 👤Användarnas personliga data och lösenord kan stjälas
  • ⚖️GDPR kräver att personuppgifter skyddas — annars böter
  • 🔑Säkerhet är inte ett tillägg — det måste byggas in från start
⚠️ Fakta: År 2023 kostade cyberbrottslighet globalt mer än 8 biljoner USD.
Attack

XSS – Cross-Site Scripting Hög risk

XSS låter en angripare injicera skadlig JavaScript-kod i en webbsida som sedan körs i offrets webbläsare.

❌ Sårbar kod:

// Sätter in användarens text direkt
div.innerHTML = userInput;

// Angriparen skriver in:
<script>stealCookies()</script>

✅ Säker kod:

// Använd textContent istället
div.textContent = userInput;

// Eller escapa HTML-tecken
input = input.replace(/</g, "&lt;");
Konsekvens: Stöld av sessioner, lösenord, cookies. Angriparen kan agera som inloggad användare.
Attack

XSS – tre typer

💾
Stored XSS
Skadlig kod sparas i databasen (t.ex. i ett kommentarsfält) och visas för alla besökare.
🔗
Reflected XSS
Koden skickas via URL-parameter och reflekteras tillbaka i svaret utan att sparas.
⚙️
DOM-based XSS
Koden manipulerar DOM-trädet direkt i webbläsaren via JavaScript utan att passera servern.
Skydd: Escapa all användar-input. Använd Content Security Policy (CSP). Använd ramverk som React som automatiskt escapar output.
Attack

SQL Injection Hög risk

Angriparen skickar SQL-kod som input och manipulerar databasförfrågningar.

-- Sårbar Python-kod:
query = "SELECT * FROM users WHERE email='" + email + "'"

-- Angriparen skriver in som email:
' OR '1'='1

-- Resulterar i:
SELECT * FROM users WHERE email='' OR '1'='1'
-- → returnerar ALLA användare!

-- Säker lösning — parametriserade queries:
cursor.execute("SELECT * FROM users WHERE email=?", (email,))
Konsekvens: Hela databasen kan läsas, ändras eller raderas. Angriparen kan logga in som vem som helst.
Attack

CSRF – Cross-Site Request Forgery Hög risk

Angriparen lurar en inloggad användare att omedvetet skicka en skadlig förfrågan till en webbplats.

  • 1️⃣Användaren är inloggad på sin bank (har en aktiv cookie)
  • 2️⃣Angriparen skickar ett mejl med en länk: bank.se/transfer?to=hacker&amount=10000
  • 3️⃣Användaren klickar — webbläsaren skickar cookie automatiskt
  • 4️⃣Banken tror det är en legitim förfrågan och genomför överföringen
Skydd: CSRF-tokens (unik kod per formulär), SameSite-cookies, kontrollera Origin-header.
Kryptering

HTTPS & TLS 🔐

HTTPS krypterar all kommunikation mellan webbläsare och server med TLS (Transport Layer Security).

HTTP (osäkert)
Data skickas i klartext.
Vem som helst i nätverket kan läsa lösenord, kortuppgifter, meddelanden.
HTTPS (säkert)
Data krypteras med TLS.
Ingen kan läsa trafiken — inte ens internetleverantören.
  • 📜TLS använder certifikat utfärdade av betrodda CA:er (Certificate Authorities)
  • 🆓Let's Encrypt erbjuder gratis TLS-certifikat
  • 🔒HSTS-header tvingar alltid HTTPS även om användaren skriver http://
Autentisering

Lösenord & Hashing 🔑

Lösenord ska ALDRIG sparas i klartext. Använd alltid en säker hashfunktion.

## Python — bcrypt för lösenordshashing
import bcrypt

# Hasha lösenordet innan lagring
hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt())

# Verifiera vid inloggning
bcrypt.checkpw(input_pw.encode(), hashed)  # True/False

# SHA-256 räcker INTE för lösenord — för snabb!
hashlib.sha256(password.encode()).hexdigest()  # OSÄKERT
Varför bcrypt? Det är medvetet långsamt och har ett inbyggt "salt" som gör rainbow-table-attacker omöjliga.
Autentisering

Säker autentisering

  • 🔢MFA / 2FA — kräv en extra kod (SMS, app) utöver lösenordet
  • Rate limiting — blockera efter för många misslyckade inloggningsförsök
  • 🕐Session timeout — logga ut inaktiva användare automatiskt
  • 🔏Starka lösenord — kräv minst 12 tecken, mix av typer
  • 🔄Lösenordshanterare — uppmuntra användning av t.ex. Bitwarden
  • 🚫Avslöja inte om email eller lösenord var fel — säg bara "felaktiga uppgifter"
JWT (JSON Web Tokens) används ofta för stateless autentisering i API:er. Signera alltid med en stark hemlig nyckel.
Sessions

Cookies & Sessions 🍪

Cookies används för att hålla användaren inloggad. De måste skyddas noggrant.

// Sätt cookie med alla säkerhetsflaggor
res.cookie("session_id", token, {
  httpOnly: true,    // kan ej läsas av JS
  secure:   true,    // bara över HTTPS
  sameSite: "Strict", // skyddar mot CSRF
  maxAge:   3600000  // löper ut efter 1h
});
  • 🔴HttpOnly — förhindrar att JS läser cookien (skyddar mot XSS)
  • 🔐Secure — skickar bara via HTTPS
  • 🛡️SameSite=Strict — skyddar mot CSRF-attacker
CORS

CORS – Cross-Origin Resource Sharing

Webbläsare blockerar som standard förfrågningar till andra domäner. CORS-headers bestämmer vad som är tillåtet.

# Tillåter ALLA origins — OSÄKERT i produktion!
Access-Control-Allow-Origin: *

# Tillåt bara specifik domän — SÄKERT
Access-Control-Allow-Origin: https://minapp.se
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type, Authorization
Viktigt: Sätt aldrig Access-Control-Allow-Origin: * på ett API som hanterar autentisering eller känslig data. Vitlista bara de domäner som faktiskt ska ha åtkomst.
Attack

Brute Force & Credential Stuffing Medel risk

Angriparen provar automatiskt tusentals lösenord tills rätt hittas.

Typer av attacker

  • 💪Brute force — provar alla kombinationer
  • 📖Dictionary — lista med vanliga lösenord
  • 🔄Credential stuffing — läckta lösenord från andra sajter

Skyddsåtgärder

  • ⏱️Rate limiting per IP
  • 🔒Lås konto efter X försök
  • 🤖CAPTCHA vid misstänkt aktivitet
  • 📱2FA som extra lager
Attack

Clickjacking Medel risk

Angriparen lägger din webbplats i en osynlig <iframe> ovanpå en annan sida. Användaren tror sig klicka på en knapp men klickar egentligen på din sida.


<iframe src="https://dinbank.se" style="opacity:0"></iframe>
<button>Klicka för gratis present! 🎁</button>

/* Skydd — HTTP-header som förbjuder inbäddning */
X-Frame-Options: DENY
/* Eller den modernare varianten: */
Content-Security-Policy: frame-ancestors 'none'
Lösning: Sätt X-Frame-Options: DENY eller frame-ancestors 'none' i CSP på alla sidor som hanterar känsliga åtgärder.
Attack

DDoS – Distributed Denial of Service Hög risk

Angriparen skickar enorma mängder trafik från tusentals datorer (botnät) för att krascha servern.

🌊
Volymbaserat
Översvämmar bandbredden med trafik. Mäts i Gbps.
📡
Protokollattack
Utnyttjar svagheter i TCP/IP, t.ex. SYN flood.
🎯
Applikationsattack
HTTP-requests som kräver mycket serverresurser.
Skydd: CDN med DDoS-skydd (Cloudflare, AWS Shield), rate limiting, IP-blockering, lastbalansering.
Försvar

Säkra HTTP-headers 📋

Rätt HTTP-headers skyddar automatiskt mot flera attacker.

# Viktiga säkerhetsheaders att alltid sätta:

Strict-Transport-Security: max-age=31536000  # HSTS
X-Content-Type-Options: nosniff              # ingen MIME-sniffing
X-Frame-Options: DENY                        # skyddar mot clickjacking
Referrer-Policy: strict-origin              # begränsar referrer-info
Permissions-Policy: camera=(), mic=()       # inaktivera APIs
Content-Security-Policy: default-src 'self' # skyddar mot XSS
Verktyg: Testa dina headers på securityheaders.com — du får ett betyg A–F.
Försvar

Content Security Policy (CSP) 🛡️

CSP är ett kraftfullt verktyg som talar om för webbläsaren exakt var skript, bilder och stilar får laddas ifrån.

# Strikt CSP — tillåt bara egna resurser
Content-Security-Policy:
  default-src 'self';
  script-src 'self' https://cdn.exempel.se;
  style-src  'self' 'unsafe-inline';
  img-src    'self' data: https:;
  frame-ancestors 'none';

# Detta blockerar XSS-attacker även om
# angriparen lyckas injicera <script>-taggar!
Tips: Börja med Content-Security-Policy-Report-Only för att testa utan att blockera — du ser vilka resurser som skulle blockeras.
Försvar

Input-validering & Sanitering

Lita aldrig på data från användaren. Validera och sanera all input — både på klienten och servern.

## Python — validering av email och ålder
import re

def validate_email(email):
    pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
    return bool(re.match(pattern, email))

def validate_age(age):
    return isinstance(age, int) and 0 <= age <= 150

# Sanitera HTML-input (ta bort farliga taggar)
import bleach
clean = bleach.clean(user_html, tags=['b', 'i', 'p'])
Regel: Validera på klienten för UX, men alltid igen på servern. Klientvalidering kan kringgås av angriparen.
OWASP

OWASP Top 10 – 2021

OWASP (Open Web Application Security Project) listar de 10 allvarligaste webb-sårbarheterna.

#SårbarhetRisk
A01Broken Access ControlKritisk
A02Cryptographic FailuresHög
A03Injection (SQL, XSS…)Hög
A04Insecure DesignMedel
A05Security MisconfigurationMedel
A06Vulnerable ComponentsMedel
A07Auth & Session FailuresHög
A08Software Integrity FailuresMedel
A09Logging & Monitoring FailuresLåg
A10SSRF (Server-Side Request Forgery)Medel
Bästa praxis

Säkerhets-checklista ✅

  • Använd alltid HTTPS med ett giltigt TLS-certifikat
  • Hasha lösenord med bcrypt eller Argon2 — aldrig MD5/SHA1
  • Validera och sanera all användar-input på serversidan
  • Använd parametriserade queries för all databaskommunikation
  • Sätt rätt säkerhetsheaders (CSP, HSTS, X-Frame-Options…)
  • Håll alla beroenden uppdaterade — kör npm audit / pip check
  • Aktivera MFA för alla administratörskonton
  • Logga säkerhetshändelser och sätt upp larm vid misstänkt aktivitet
🛡️

Sammanfattning

Webb-säkerhet är inte en engångsgrej — det är en kontinuerlig process.

⚔️
Vanligaste attacker
XSS, SQL Injection, CSRF, DDoS, Brute Force, Clickjacking
🛡️
Viktigaste försvar
HTTPS, CSP, input-validering, bcrypt, säkerhetsheaders
📚
Lär dig mer
owasp.org · portswigger.net/web-security · haveibeenpwned.com
Kom ihåg: En säker applikation skyddar inte bara företaget — den skyddar användarnas liv, pengar och integritet.