Lär dig hur attacker fungerar, vad de kan orsaka — och framför allt hur man skyddar sig.
Webb-säkerhet handlar om att skydda webbplatser, API:er och användares data mot obehörig åtkomst, manipulation och förstörelse.
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, "<");
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,))
Angriparen lurar en inloggad användare att omedvetet skicka en skadlig förfrågan till en webbplats.
bank.se/transfer?to=hacker&amount=10000HTTPS krypterar all kommunikation mellan webbläsare och server med TLS (Transport Layer Security).
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
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 });
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
Access-Control-Allow-Origin: * på ett API som hanterar autentisering eller känslig data. Vitlista bara de domäner som faktiskt ska ha åtkomst.Angriparen provar automatiskt tusentals lösenord tills rätt hittas.
Typer av attacker
Skyddsåtgärder
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'
X-Frame-Options: DENY eller frame-ancestors 'none' i CSP på alla sidor som hanterar känsliga åtgärder.Angriparen skickar enorma mängder trafik från tusentals datorer (botnät) för att krascha servern.
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
securityheaders.com — du får ett betyg A–F.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!
Content-Security-Policy-Report-Only för att testa utan att blockera — du ser vilka resurser som skulle blockeras.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'])
OWASP (Open Web Application Security Project) listar de 10 allvarligaste webb-sårbarheterna.
| # | Sårbarhet | Risk |
|---|---|---|
| A01 | Broken Access Control | Kritisk |
| A02 | Cryptographic Failures | Hög |
| A03 | Injection (SQL, XSS…) | Hög |
| A04 | Insecure Design | Medel |
| A05 | Security Misconfiguration | Medel |
| A06 | Vulnerable Components | Medel |
| A07 | Auth & Session Failures | Hög |
| A08 | Software Integrity Failures | Medel |
| A09 | Logging & Monitoring Failures | Låg |
| A10 | SSRF (Server-Side Request Forgery) | Medel |
npm audit / pip checkWebb-säkerhet är inte en engångsgrej — det är en kontinuerlig process.