Web Security i OWASP Top 10
XSS, SQL Injection, CSRF, CSP headers, bcrypt/Argon2, MFA, HTTPS/CORS i supply chain security w Node.js i Next.js.
6 kluczowych obszarów bezpieczeństwa web
XSS, SQL Injection, Auth, Headers, Supply Chain i CSRF — priorytetyzacja i konkretne narzędzia dla Node.js i Next.js.
| Obszar | Techniki | Narzędzia | Priorytet |
|---|---|---|---|
| XSS Prevention | React auto-escaping, DOMPurify, CSP nonce | helmet, next/headers | Krytyczny |
| SQL Injection | Parameterized queries, ORM (Prisma/Drizzle) | Prisma, pg query params | Krytyczny |
| Auth Security | bcrypt/Argon2, MFA, rate limiting, httpOnly | bcryptjs, otplib, upstash | Krytyczny |
| Security Headers | CSP, HSTS, CORS, Referrer-Policy | helmet, next.config.js | Wysoki |
| Supply Chain | npm audit, lockfile, Dependabot, provenance | Dependabot, Snyk, Socket | Wysoki |
| CSRF Protection | SameSite cookies, CSRF token, double submit | csrf, csurf (legacy) | Wysoki |
Często zadawane pytania
OWASP Top 10 2021 — najważniejsze podatności webowe?
OWASP Top 10 2021: A01 Broken Access Control: brak weryfikacji uprawnień. Mitygacja: autoryzacja per request, deny-by-default, rate limit. A02 Cryptographic Failures: słabe szyfrowanie, HTTP zamiast HTTPS, MD5/SHA1. Mitygacja: TLS 1.2+, bcrypt/Argon2 dla haseł, HSTS. A03 Injection: SQL, NoSQL, LDAP, OS command injection. Mitygacja: parameterized queries, ORMs, input sanitization. A04 Insecure Design: brak threat modeling. A05 Security Misconfiguration: domyślne hasła, verbose errors, otwarte CORS. A06 Vulnerable Components: stare biblioteki z CVE. npm audit, Dependabot. A07 Auth Failures: brute force, weak passwords, session fixation. MFA, rate limiting, secure session. A08 SSRF: Server-Side Request Forgery — serwer wysyła requesty do wewnętrznych zasobów. Walidacja URL, blocklist. A09 Logging Failures: brak logów, brak monitoringu naruszeń. A10 SSRF (nowy 2021). SQL Injection: SELECT * FROM users WHERE id = user_input. Atakujący: 1; DROP TABLE users. Bezpieczne: prepared statements. WHERE id = $1 z parametrem. prisma.user.findUnique({where: {id}}) — automatycznie bezpieczne. XSS (Cross-Site Scripting): stored, reflected, DOM-based. React escapes automatycznie. Unikaj dangerouslySetInnerHTML. DOMPurify dla HTML. CSRF (Cross-Site Request Forgery): malicious site wysyła request w imieniu zalogowanego. SameSite cookies (Lax/Strict). CSRF token. Same-origin check.
Content Security Policy (CSP) i inne Security Headers?
Security Headers: warstwa obrony przed common attacks. Content-Security-Policy (CSP): kontroluj skąd ładowane są zasoby. default-src 'self' — tylko z własnej domeny. script-src 'self' 'nonce-{random}' cdn.example.com. style-src 'self' 'unsafe-inline'. img-src 'self' data: https:. connect-src 'self' api.example.com. frame-ancestors 'none' — brak iframe. upgrade-insecure-requests — HTTP -> HTTPS. Nonce-based CSP: generuj random nonce per request. script tag ma nonce={nonce}. CSP sprawdza nonce przed wykonaniem. Bez 'unsafe-inline'. Next.js CSP: middleware.ts ustawia nagłówek. generateNonce() + headers(). Strict-Transport-Security (HSTS): max-age=31536000; includeSubDomains; preload. X-Frame-Options: DENY (zastąpiony przez CSP frame-ancestors). X-Content-Type-Options: nosniff. Referrer-Policy: strict-origin-when-cross-origin. Permissions-Policy: camera=(), microphone=(), geolocation=(). Cross-Origin headers: CORS (Access-Control-Allow-Origin). COEP (Cross-Origin-Embedder-Policy: require-corp). COOP (Cross-Origin-Opener-Policy: same-origin). SharedArrayBuffer wymaga COEP + COOP. Helmet.js (Express/Fastify): app.use(helmet()) — ustawia wszystkie headers naraz. Next.js headers(): w next.config.js headers() callback. securityHeaders array. Rate Limiting: express-rate-limit, @fastify/rate-limit, Cloudflare. upstash/ratelimit dla serverless (Redis-backed). sliding window, token bucket, fixed window.
Bezpieczna autentykacja — bcrypt, Argon2, secure sessions i MFA?
Hasła: NIGDY plaintext. NIGDY MD5/SHA1 (rainbow tables). bcrypt: adaptive hash, work factor. bcrypt.hash(password, 12) — 2^12 iteracji. Argon2 (winner Password Hashing Competition): Argon2id — recommended. argon2.hash(password, {memoryCost: 65536, timeCost: 3}). Memory-hard — odporny na GPU attacks. Salt: automatyczny w bcrypt/Argon2 — nie dodawaj ręcznie. Session Security: httpOnly cookie — brak dostępu JS. secure flag — tylko HTTPS. sameSite: 'lax' (lub 'strict'). session ID: cryptographically random (crypto.randomUUID()). Session fixation: regeneruj session ID po logowaniu. Logout: usuń session z bazy. Rotacja refresh token. Brute force protection: rate limit per IP i per email. exponential backoff. Account lockout po N próbach. CAPTCHA po podejrzanej aktywności. Multi-Factor Authentication (MFA): TOTP (Time-based OTP): Google Authenticator, Authy. speakeasy lub @otplib/preset-default. QR code setup: otplib.authenticator.keyuri(). Verify: otplib.authenticator.verify({token, secret}). WebAuthn / Passkeys: FIDO2 standard. Biometrika lub hardware key. SimpleWebAuthn library. Phishing-resistant. Backup codes: generuj jednorazowe kody. Hash i przechowuj. Email security: link do resetu hasła — jednorazowy token, wygaśnięcie (15-60min). bcrypt token lub crypto.randomBytes. Sprawdź timing attack (constantTimeEqual).
HTTPS, TLS, certyfikaty i CORS konfiguracja?
TLS/HTTPS: szyfrowanie in-transit. TLS 1.2 minimum (TLS 1.3 zalecane). Let's Encrypt: darmowe certyfikaty. certbot auto-renewal. Cloudflare: SSL bez konfiguracji serwera. Certificate Transparency (CT) logs. Mixed Content: HTTPS strona z HTTP resource = blokada. upgrade-insecure-requests CSP. HSTS preload list. CORS (Cross-Origin Resource Sharing): Same-Origin Policy: przeglądarka blokuje cross-origin requesty. CORS headers zezwalają na wyjątki. Access-Control-Allow-Origin: https://myapp.com (nie '*' dla auth endpoints). Access-Control-Allow-Methods: GET, POST, PUT, DELETE. Access-Control-Allow-Headers: Content-Type, Authorization. Access-Control-Allow-Credentials: true (z konkretnym origin, nie '*'). Preflight: OPTIONS request przed POST/PUT z custom headers. Fastify: @fastify/cors plugin. Next.js: middleware.ts lub route handler headers. Unikaj CORS mistakes: '*' + credentials = błąd przeglądarki. wildcard subdomain: https://*.myapp.com — ryzyko. Lepsza praktyka: whitelist dozwolonych origins. HTTPS na dev: mkcert dla lokalnych certyfikatów. vite: server.https z mkcert-generated cert. Next.js: tylko przez proxy (Nginx) lub Vercel. Subdomain Takeover: nieużywany CNAME -> atakujący przejmuje. Regularny audit DNS. dependency.io, can-i-take-over-xyz. HTTP to HTTPS redirect: 301 permanent redirect. Nginx: return 301 https://$host$request_uri.
Supply chain security — npm audit, Dependabot i SBOM?
Supply chain attacks: malicious code w dependencies. SolarWinds, Log4Shell, left-pad. npm audit: skanuje dependencies pod CVE. npm audit --audit-level=high. npm audit fix — automatyczna poprawka. Różnicuj: devDependencies nie idą na produkcję. Dependabot (GitHub): automatyczne PR dla security updates. dependabot.yml konfiguracja. version-updates dla ecosystem: npm. package-lock.json / pnpm-lock.yaml: lockfile zapewnia reproducible builds. Nie commituj node_modules. Renovate Bot: alternatywa dla Dependabot. Więcej konfiguracji, grupowanie updates. npm provenance (2023): package publisher tworzy SLSA provenance. Weryfikuj że kod na npm = kod na GitHub. Snyk: komercyjne narzędzie do CVE scanning. Integruje z IDE, CI/CD. Socket.dev: wykrywa malicious packages przed instalacją. Analiza behavior packages. SBOM (Software Bill of Materials): lista wszystkich dependencies z wersjami. CycloneDX lub SPDX format. npm sbom --sbom-format=cyclonedx. Wymagane w wielu regulacjach (US gov). npm pack analysis: co faktycznie idzie do package. .npmignore lub package.json files field. Secret scanning: nie commituj .env. gitguardian, GitHub secret scanning. pre-commit hooks — detect secrets. dotenv-vault lub Infisical dla secret management. Environment variables: Vercel/Netlify encrypted env storage. Never log secrets. RBAC dla secret access w CI/CD.
Powiązane artykuły
Skontaktuj się z nami
Porozmawiajmy o Twoim projekcie. Bezpłatna wycena w ciągu 24 godzin.
Wyślij zapytanie
Telefon
+48 790 814 814
Pon-Pt: 9:00 - 18:00
adam@fotz.pl
Odpowiadamy w ciągu 24h
Adres
Plac Wolności 16
61-739 Poznań
Godziny pracy
Wolisz porozmawiać?
Zadzwoń teraz i porozmawiaj z naszym specjalistą o Twoim projekcie.
Zadzwoń teraz