Pāriet uz saturu
Atpakaļ uz blogu
Backend8 min lasīšanaVexilian2025. gada 22. decembris

Node.js drošības stiprināšana ar TypeScript un Supabase

Kā TypeScript uzlabo drošību Node.js aplikācijās ar Supabase — statiskā tipizēšana, RLS un izvietošanas drošība.

TypeScript nav tikai "JavaScript ar tipiem". Uzņēmumu kontekstā tā ir drošības stratēģija, kas novērš veselu kļūdu kategoriju pirms kods sasniedz lietotājus. Kombinācijā ar Supabase Row-Level Security un pareizu izvietošanas drošību, TypeScript kļūst par uzņēmuma drošības pamatu.

Kāpēc TypeScript ir svarīgs drošībai

Izpildlaika kļūdu novēršana

Statiskā tipizēšana aptver kļūdas kompilācijas laikā — pirms kodam ir jebkāda iespēja nonākt produkcijā:

  • Null/undefined piekļuve — TypeScript strict mode novērš nejaušu null vērtību piekļuvi, kas ir viens no biežākajiem runtime crash iemesliem
  • Nepareizi API atbildes formāti — tipizētas API atbildes nodrošina, ka frontend vienmēr sagaida pareizo struktūru
  • Trūkstošie lauki — ja datubāzē pieinvieno jaunu lauku, TypeScript kompilators norāda visas vietas, kur kods jāatjaunina
  • Nepareizi funkciju argumenti — tipu sistēma nepieļauj nepareizu argumentu padošanu funkcijām

Injekciju novēršana ar tipizētu klientu

Tipizēts Supabase klients ar ģenerētām tipa definīcijām: ```typescript // Supabase CLI ģenerē tipus no datubāzes shēmas import { Database } from './database.types' const supabase = createClient(url, key)

// Tagad vaicājumi ir tipizēti — nevar pieprasīt neeksistējošas kolonnas const { data } = await supabase.from('users').select('id, email, role') // TypeScript brīdinās, ja 'role' kolonna neeksistē datubāzē ```

Drošības ieguvumi vs JavaScript

  • 75% mazāk runtime kļūdu — pētījumi rāda, ka TypeScript uztver aptuveni 15% visas JS kļūdas kompilācijā
  • Ātrāka kļūdu identificēšana — kļūdas atrod izstrādes laikā, nevis produkcijā
  • Refactoring drošība — lielas koda bāzes var droši pārstrukturēt, jo kompilators uztver visas ietekmes

Tipa definīcijas un linting

ESLint drošības noteikumi

ESLint ar drošības spraudņiem automātiski atklāj riskantus koda modeļus:

  • eslint-plugin-security — atklāj Object.assign uzbrukumus, eval lietojumu, regex DoS (ReDoS), nesanitizētas ievades
  • @typescript-eslint/no-explicit-any — aizliedz any tipu, kas apiET TypeScript drošību
  • no-unsafe-assignment — novērš netipizētu vērtību piešķiršanu tipizētiem mainīgajiem
  • Sonar drošības noteikumi — SonarQube/SonarCloud integrācija uztver drošības ievainojamības CI pipeline

Tipizēts Supabase klients

```bash # Ģenerē TypeScript tipus no datubāzes shēmas npx supabase gen types typescript --linked > src/database.types.ts

# Automātiskā ģenerēšana CI pipeline # GitHub Actions izpilda katru reizi, kad mainās migrations ```

Ieguvumi:

  • Kompilators brīdina, ja vaicājums atsaucas uz neeksistējošu tabulu vai kolonnu
  • Autocomplete IDE vidē — izstrādātājs redz pieejamās kolonnas tieši kodā
  • Tipizētas insercijas novērš nepilnīgu datu ierakstīšanu

Zod validācija ievades datiem

```typescript import { z } from 'zod'

const ContactSchema = z.object({ name: z.string().min(2).max(100), email: z.string().email(), message: z.string().min(10).max(5000), phone: z.string().regex(/^\+?[\d\s-]{7,15}$/).optional(), })

// Serverī — validē PIRMS jebkādas datubāzes darbības const result = ContactSchema.safeParse(req.body) if (!result.success) return res.status(400).json(result.error) ```

Datubāzes drošība ar Supabase

RLS (Row-Level Security) padziļināti

RLS politikas ļauj definēt piekļuvi tabulas līmenī — katram vaicājumam tiek piemērotas drošības politikas neatkarīgi no tā, kāds kods veic vaicājumu:

