IlmHamroh
JavaScript Full-stack/28-qism. Autentifikatsiya va backend xavfsizligi1/31-dars18 daqiqa
Mundarija (26)

Xavfsizlik nima: CIA triadasi, tahdid va hujumchi fikrlashi

Qisqacha: Xavfsizlik — alohida funksiya emas, har qarorda beriladigan savol: "buni kim, qanday buzishi mumkin?". Himoya qilinadigan narsa uch xususiyat bilan o'lchanadi: maxfiylik (begona o'qimasin), yaxlitlik (begona o'zgartirmasin) va mavjudlik (kerak paytda ishlasin) — qisqacha CIA. Bu darsda 27-qism oxiridagi vazifalar-api ga hujumchi ko'zi bilan qaraymiz: kalitsiz har kim Azizning vazifalarini o'qiydi va o'chiradi.

Bu darsda

  • CIA triadasini (maxfiylik, yaxlitlik, mavjudlik) misollar bilan tushuntirasiz.
  • Aktiv, tahdid, zaiflik va risk farqini aytib bera olasiz.
  • Ilovaning hujum yuzasini (attack surface) sanab chiqasiz.
  • Hujumchi beradigan savollarni o'z kodingizga bera olasiz.
  • vazifalar-api dagi 10 ta o'lchangan kuzatuvni CIA bo'yicha ajratasiz.

Oldin bilishingiz kerak: Express'ga kirish, Mashhur middleware'lar (helmet, cors), Row Level Security, Rollar va huquqlar.

25–27-qismlarda vazifalar-api ni qurdik: Express, Postgres, Prisma, Redis. U tez, testlangan va to'g'ri ishlaydi. Lekin bitta savolni hali bermadik: u kimga ishlaydi? Bu qism shu savolga bag'ishlangan.

1. Nega bu kerak?

Tasavvur qiling: Aziz vazifalar-api ni serverga qo'ydi va do'stlariga havolani tashladi. Ertasiga uning vazifalar ro'yxati bo'sh. Kimdir hammasini o'chirib yuborgan. Parol so'ralmagan, chunki parol yo'q edi.

Bu xayoliy voqea emas. Internetga chiqqan har bir server bir necha daqiqada avtomatik skanerlarning nishoniga aylanadi. Ular /.env, /admin, /wp-login.php kabi manzillarni ketma-ket tekshiradi. Ular sizni tanimaydi va sizga qarshi emas. Ular shunchaki ochiq eshik qidiradi.

O'xshatish: uy. Siz uyni chiroyli qurdingiz, mebel qo'ydingiz, chiroqlar yonadi. Lekin eshikda qulf yo'q, derazalar ochiq. Uy "ishlaydi" — ichida yashasa bo'ladi. Ammo uni o'g'irlash ham juda qulay. Dasturda ham shunday: "ishlaydi" va "xavfsiz" — ikki xil savol.

Diqqat: Bu qismdagi har bir hujumni faqat o'z kompyuteringizdagi o'z loyihangizga qarshi sinaymiz. Birovning saytini ruxsatsiz sinash — "shunchaki qiziqish" emas, jinoyat. O'zbekiston Jinoyat kodeksining 278²-moddasi kompyuter axborotiga ruxsatsiz kirishni jinoyat deb belgilaydi (boshqa mamlakatlarda ham shunday qonunlar bor). Kompaniyalar o'z tizimini sinatish uchun yozma ruxsat beradi — buni "pentest" deyishadi.

2. CIA triadasi

2.1 Uch xususiyat

Xavfsizlik mutaxassislari himoya qilinadigan narsani uch savol bilan o'lchaydi. Ularning inglizcha bosh harflari — CIA (Markaziy razvedka boshqarmasi bilan aloqasi yo'q).

Harf Nomi Savol vazifalar misoli
C Maxfiylik (confidentiality) Begona o'qiy oladimi? Boshqa odam Azizning vazifalarini ko'rmasin
I Yaxlitlik (integrity) Begona o'zgartira oladimi? Faqat Aziz o'z vazifasini o'chira olsin
A Mavjudlik (availability) Kerak paytda ishlaydimi? Aziz ertalab kirganda API javob bersin

