Mundarija (26)
- Bu darsda
- 1. Nega bu kerak?
- 2. CIA triadasi
- 2.1 Uch xususiyat
- 2.2 Har hujum — bitta harfni buzadi
- 3. Aktiv, tahdid, zaiflik va risk
- 3.1 To'rtta so'z
- 3.2 Risk: ehtimol × ta'sir
- 4. Hujum yuzasi
- 4.1 Hujumchi qayerdan kiradi
- 4.2 Yuzani kichraytirish
- 5. Hujumchi fikrlashi
- 5.1 Quruvchi va buzuvchi
- 5.2 vazifalar-api ga hujumchi ko'zi bilan
- 5.3 Natija: CIA jadvali
- 6. Ishonch chegaralari
- 7. Hujumchi nigohi
- 8. Ko'p uchraydigan xatolar
- 9. Mashqlar
- 1-mashq (oson): CIA harfini toping
- 2-mashq (o'rta): risk jadvali
- 3-mashq (qiyin): hujum yuzasi hisobchisi
- 10. Loyiha qadami: xavfsizlik hujjati
- 11. Real ishda
- Xulosa
- Manbalar
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-apiga 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-apidagi 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:
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:
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'zgartirishBa'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:
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:
9 kalitsiz DELETE
6 tezlik cheklovi yo'q
3 API bazaga superuser bilan ulanadi
2 xato javobida stack traceBu 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:
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/faylIkkinchi 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:
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:
v1 eshiklari: 12
ma'lumotni o'zgartiradigan: 7
eski yo'llar bilan: 2424 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_modulesdagi 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:
- Kim bu so'rovni yuboryapti? Men buni qayerdan bilaman?
- Nimaga ruxsati bor? Boshqa odamning ma'lumotiga ham tegib ketmaydimi?
- Kirish ma'lumoti noto'g'ri, juda katta yoki g'alati bo'lsa nima bo'ladi?
- Shu amalni ming marta qilsa nima bo'ladi?
- 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:
$ 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:
$ curl -X DELETE -H Origin: https://yovuz.example http://127.0.0.1:4390/v1/vazifalar/2
HTTP/1.1 204 No Content204 — 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:
300 200300 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?
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:
jami vazifalar: 48, egalari: 7Yetti 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:
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:
exit 78
Sozlama noto'g'ri:
✖ butun son bo'lishi kerak (bo'sh qiymat — xato)
→ at PORTBu 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:
- Kirish to'g'rimi? — validatsiya (Validatsiya, Zod).
- Kim yubordi? — autentifikatsiya (authentication).
- 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:
- Kimdir Telegram botingiz tokenini GitHub'da ko'rdi.
- Baza disk to'lgani uchun yozmayapti.
- Hujumchi osh narxini 35 000 dan 1 so'mga o'zgartirdi.
- Xato javobida boshqa foydalanuvchining emaili chiqdi.
Yechim
- C — sir oshkor bo'ldi. Token bilan hujumchi bot nomidan yozishi mumkin, demak keyin I ham buziladi.
- A — tizim kerak paytda ishlamayapti.
- I — ma'lumot ruxsatsiz o'zgardi.
- 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
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:
9 admin paroli admin123
9 buyurtma narxini mijoz yuboradi
4 rasm yuklashda hajm cheklovi yo'q
2 log faylida telefon raqamlarib.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
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:
{ 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:
# 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):
## 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
- OWASP Top 10:2025: https://top10.owasp.org/2025 (2026-10-28 da o'qildi)
- OWASP Threat Modeling Cheat Sheet: https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html
- O'zbekiston Respublikasi Jinoyat kodeksi, 278²-modda (axborot texnologiyalari sohasidagi jinoyatlar bobi): https://lex.uz/docs/111457 (2026-10-28 da tekshirildi)
- Kanon tajribasi (IlmHamroh, 2026-10-27): 27-qism yakuniy
vazifalar-api, Node 24.21.0, PostgreSQL 18.6,curl.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!