Piemērs — lietotāji redz tikai savus datus: ```sql CREATE POLICY "Users read own data" ON profiles FOR SELECT USING (auth.uid() = user_id);

CREATE POLICY "Users update own data" ON profiles FOR UPDATE USING (auth.uid() = user_id) WITH CHECK (auth.uid() = user_id); ```

Piemērs — admin piekļuve: ```sql CREATE POLICY "Admins full access" ON profiles FOR ALL USING ( EXISTS (SELECT 1 FROM user_roles WHERE user_id = auth.uid() AND role = 'admin') ); ```

Lomu pārvaldība

Supabase piedāvā trīs galvenās lomas:

  • anon — neautentificēti lietotāji. Minimālas tiesības — tikai publisks saturs
  • authenticated — pieteikušies lietotāji. Piekļuve saviem datiem caur RLS politikām
  • service_role — pilna piekļuve, apiet RLS. Lietot TIKAI serverī, NEKAD klientā

PostgREST drošība

Supabase API (PostgREST) automātiski piemēro RLS — nav iespējams apiet drošību caur API manipulācijām, ja RLS ir konfigurēts korekti.

Izvietošanas drošība

Noslēpumu pārvaldība

  • Nekad .env failā git — .gitignore vienmēr satur .env*. Pre-commit hooks (husky) bloķē commitus ar noslēpumiem
  • Vercel Environment Variables — šifrēti, ar atsevišķiem mainīgajiem development, preview un production vidēm
  • Secrets scanning — GitHub Advanced Security, GitGuardian skenē repozitoriju pēc nejaušiem noslēpumiem
  • Rotācija — API atslēgas un datubāzes paroles regulāri jāmaina (vismaz reizi ceturksnī)

CORS un rate limiting

```typescript // Next.js middleware rate limiting piemērs const rateLimit = new Map()

export function middleware(req: NextRequest) { const ip = req.ip ?? 'unknown' const now = Date.now() const windowMs = 60_000 // 1 minūte const maxRequests = 30

const record = rateLimit.get(ip) if (record && now - record.timestamp < windowMs) { if (record.count >= maxRequests) { return new NextResponse('Too many requests', { status: 429 }) } record.count++ } else { rateLimit.set(ip, { count: 1, timestamp: now }) } } ```

CSP (Content Security Policy)

Stingra CSP galvene novērš XSS uzbrukumus, ierobežojot, no kurienes pārlūks drīkst ielādēt resursus. Next.js atbalsta CSP konfigurāciju caur next.config.ts vai middleware.

TypeScript + Supabase RLS + pareiza DevOps drošība = daudzlīmeņu aizsardzība, kur katrs slānis aptver to, ko iepriekšējais var palaist garām.

Biežāk uzdotie jautājumi

Vai TypeScript palēnina izstrādi?

Sākumā — nedaudz (10–15% vairāk laika tipizēšanai). Bet ilgtermiņā ievērojami paātrina: mazāk kļūdu meklēšanas (75% mazāk runtime errors), drošāks refactoring, labāks autocomplete IDE. Pēc pirmā mēneša komanda parasti ir ātrāka nekā ar JavaScript.

Kas ir RLS un kāpēc tas ir svarīgs?

Row-Level Security — PostgreSQL funkcija, kas kontrolē piekļuvi individuālām datubāzes rindām, balstoties uz politikām. Pat ja aplikācijas kods satur kļūdu, RLS neļaus lietotājam redzēt citu lietotāju datus. Tas ir datubāzes līmeņa drošības slānis.

Vai Supabase ģenerē TypeScript tipus?

Jā. Komanda `npx supabase gen types typescript --linked` izveido tipa definīcijas no datubāzes shēmas. Ieteicams automātiski ģenerēt CI pipeline — katru reizi, kad mainās migrācijas, tipi tiek atjaunināti.

Kā novērst API atslēgu noplūdi?

1) .gitignore vienmēr satur .env*. 2) Pre-commit hooks ar husky/lint-staged skenē pēc noslēpumiem. 3) GitHub Advanced Security vai GitGuardian automātiski skenē repozitoriju. 4) Regulāra atslēgu rotācija (vismaz ceturksnī).

Vai TypeScript aizstāj ievades validāciju?

Nē. TypeScript darbojas kompilācijā — runtime ievades dati joprojām jāvalidē. Zod, Joi vai class-validator ir nepieciešami, lai validētu lietotāju ievades datus serverī. TypeScript + Zod kopā dod gan kompilācijas, gan runtime drošību.

TypeScriptNode.jsSupabasesecurity

Gatavi sakārtot sava uzņēmuma digitālo klātbūtni?

Pieteiciet bezmaksas konsultāciju un kopā atradīsim piemērotāko risinājumu jūsu uzņēmumam.