Bank kartasi misolida: maxfiylik — PIN-kodingizni hech kim bilmaydi; yaxlitlik — hisobingizdagi summani faqat bank o'zgartiradi; mavjudlik — bankomat kerak paytda pul beradi. Uchtasidan biri buzilsa ham, karta "xavfsiz" emas.

2.2 Har hujum — bitta harfni buzadi

Har bir hujumni "qaysi harfni buzadi?" deb so'rab ajratish mumkin. Bu savol hujumning oqibatini tushunishga yordam beradi:

js
const HUJUMLAR = [
  ["vazifalarni kalitsiz o'qish", "C"],
  ["begona vazifani o'chirish", "I"],
  ["sekundiga 10 000 so'rov yuborib serverni to'xtatish", "A"],
  ["parol hash'larini bazadan o'g'irlash", "C"],
  ["vazifa matnini boshqa odam nomidan o'zgartirish", "I"],
];
const NOMLAR = { C: "maxfiylik", I: "yaxlitlik", A: "mavjudlik" };

for (const [hujum, harf] of HUJUMLAR) {
  console.log(`${NOMLAR[harf]}: ${hujum}`);
}

Konsolda:

text
maxfiylik: vazifalarni kalitsiz o'qish
yaxlitlik: begona vazifani o'chirish
mavjudlik: sekundiga 10 000 so'rov yuborib serverni to'xtatish
maxfiylik: parol hash'larini bazadan o'g'irlash
yaxlitlik: vazifa matnini boshqa odam nomidan o'zgartirish

Ba'zi hujumlar bir nechta harfni birdan buzadi. Masalan, bazaga to'liq kirish — hamma narsani o'qish (C) ham, o'zgartirish (I) ham, o'chirish (A) ham.

Tekshirib ko'ring: Server diskida joy tugadi, yangi vazifa saqlanmayapti. Bu qaysi harf? Hujumchi bo'lmasa ham bu xavfsizlik masalasimi?

Javob

Mavjudlik (A). Ha, bu ham xavfsizlik masalasi: CIA hujumchi bor-yo'qligini so'ramaydi, faqat oqibatni o'lchaydi. Disk to'lishi, elektr uzilishi, xato kod ham mavjudlikni buzadi. Shuning uchun zaxira nusxa (Backup va restore) ham xavfsizlik vositasi.

3. Aktiv, tahdid, zaiflik va risk

3.1 To'rtta so'z

Xavfsizlik haqida gapirganda to'rtta so'z doim uchraydi. Ularni uy misolida ko'ramiz:

Atama Ta'rif Uy misoli vazifalar-api misoli
Aktiv (asset) himoya qilinadigan qimmatli narsa oltin uzuk foydalanuvchi vazifalari
Tahdid (threat) aktivga zarar yetkazishi mumkin bo'lgan kuch o'g'ri internetdagi skaner
Zaiflik (vulnerability) tahdid foydalanadigan teshik qulfsiz eshik kalitsiz DELETE
Risk zarar ko'rish ehtimoli va hajmi "uzuk o'g'irlanishi mumkin" "vazifalar o'chirilishi mumkin"

Zaiflikdan amalda foydalanish — hujum (attack). Buning uchun yozilgan kod yoki buyruqni inglizcha exploit deyishadi.

Muhim farq: tahdidni siz yo'qota olmaysiz — o'g'rilar dunyoda bor. Siz faqat zaiflikni yopasiz va aktiv qadrini bilasiz. Shuning uchun dasturchining ishi — zaifliklar bilan.

3.2 Risk: ehtimol × ta'sir

Hamma zaiflikni birdan yopishga vaqt yetmaydi. Qaysi biri birinchi? Oddiy usul: har biriga ikki baho bering — ehtimol (qanchalik oson topiladi, 1–3) va ta'sir (qancha zarar, 1–3). Ko'paytmasi — risk:

js
const ZAIFLIKLAR = [
  { nom: "kalitsiz DELETE", ehtimol: 3, tasir: 3 },
  { nom: "tezlik cheklovi yo'q", ehtimol: 3, tasir: 2 },
  { nom: "API bazaga superuser bilan ulanadi", ehtimol: 1, tasir: 3 },
  { nom: "xato javobida stack trace", ehtimol: 2, tasir: 1 },
];

const tartib = ZAIFLIKLAR
  .map((z) => ({ ...z, risk: z.ehtimol * z.tasir }))
  .toSorted((a, b) => b.risk - a.risk);

