Uzņēmumu aplikāciju drošība: OWASP un šifrēšana
Visaptverošs drošības gids — OWASP Top 10, autentifikācija, ievades validācija, atkarību drošība un šifrēšana.
Node.js ir spēcīga un elastīga platforma, bet bez apzinātiem drošības pasākumiem tā ir tikpat ievainojama kā jebkura cita tehnoloģija. OWASP Top 10 aptver biežākos draudus, bet uzņēmuma drošība prasa daudz plašāku skatu — no ievades validācijas līdz šifrēšanai un monitoringam.
Ievades validācija — pirmā aizsardzības līnija
SQL injekciju novēršana
SQL injekcija joprojām TOP 1 ievainojamība pasaulē. Aizsardzība ir vienkārša, bet bieži ignorēta:
- Parameterizēti vaicājumi — VIENMĒR. Supabase `.rpc()`, Prisma ORM, vai `$1, $2` parametri raw SQL — datubāze atdala datus no komandām
- ORM lietošana — Prisma, Drizzle, TypeORM automātiski parametrizē. Bet uzmanīgi ar raw queries
- Stored procedures — biznesa loģika datubāzē ar definētiem parametriem. Supabase RPC ideāli piemērots
- Input whitelisting — atļaujiet tikai zināmus formātus. E-pasts: regex validācija + MX pārbaude. ID: tikai UUID formāts. Skaitlis: parseInt/parseFloat ar NaN pārbaudi
XSS (Cross-Site Scripting) aizsardzība
XSS ļauj uzbrucējam ievietot JavaScript kodu jūsu lapā, kas izpildās citu lietotāju pārlūkā:
- Content Security Policy (CSP) — HTTP galvene, kas ierobežo, no kurienes var ielādēt skriptus, stilus un attēlus. `script-src 'self'` bloķē inline skriptus un ārējus avotus
- HTML sanitizācija — ja pieņemat lietotāja HTML (komentāri, WYSIWYG), izmantojiet DOMPurify vai sanitize-html bibliotēku. Whitelistējiet atļautās tags
- httpOnly cookies — JWT un sesijas tokeni tikai httpOnly + Secure + SameSite=Strict cookies. JavaScript nevar piekļūt
- React automātiskā escape — React automātiski escapē JSX output. Bet `dangerouslySetInnerHTML` apiet šo aizsardzību — lietojiet TIKAI ar sanitizētu saturu
- Output encoding — vienmēr encode lietotāja datus pirms renderēšanas HTML, URL, vai JavaScript kontekstā
CSRF (Cross-Site Request Forgery)
Uzbrucējs liek autentificētam lietotājam veikt nevēlamu darbību:
- SameSite cookies — `SameSite=Strict` vai `Lax` novērš lielāko daļu CSRF
- CSRF tokeni — ja izmantojat formas ar POST, katrai formai unikāls tokens, kas validēts serverī
- Double submit cookie — CSRF token gan cookie, gan request body/header — serveris salīdzina abus
Autentifikācija un autorizācija
JWT labākās prakses
- Īss derīguma termiņš — access token: 15 min. Refresh token: 7–30 dienas (rotējams)
- Refresh token rotācija — katru reizi, kad refresh token tiek izmantots, tiek izsniegts jauns. Vecais tiek invalidēts. Noplūdes "blast radius" samazinās
- Neglabājiet localStorage — XSS uzbrukums = nozagts JWT. Drošāk: httpOnly cookie ar Secure un SameSite flags
- Paraksta algoritms — RS256 (asimetrisks) priekš mikropakalpojumiem (publiskā atslēga verificē, privātā paraksta). HS256 (simetrisks) tikai ja viena servisa apjoms
- Claims minimizācija — JWT payload iekļaujiet tikai user ID un lomu. NE sensitīvus datus (e-pastu, adresi)
- Blacklist/Revocation — critical: JWT nevar atsaukt pirms termiņa. Risinājumi: Redis blacklist, short-lived tokens, token versioning
Lomu balstīta piekļuves kontrole (RBAC)
- Supabase RLS — Row Level Security datubāzes līmenī. Katrai tabulai politikas: `auth.uid() = user_id` — lietotājs redz tikai savus datus
- Middleware autorizācija — API maršrutu līmenī pārbaudiet lomu pirms biznesa loģikas izpildes
- Princips: autorizācija jādublē — gan frontend (UX), gan backend (drošība). Frontend autorizāciju NEKAD neuztveriet kā drošības mehānismu
Atkarību drošība
npm ekosistēmas riski
npm reģistrā 2+ miljoni pakotņu. Ne visas ir drošas:
- npm audit katram CI build. `npm audit --production --audit-level=high` — fokuss uz production atkarībām ar augstiem riskiem
- Lockfile stingri — `npm ci` vienmēr. `npm install` var modificēt lockfile un ieviest unexpected versijas
- Atjauninājumu stratēģija — Dependabot PR automātiski. Drošības atjauninājumi: nekavējoties. Major versijas: testējiet staging vidē
- Minimālisms — katrai jaunai atkarībai jautājiet: vai mums tiešām vajag? left-pad incidents mācīja — mazāk atkarību = mazāk risku
- Pakotņu analīze — pārbaudiet: pēdējā atjaunināšana, uzturētāju skaits, lejupielādes tendences, issues/PR aktivitāte. Pamesta pakotne = drošības risks
HTTP drošība
Drošības galvenes (Helmet.js)
Helmet middleware automātiski pievieno drošības galvenes:
- Strict-Transport-Security — piespiež HTTPS. `max-age=63072000; includeSubDomains; preload`
- Content-Security-Policy — ierobežo resursu avotus. Visefektīvākā XSS aizsardzība
- X-Content-Type-Options: nosniff — novērš MIME type sniffing uzbrukumus
- X-Frame-Options: DENY — novērš clickjacking (jūsu lapa iframe ietvarā citā mājaslapā)
- Referrer-Policy — kontrolē, cik daudz URL informācijas tiek nosūtīts ārējiem servisiem
- Permissions-Policy — ierobežo pārlūka API (ģeolokācija, kamera, mikrofons)
CORS (Cross-Origin Resource Sharing)
- Strikta izcelsmes konfigurācija — `origin: ['https://yourdomain.com']` NEKAD `origin: '*'` produkcijā
- Credentials — ja sūtāt cookies, `credentials: true` un precīzs origin (ne wildcard)
- Metodes un galvenes — atļaujiet tikai nepieciešamās HTTP metodes un custom galvenes
Šifrēšana — dati tranzītā un mierā
TLS (Transport Layer Security)
- HTTPS visur — nav izņēmumi. Arī iekšējā tīklā starp servisiem (zero trust)
- TLS 1.3 — jaunākā versija, ātrāka handshake, stingrāki šifri. Atspējojiet TLS 1.0/1.1
- HSTS preload — reģistrējiet domēnu HSTS preload sarakstā — pārlūki nekad nepieļaus HTTP savienojumu
Datu šifrēšana mierā (at rest)
- AES-256 — industrijas standarts sensitīvu datu šifrēšanai datubāzē (personas dati, finanšu informācija). Node.js crypto modulis
- Envelope šifrēšana — dati šifrēti ar datu atslēgu, datu atslēga šifrēta ar galveno atslēgu. Galvenā atslēga HSM vai KMS
- Paroļu hashēšana — bcrypt (cost factor 12+) vai argon2 (memory-hard, izturīgs pret GPU uzbrukumiem). NEKAD MD5, SHA-1, vai plain SHA-256 parolēm
- Datubāzes šifrēšana — Supabase/PostgreSQL: pgcrypto paplašinājums kolonu līmeņa šifrēšanai. Transparent Data Encryption (TDE) diska līmenī
Ātruma ierobežošana un DDoS aizsardzība
Rate limiting
- Express rate limiter — `express-rate-limit` ar Redis store. Piemērs: 100 pieprasījumi/min. per IP autentificētiem, 20/min. neautentificētiem
- Sliding window algoritms — precīzāks nekā fiksēts logs. Novērš burst uzbrukumus perioda sākumā
- Dažādi limiti dažādiem ceļiem — /api/auth/login: 5 mēģinājumi/15 min. /api/data: 100/min. /api/upload: 10/h
- API key limiti — katram API klientam individuāls limits
WAF un DDoS protection
- Vercel/Cloudflare WAF — Web Application Firewall filtrē ļaunprātīgus pieprasījumus pirms tie sasniedz serveri
- Bot detection — atdala leģitīmus lietotājus no automatizētiem uzbrukumiem
- DDoS mitigation — Cloudflare, AWS Shield, Vercel Edge — absorbē un filtrē liela apjoma uzbrukumus
Biežāk uzdotie jautājumi
Kādi ir biežākie Node.js drošības draudi?
OWASP Top 5 Node.js: 1) Injekcijas (SQL, NoSQL, command). 2) Bojāta autentifikācija (JWT noplūdes, vājas paroles). 3) XSS (cross-site scripting). 4) Nedrošas atkarības (ievainojamas npm pakotnes). 5) Nepietiekama piekļuves kontrole (missing RBAC, broken authorization). Visi risināmi ar pareizu implementāciju un automatizētiem testiem.
Vai Supabase ir drošs?
Ar pareizi konfigurētu RLS — jā, ļoti drošs. Bez RLS — datubāze ir pilnīgi atklāta caur REST API ikvienam, kam ir anon key. Minimāli: 1) RLS ieslēgts katrai tabulai. 2) Politikas definētas (kas var lasīt/rakstīt/dzēst). 3) Service role key NEKAD klienta pusē. 4) API rate limiting.
Cik bieži jāatjaunina atkarības?
Drošības atjauninājumi (CVE critical/high) — nekavējoties, 24-48h. Citas atkarības — vismaz reizi mēnesī ar pilnu testu izpildi. Major versijas — staging vidē ar regresijas testiem. Dependabot automatizē PR izveidi.
Kā pareizi glabāt JWT?
httpOnly cookie ar Secure un SameSite=Strict. NE localStorage (XSS ievainojamība), NE sessionStorage. Access token: 15min. Refresh token: httpOnly cookie ar rotāciju. Server-side validācija katrā pieprasījumā. Blacklist Redis kritiskiem gadījumiem.
Vai Helmet.js pietiek HTTP drošībai?
Helmet ir labs sākums (automātiskas drošības galvenes), bet nepietiek: 1) Pielāgojiet CSP savam projektam (noklusējuma var būt pārāk stingra vai pārāk vāja). 2) Pievienojiet CORS stingru konfigurāciju. 3) Rate limiting. 4) Input validāciju. 5) WAF produktīvākai aizsardzībai.