for (const z of tartib) console.log(z.risk, z.nom);

Konsolda:

text
9 kalitsiz DELETE
6 tezlik cheklovi yo'q
3 API bazaga superuser bilan ulanadi
2 xato javobida stack trace

Bu baholar taxminiy — ular aniq fan emas, kelishuv. Lekin ular muhokamani tartibga soladi: jamoa "nimadan boshlaymiz?" deb bahslashmaydi, jadvalga qaraydi. toSorted — asl massivni o'zgartirmay saralaydi (Nusxa bilan o'zgartirish).

Maslahat: "Ehtimol 1" — "hech qachon bo'lmaydi" degani emas. Superuser bilan ulanish o'z-o'zidan hujum emas. Lekin boshqa teshik (masalan, SQL injection) bilan birga u kichik xatoni butun bazaning o'g'irlanishiga aylantiradi.

Tekshirib ko'ring: Nega tahdidni emas, zaiflikni kamaytiramiz?

Javob

Tahdid — tashqi kuch: skanerlar, botlar, qiziquvchan odamlar. Ularni dunyodan yo'qotib bo'lmaydi. Zaiflik esa — bizning kodimizdagi teshik, uni biz yopamiz. Aktivni ham kamaytirish mumkin: keraksiz ma'lumotni umuman saqlamaslik — eng ishonchli himoya.

4. Hujum yuzasi

4.1 Hujumchi qayerdan kiradi

Hujum yuzasi (attack surface) — tizimga tashqaridan ta'sir qilish mumkin bo'lgan hamma joylar yig'indisi. Uyda bu — eshiklar, derazalar, tom, yerto'la. API'da — har bir marshrut, har bir metod, har bir parametr, sarlavha, cookie, yuklanadigan fayl.

Kanon tajribasida (IlmHamroh, 2026-10) 27-qism oxiridagi vazifalar-api ning Express router'idan hamma yo'llar kod orqali chiqarildi:

text
GET,POST,PUT           /v1/vazifalar/
POST                   /v1/vazifalar/toplam
GET,PUT,PATCH,DELETE   /v1/vazifalar/:id
GET                    /v1/teglar/
POST                   /v1/eksportlar/
GET                    /v1/eksportlar/:id
GET                    /v1/eksportlar/:id/fayl
GET,POST,PUT           (eski yo'l)/vazifalar/
POST                   (eski yo'l)/vazifalar/toplam
GET,PUT,PATCH,DELETE   (eski yo'l)/vazifalar/:id
GET                    (eski yo'l)/teglar/
POST                   (eski yo'l)/eksportlar/
GET                    (eski yo'l)/eksportlar/:id
GET                    (eski yo'l)/eksportlar/:id/fayl

Ikkinchi yarmiga qarang. API versiyalash darsida eski mijozlar buzilmasin deb /v1 siz yo'llarni ham qoldirgan edik. Kodni o'qigan odam ularni unutadi — hujumchi esa unutmaydi.

Har metod + yo'l jufti — alohida "eshik". Sanab ko'ramiz:

js
const YOLLAR = [
  ["GET,POST,PUT", "/vazifalar/"],
  ["POST", "/vazifalar/toplam"],
  ["GET,PUT,PATCH,DELETE", "/vazifalar/:id"],
  ["GET", "/teglar/"],
  ["POST", "/eksportlar/"],
  ["GET", "/eksportlar/:id"],
  ["GET", "/eksportlar/:id/fayl"],
];

let eshiklar = 0;
let yozadigan = 0;
for (const [metodlar, yol] of YOLLAR) {
  for (const metod of metodlar.split(",")) {
    eshiklar++;
    if (metod !== "GET") yozadigan++;
  }
}
console.log("v1 eshiklari:", eshiklar);
console.log("ma'lumotni o'zgartiradigan:", yozadigan);
console.log("eski yo'llar bilan:", eshiklar * 2);

Konsolda:

text
v1 eshiklari: 12
ma'lumotni o'zgartiradigan: 7
eski yo'llar bilan: 24

24 ta eshik, ulardan 14 tasi ma'lumotni o'zgartiradi. Hammasi bir xil himoyaga muhtoj. Bitta eshik qulfsiz qolsa — qolgan 23 tasining qulfi foydasiz.

4.2 Yuzani kichraytirish

Eng arzon himoya — keraksiz eshikni umuman olib tashlash. Ishlatilmaydigan marshrut, eski versiya, debug sahifasi, ochiq qolgan port — har biri yuzani kattalashtiradi. Kanon 28-qism davomida keraksiz eski yo'llarni yopdi. Qolgan ikkitasi "eskirgan" degan sarlavha bilan ishlaydi. Keyin esa OWASP auditida yana bir versiyasiz ochiq yo'lni topdi — bu haqda OWASP API Security Top 10 darsida.

Hujum yuzasi faqat marshrutlar emas. vazifalar-api uchun to'liq ro'yxat:

  • HTTP marshrutlari va ularning parametrlari (?fields=, ?sort=, kursor);
  • sarlavhalar (Origin, Idempotency-Key, If-Match);
  • so'rov tanasi (JSON, keyinroq yuklanadigan fayllar);
  • bog'liqliklar — node_modules dagi har paket (Ta'minot zanjiri xavfsizligi);
  • baza ulanishi va uning huquqlari;
  • sozlama va sirlar (.env).

5. Hujumchi fikrlashi

5.1 Quruvchi va buzuvchi

Dasturchi odatda quruvchi sifatida o'ylaydi: "foydalanuvchi formani to'ldiradi, tugmani bosadi, natijani ko'radi". Hujumchi esa buzuvchi sifatida o'ylaydi: "formani to'ldirmasam-chi? Tugmani 10 000 marta bossam-chi? Brauzer o'rniga curl ishlatsam-chi?".

Hujumchi fikrlashi — shu ikkinchi nigohni o'zingizga o'rgatish. Har yangi kod uchun beshta savol bering:

  1. Kim bu so'rovni yuboryapti? Men buni qayerdan bilaman?
  2. Nimaga ruxsati bor? Boshqa odamning ma'lumotiga ham tegib ketmaydimi?
  3. Kirish ma'lumoti noto'g'ri, juda katta yoki g'alati bo'lsa nima bo'ladi?
  4. Shu amalni ming marta qilsa nima bo'ladi?
  5. Biror narsa buzilsa (baza, tashqi xizmat), tizim ochiq qoladimi yoki yopiqmi?

5.2 vazifalar-api ga hujumchi ko'zi bilan

Kanon shu savollarni 27-qism yakunidagi API ga berdi va javoblarni o'lchadi. API Postgres bilan, namuna bazasida ishga tushirildi; curl chiqishidan helmet sarlavhalarini qisqartirdik (ular hamma javobda bir xil).

Birinchi savol: kim? Hech qanday kalitsiz so'rov:

text
$ curl http://127.0.0.1:4390/v1/vazifalar?limit=2&fields=id,matn
HTTP/1.1 200 OK
...
{"versiya":13,"vazifalar":[{"id":1,"matn":"JavaScript kursining 26-qismini boshlash #o'qish"},{"id":2,"matn":"Postgres'ni Docker'da ko'tarish #o'qish #docker"}],"sahifa":{"limit":2,"keyingi":"eyJ2IjpbMiwyXSwiaSI6IltbXSx7fV0ifQ"}}

Kanon skripti buyruqni jurnalga qo'shtirnoqsiz yozgan. O'zingiz terminalda terganda manzilni va sarlavhani qo'shtirnoqqa oling: curl "http://127.0.0.1:4390/v1/vazifalar?limit=2" va -H "Origin: https://yovuz.example". Aks holda terminal & va bo'shliqni o'zicha tushunadi.

Nima bo'ldi? API "kim ekansiz?" deb so'ramadi. U foydalanuvchi ID sini sozlamadan (EGASI_ID=1) oladi — ya'ni har bir so'rovni Aziz yuborgan deb hisoblaydi. Maxfiylik (C) buzildi.

Ikkinchi savol: begona sayt-chi? Mashhur middleware'lar darsida CORS sozlagan edik. Begona Origin bilan:

text
$ curl -X DELETE -H Origin: https://yovuz.example http://127.0.0.1:4390/v1/vazifalar/2
HTTP/1.1 204 No Content

204 — vazifa o'chirildi. CORS — brauzer qoidasi: u brauzerga "javobni begona sahifaga ko'rsatma" deydi. curl brauzer emas, u bu qoidaga bo'ysunmaydi. Va eng muhimi: CORS javobni yashiradi, lekin so'rovning o'zi serverga yetib boradi va bajariladi. Yaxlitlik (I) buzildi.

Uchinchi savol: ming marta-chi? 300 ta ketma-ket so'rovning holat kodlari:

text
    300 200

300 tasi ham 200. Cheklov yo'q — kimdir sekundiga minglab so'rov yuborsa, server va baza band bo'ladi. Mavjudlik (A) xavf ostida.

To'rtinchi savol: API bazaga kim bo'lib ulanadi?

text
 usename  | rolsuper | rolbypassrls | count 
----------+----------+--------------+-------
 postgres | t        | t            |     1
(1 row)

postgres — superuser. Row Level Security darsida "har kim faqat o'z vazifasini ko'radi" qoidasini bazaga yozgan edik. Lekin superuser RLS'ni chetlab o'tadi (rolbypassrls = t). Kodda WHERE egasi_id unutilsa nima chiqishini kanon tekshirdi:

text
jami vazifalar: 48, egalari: 7

Yetti kishining 48 ta vazifasi. RLS qatlami bor, lekin ishlamayapti.

Beshinchi savol: g'alati kirish-chi? Bu yerda yaxshi xabar bor. Buzuq JSON, 20 KB lik tana va /.env ga so'rov:

text
400 {"type":"about:blank","title":"Bad Request","status":400,"detail":"Tana yaroqli JSON emas","instance":"/v1/vazifalar","sorovId":"4fe4caf1-adbb-46cf-a09a-e010cb961a67"}
413 {"type":"about:blank","title":"Payload Too Large","status":413,"detail":"Tana 16 KB dan katta","instance":"/v1/vazifalar","sorovId":"eb70e98e-1650-4a44-ab97-a584e37346bc"}
404 {"type":"about:blank","title":"Not Found","status":404,"detail":"GET /.env — bunday manzil yo'q","instance":"/.env","sorovId":"89aab370-c783-4098-9f2a-24218baf2790"}

Uchta javobni bitta ko'rinishga yig'dik: holat kodi va tana. Problem Details darsidagi format ishladi: ichki xato matni ham, stack trace ham, fayl yo'li ham yo'q. sorovId — har so'rovda boshqa. Hujumchi xato javobidan server ichini o'rgana olmaydi.

Yana ikki yaxshi kuzatuv: npm audit --omit=dev — found 0 vulnerabilities; sozlama xato bo'lsa server ishga tushmaydi va qiymatni ekranga chiqarmaydi:

text
exit 78
Sozlama noto'g'ri:
✖ butun son bo'lishi kerak (bo'sh qiymat — xato)
  → at PORT

Bu Env validatsiyasi darsidagi qaror.

5.3 Natija: CIA jadvali

Kuzatuv Buzilgan Qaysi darsda yopiladi
kalitsiz o'qish C Session-based auth
begona origin'dan DELETE → 204 I Tokenni qayerda saqlash va CSRF
300 × 200, 429 yo'q A Tezlik cheklovi
superuser, RLS ishlamaydi C, I RBAC va resurs egaligi
xato javoblari toza, audit 0 — allaqachon yaxshi

Ko'rib turibsizki, API yomon yozilmagan. Xato javoblari toza, bog'liqliklar tekshirilgan, sozlama qat'iy. Lekin unda eng asosiy narsa yo'q: kimligini bilish. Butun 28-qism shu bo'shliqni to'ldiradi.

Tekshirib ko'ring: Kimdir: "CORS to'g'ri sozlangan, demak begona sayt vazifani o'chira olmaydi" dedi. Kanon chiqishiga qarab javob bering.

Javob

Noto'g'ri. Kanon begona Origin bilan DELETE yubordi — 204, vazifa o'chdi. CORS faqat brauzerga javobni o'qishni taqiqlaydi. So'rovning o'zi serverga yetadi va bajariladi. Brauzerda ham ba'zi so'rovlar (oddiy forma yuborish) CORS tekshiruvisiz ketadi — bu CSRF hujumi, uni Tokenni qayerda saqlash va CSRF darsida yopamiz.

6. Ishonch chegaralari

Hujum yuzasini rasmda ko'rish qulay. Ma'lumot bir "dunyo"dan boshqasiga o'tadigan joy — ishonch chegarasi (trust boundary). Brauzer — foydalanuvchining qo'lida, u istagan narsani yubora oladi. Server — sizning qo'lingizda. Ular orasidagi chiziq — chegara.

flowchart LR
  H[Hujumchi sahifasi] -.->|CSRF| B
  B[Brauzer: frontend] -->|HTTPS| N[nginx]
  N --> A[vazifalar-api]
  A --> P[(Postgres + RLS)]
  A --> R[(Redis kesh)]
  A --> T[Tashqi xizmatlar]

Diagrammaga qarang: har strelka chegarani kesib o'tadi. Har kesishishda uchta tekshiruv bo'lishi kerak:

  1. Kirish to'g'rimi? — validatsiya (Validatsiya, Zod).
  2. Kim yubordi? — autentifikatsiya (authentication).
  3. Unga ruxsat bormi? — avtorizatsiya (authorization).

Hozircha vazifalar-api da faqat birinchisi bor. Nginx va HTTPS server sozlamasini kursda keyinroq o'rganamiz — hozir bilish shart emas.

7. Hujumchi nigohi

Endi butun darsni bitta jadvalga yig'amiz. Har qatorda uch narsa: hujum, unga qarshi himoya va himoya ishlayotganini qanday tekshiramiz (test). Tekshiruvsiz himoya — faqat umid.

Hujum Himoya (28-qism) Tekshiruv: kutilgan javob
GET /v1/vazifalar — kalitsiz login va sessiya kalitsiz so'rov → 401
DELETE begona sahifadan CSRF himoyasi begona Origin → 403
ming so'rov tezlik cheklovi (rate limiting) limitdan keyin → 429
unutilgan eski yo'llar yo'llarni yopish, inventar keraksiz eski yo'l → 404
SQL xato + superuser eng kam huquqli rol + RLS begona qator → 0 ta

Nega bu hujumlar hozir ishlaydi — yuqorida ko'rdik: kimlik so'ralmaydi, CORS so'rovni to'xtatmaydi, cheklov yo'q, eski eshik unutilgan. Har qator — keyingi darslardan birining mavzusi. "Kutilgan javob" ustuni esa o'sha darslardagi avtomatik testlarga aylanadi. Shu jadvalni qism oxirigacha eslab qoling.

8. Ko'p uchraydigan xatolar

Xato fikr Nega noto'g'ri To'g'risi
"Mening saytim kichik, hech kim hujum qilmaydi" skanerlar hamma IP manzilni tekshiradi har server — nishon
"CORS himoya qiladi" curl va oddiy forma uni chetlab o'tadi autentifikatsiya + CSRF himoyasi
"localhost'da ishlayapti — xavfsiz" serverga chiqqanda hammasi ochiladi sukut bo'yicha yopiq sozlama
"Xavfsizlikni oxirida qo'shamiz" arxitekturani qayta yozishga to'g'ri keladi har dars, har qarorda
"Frontend tugmani yashirdi — yetarli" hujumchi frontendsiz so'rov yuboradi tekshiruv faqat serverda

Oxirgi qator alohida e'tiborga loyiq. React'da "O'chirish" tugmasini faqat egasiga ko'rsatish — foydalanuvchi qulayligi uchun. Xavfsizlik uchun emas. Server har so'rovni o'zi tekshirishi kerak.

9. Mashqlar

Mashqlar kurs/mashqlar/28/01-xavfsizlik-nima/ da.

1-mashq (oson): CIA harfini toping

Har vaziyat uchun CIA harfini yozing:

  1. Kimdir Telegram botingiz tokenini GitHub'da ko'rdi.
  2. Baza disk to'lgani uchun yozmayapti.
  3. Hujumchi osh narxini 35 000 dan 1 so'mga o'zgartirdi.
  4. Xato javobida boshqa foydalanuvchining emaili chiqdi.
Yechim
  1. C — sir oshkor bo'ldi. Token bilan hujumchi bot nomidan yozishi mumkin, demak keyin I ham buziladi.
  2. A — tizim kerak paytda ishlamayapti.
  3. I — ma'lumot ruxsatsiz o'zgardi.
  4. C — boshqa odamning ma'lumoti ko'rindi.

2-mashq (o'rta): risk jadvali

«Bahor» oshxonasi buyurtma API'sida to'rtta zaiflik topildi (qavsda — ehtimol va ta'sir):

  • "buyurtma narxini mijoz yuboradi" (3, 3);
  • "admin paroli admin123" (3, 3);
  • "log faylida telefon raqamlari" (1, 2);
  • "rasm yuklashda hajm cheklovi yo'q" (2, 2).

Risk bo'yicha saralang. Risk teng bo'lsa — nom bo'yicha alifbo tartibida (localeCompare — sort va taqqoslash funksiyasi). Ishora: toSorted ichida b.risk - a.risk || a.nom.localeCompare(b.nom).

Yechim
js
const ZAIFLIKLAR = [
  { nom: "buyurtma narxini mijoz yuboradi", ehtimol: 3, tasir: 3 },
  { nom: "admin paroli admin123", ehtimol: 3, tasir: 3 },
  { nom: "log faylida telefon raqamlari", ehtimol: 1, tasir: 2 },
  { nom: "rasm yuklashda hajm cheklovi yo'q", ehtimol: 2, tasir: 2 },
];

const tartib = ZAIFLIKLAR
  .map((z) => ({ ...z, risk: z.ehtimol * z.tasir }))
  .toSorted((a, b) => b.risk - a.risk || a.nom.localeCompare(b.nom));

for (const z of tartib) console.log(z.risk, z.nom);

Konsolda:

text
9 admin paroli admin123
9 buyurtma narxini mijoz yuboradi
4 rasm yuklashda hajm cheklovi yo'q
2 log faylida telefon raqamlari

b.risk - a.risk teng bo'lsa 0 chiqadi, || esa ikkinchi qismga o'tadi — nom bo'yicha solishtiradi. Ikki 9 lik zaiflik — eng birinchi navbatda.

3-mashq (qiyin): hujum yuzasi hisobchisi

yuzaniHisobla(yollar) funksiyasini yozing. Kirish — [metodlar, yol] juftlari (darsdagi YOLLAR kabi, lekin to'liq yo'l bilan). Qaytarsin: { jami, yozadigan, versiyasiz } — versiyasiz — /v1/ bilan boshlanmaydigan eshiklar soni. To'rtta yo'lda sinang: GET,POST /v1/vazifalar, DELETE /v1/vazifalar/:id, GET,DELETE /vazifalar/:id, GET /debug/sozlama. Ishora: startsWith("/v1/") (Matn ichida qidirish).

Yechim
js
function yuzaniHisobla(yollar) {
  const natija = { jami: 0, yozadigan: 0, versiyasiz: 0 };
  for (const [metodlar, yol] of yollar) {
    for (const metod of metodlar.split(",")) {
      natija.jami++;
      if (metod !== "GET") natija.yozadigan++;
      if (!yol.startsWith("/v1/")) natija.versiyasiz++;
    }
  }
  return natija;
}

console.log(yuzaniHisobla([
  ["GET,POST", "/v1/vazifalar"],
  ["DELETE", "/v1/vazifalar/:id"],
  ["GET,DELETE", "/vazifalar/:id"],
  ["GET", "/debug/sozlama"],
]));

Konsolda:

text
{ jami: 6, yozadigan: 3, versiyasiz: 3 }

Uchta versiyasiz eshik — ulardan biri /debug/sozlama. Bunday yo'l prodakshnda umuman bo'lmasligi kerak: u sozlamalarni, ehtimol sirlarni ham ko'rsatadi. Hisobchi uni topdi — real loyihada shunday ro'yxatni har relizdan oldin ko'rib chiqish foydali.

10. Loyiha qadami: xavfsizlik hujjati

Bu darsda kod o'zgarmaydi — biz faqat qaradik va o'lchadik. Lekin kuzatuvlar yo'qolib ketmasligi kerak. Kanon ularni loyiha ichidagi hujjatga yozdi: docs/XAVFSIZLIK.md. U kod bilan birga yashaydi va har yangi endpoint qo'shilganda yangilanadi.

Bugun hujjatning ikki bo'limini yozing. Birinchisi — aktivlar va CIA:

text
# vazifalar-api — xavfsizlik modeli

## 1. Aktivlar (nimani himoya qilamiz) va CIA

| Aktiv | C (maxfiylik) | I (yaxlitlik) | A (mavjudlik) |
|---|---|---|---|
| Foydalanuvchi vazifalari va izohlari | boshqa odam o'qimasin | faqat egasi o'zgartirsin | API ishlab tursin |
| Hisob ma'lumotlari (email, telefon, parol hash'i) | sizmasin | — | — |
| Sessiya / token / API kalit | o'g'irlanmasin | soxtalashtirilmasin | — |
| Baza (Postgres) | to'g'ridan kirish yo'q | migratsiya faqat deploy'da | zaxira |
| Sirlar (`.env`) | git'da, logda, javobda yo'q | — | — |

Ikkinchisi — hujum yuzasi, ya'ni yuqoridagi o'lchovlar. Kanon jadvalining birinchi to'rt qatori (kanonda oxirgi ustunda dars raqamlari turibdi — biz ularni mavzu nomi bilan almashtirdik, birinchi jadvaldagi "zaxira" yonidagi havolani ham olib tashladik):

text
## 3. Hujum yuzasi — 27-qism yakunidagi holat

| # | Kuzatuv (o'lchangan) | Xavf | Qayerda yopiladi |
|---|---|---|---|
| 1 | Hech qanday kalitsiz `GET /v1/vazifalar` — Azizning vazifalari | A01, A07 | ro'yxat, login, sessiya |
| 2 | Begona `Origin` bilan `DELETE /v1/vazifalar/2` → 204 | A01 (CSRF) | sessiya, CSRF |
| 3 | 300 ketma-ket so'rov — hammasi 200, 429 yo'q | API4 | rate limit |
| 4 | API bazaga superuser `postgres` bo'lib ulanadi | A01, A02 | `vazifalar_api` roli |

"Xavf" ustunidagi A01, API4 kabi kodlar — OWASP ro'yxatlaridagi toifalar. Ularni OWASP Top 10:2025 xaritasi darsida o'rganamiz; hozircha ustunni bo'sh qoldirsangiz ham bo'ladi. Ular orasidagi bo'lim — ishonch chegaralari — keyingi darsda qo'shiladi.

Fayl hali tugamagan — hali commit qilmang. Hujjat uch darsda to'ladi va 28-qismning uchinchi darsida bitta commit bo'ladi.

11. Real ishda

  • Threat modeling (tahdidlarni modellashtirish) — katta kompaniyalarda yangi funksiya loyihasi xavfsizlik jamoasiga "bu yerda nima buziladi?" savoli bilan ko'rsatiladi. Bugungi jadvallar — uning boshlang'ich shakli.
  • Pentest — kompaniya yozma ruxsat bilan tashqi mutaxassisni o'z tizimini buzishga yollaydi. Hisobot aynan bugungi jadval ko'rinishida: kuzatuv, xavf, tavsiya.
  • Bug bounty — zaiflik topib, egasiga xabar berganga pul to'lanadigan dasturlar. Faqat dastur qoidalarida ruxsat berilgan tizimlar sinaladi.
  • Intervyuda: "CIA nima?", "Autentifikatsiya va avtorizatsiya farqi?", "Hujum yuzasini qanday kamaytirasiz?".

Xulosa

  • Xavfsizlik — har qarorda beriladigan savol: "buni kim, qanday buzishi mumkin?".
  • CIA: maxfiylik (o'qimasin), yaxlitlik (o'zgartirmasin), mavjudlik (ishlab tursin).
  • Aktiv — qimmatli narsa, tahdid — tashqi kuch, zaiflik — teshik, risk — ehtimol × ta'sir.
  • Hujum yuzasi — hamma kirish joylari; keraksiz eshikni olib tashlash — eng arzon himoya.
  • 27-qism oxiridagi vazifalar-api: xato javoblari toza, lekin kimlik yo'q — kalitsiz o'qish va o'chirish ishlaydi.
  • Har hujumni faqat o'z lokal loyihangizda sinang.

Keyingi dars: Xavfsizlik tamoyillari — chuqur himoya, eng kam huquq, sukut bo'yicha xavfsiz va boshqa qoidalar; superuser va RLS ni o'z bazangizda sinab ko'ramiz.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Xavfsizlik nima: CIA triadasi, tahdid va hujumchi fikrlashi — IlmHamroh