WisarWisar
Dasturlash kitobi/14-QISM — Xavfsizlik36 daqiqa

14.7-bob: HTTPS, CORS va xavfsizlik header'lari

14-QISM — Web Xavfsizligi · 7-mavzu


1. Kirish va motivatsiya

Oldingi boblarda ilova ichidagi xavfsizlikni ko'rdik (XSS, injection, auth). Endi transport va brauzer sozlamalari darajasidagi himoyani ko'ramiz — ilovaning "tashqi qatlami". HTTPS (TLS) — ma'lumotni shifrlaydi (foydalanuvchi va server o'rtasida — hech kim o'rtada o'qiy/o'zgartira olmaydi). CORS — qaysi saytlar sizning API'ngizga murojaat qila olishini boshqaradi (noto'g'ri sozlash — xavf yoki ilova buzilishi). Xavfsizlik header'lari (helmet, CSP, HSTS) — brauzerga qo'shimcha himoya qoidalarni beradi (XSS, clickjacking, MIME hujumlarini to'sadi). Bularning hammasi OWASP A05 (Security Misconfiguration) bilan bog'liq — noto'g'ri sozlash eng keng zaifliklardan.

Bu qatlam ko'pincha e'tibordan chetda qoladi (dasturchi kod xavfsizligiga e'tibor beradi, lekin transport/header'larni unutadi), lekin u juda muhim: HTTPS'siz — parol/token ochiq tarmoqda (Wi-Fi'da o'g'irlanadi); xavfsizlik header'larsiz — XSS/clickjacking osonroq; noto'g'ri CORS — API har kimga ochiq. Yaxshi xabar: bu himoyalar nisbatan oson (helmet — bir kutubxona, HTTPS — Vercel avtomatik, CORS — to'g'ri sozlash). Bu bob ularning har birini (nega va qanday) ochadi.

Bu bob: HTTPS/TLS (nima, nega, qanday ishlaydi, MITM), CORS (cross-origin nima, qanday ishlaydi, to'g'ri sozlash, keng xatolar), xavfsizlik header'lari (CSP, HSTS, X-Frame-Options, X-Content-Type, helmet), clickjacking (X-Frame himoyasi), va xavfsiz sozlash (A05 — default'lar, keraksizni o'chirish). HTTPS, CORS va helmet — har birini to'liq ochamiz.

O'xshatish: Bu qatlam — uyning tashqi himoyasi (devorlar, eshik qulfi emas — balki o'rab turgan panjara, kamera, pochta qutusi qoidalari). HTTPS — bu maxfiy konvert (xat ochiq otkritka emas — konvertda — pochtachi yo'lda o'qiy olmaydi); HTTPS'siz xat (parol) ochiq — har kim yo'lda o'qiydi. CORS — bu kim sizning eshikingizni taqillata oladi qoidasi (faqat tanish qo'shnilarga ruxsat — har kimga emas); noto'g'ri CORS — har kim eshikni taqillatadi (API ochiq). Xavfsizlik header'lari — bu uydagi ogohlantiruvchi belgilar ("iframe taqiqlangan" — clickjacking, "faqat o'z skriptim" — CSP); ular brauzerga "bu uyda qanday xavfsizlik qoidalari" deb aytadi. Bu tashqi qatlam — ichki qulflar (auth) muhim, lekin tashqi himoya (konvert, panjara, belgilar) ham zarur (biri yetishmasa — boshqa yo'l ochiq).

Nega muhim?

  • HTTPS majburiy — HTTPS'siz parol/token ochiq (Wi-Fi'da o'g'irlanadi — MITM).
  • A05 (OWASP) — noto'g'ri sozlash (CORS, header yo'q) eng keng zaifliklardan.
  • Oson himoya — helmet (bir kutubxona), HTTPS (avtomatik), header'lar — katta ta'sir.
  • Defense in depth — header'lar (XSS/clickjacking) qo'shimcha qatlam (kod himoyasi bilan).

2. Nazariya — chuqur tushuntirish

2.1. HTTPS / TLS (nima va nega)

text
  HTTPS — shifrlangan HTTP (TLS bilan — foydalanuvchiserver o'rtasida):

  HTTP (shifrsiz — XAVFLI):
  Foydalanuvchi ──[ochiq matn: parol=123]──► Server
   o'rtada (Wi-Fi, internet provayder, hacker) HAMMASINI o'qiydi (parol, token, ma'lumot)

  HTTPS (shifrlangan — TLS):
  Foydalanuvchi ──[shifrlangan: x9$#kL@...]──► Server
   o'rtada o'qib bo'lmaydi (shifrlangan); faqat foydalanuvchi va server ochadi

  TLS NIMA QILADI:
   MAXFIYLIK (shifrlash — o'rtada o'qib bo'lmaydi)
   YAXLITLIK (o'zgartirib bo'lmaydi — o'rtada o'zgartirilsa aniqlanadi)
   AUTENTIFIKATSIYA (sertifikat — bu haqiqatan bank.com — soxta emas)

  MITM (Man-in-the-Middle) — HTTPS'siz hujum:
   hujumchi o'rtada (ochiq Wi-Fi) — parol/token o'qiydi yoki o'zgartiradi
   HTTPS bu hujumni to'sadi (shifrlangan)

   HTTPS — shifrlangan (TLS) — parol/token o'rtada o'qib bo'lmaydi (MITM to'siq)
   HTTPS bugun MAJBURIY (HTTP — parol ochiq; Google jazo; brauzer ogohlantirish)

HTTPS / TLS (nima va nega) — shifrlangan ulanishning asosi. HTTPS — shifrlangan HTTP (TLS — Transport Layer Security — bilan). HTTP (shifrsiz): foydalanuvchi serverga ma'lumotni ochiq matn sifatida yuboradi (parol=123) — o'rtada (ochiq Wi-Fi, internet provayder, hujumchi) hammasini o'qiydi (parol, token, shaxsiy ma'lumot — barchasi ochiq). HTTPS (TLS): ma'lumot shifrlangan (x9$#kL@...) — o'rtada o'qib bo'lmaydi (faqat foydalanuvchi va server shifrni ochadi). TLS uch narsani beradi: (1) maxfiylik (shifrlash — o'rtada o'qib bo'lmaydi); (2) yaxlitlik (ma'lumot o'rtada o'zgartirilsa — aniqlanadi — buzilgan deb rad); (3) autentifikatsiya (sertifikat — bu haqiqatan bank.com ekanini tasdiqlaydi — soxta sayt emas). MITM (Man-in-the-Middle) — HTTPS'siz hujum: hujumchi o'rtada turadi (masalan ochiq Wi-Fi'da — kofeshanada) — HTTP so'rovlarni o'qiydi (parol/token o'g'irlik) yoki o'zgartiradi (yomon kod kiritish); HTTPS bu hujumni to'sadi (shifrlangan — hujumchi o'qiy/o'zgartira olmaydi). Ikki nuqta: (1) HTTPS — shifrlangan (TLS) — parol/token o'rtada o'qib bo'lmaydi (MITM to'siq); (2) HTTPS bugun majburiy (HTTP — parol ochiq tarmoqda; Google HTTP saytlarni pasaytiradi — SEO; brauzer "Xavfsiz emas" ogohlantirishi — foydalanuvchi ketadi — 13.10: 2.7). HTTPS — har web ilovaning asosiy talabi (parol, to'lov, shaxsiy ma'lumot uzatiladi — shifrlangan bo'lishi shart). Bepul SSL (Let's Encrypt — 10.8) va avtomatik (Vercel — 13.10: 2.7) — endi HTTPS oson va bepul (HTTP'ni ishlatishning sababi yo'q). HTTPS — transport xavfsizligining poydevori.

2.2. HTTPS amalda (HSTS, sertifikat)

text
  HTTPS AMALDA — sertifikat, HSTS, HTTPHTTPS:

  SERTIFIKAT (TLS sertifikati — saytni tasdiqlaydi):
   Let's Encrypt (bepul, avtomatik — 10.8) yoki provayder
   Vercel/platforma — avtomatik (13.10: 2.7)

  HTTP  HTTPS YO'NALTIRISH (HTTP so'rovni HTTPS'ga):
   foydalanuvchi http:// kiritsa — https://'ga yo'naltir (301)
   platforma avtomatik (yoki Nginx — 10.7)

  HSTS (HTTP Strict Transport Security — header):
  Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
   brauzerga "bu saytni DOIMO HTTPS'da och" (HTTP'ga urinma — 1 yil)
   birinchi HTTP so'rovni ham to'sadi (MITM downgrade hujumiga qarshi)

   HTTPS — sertifikat (Let's Encrypt bepul) + HTTPHTTPS yo'naltir + HSTS (doimo HTTPS)
   HSTS — brauzer saytni doimo HTTPS'da ochadi (HTTP downgrade hujumiga qarshi)

HTTPS amalda (HSTS, sertifikat) — HTTPS'ni to'g'ri sozlash. Sertifikat (TLS sertifikati — saytni tasdiqlaydi — 2.1 autentifikatsiya): Let's Encrypt (bepul, avtomatik yangilanadigan — 10.8 — Certbot bilan) yoki tijoriy provayder; Vercel/platforma — avtomatik (siz hech narsa qilmaysiz — 13.10: 2.7). HTTP HTTPS yo'naltirish: foydalanuvchi http://ni kiritsa (yoki eski havola), https://ga yo'naltirish (301 redirect) — platforma avtomatik qiladi (yoki Nginx — 10.7). HSTS (HTTP Strict Transport Security — header): Strict-Transport-Security: max-age=31536000; includeSubDomains; preload — brauzerga "bu saytni doimo HTTPS'da och, HTTP'ga urinma" deydi (1 yil — max-age). Nega muhim: HSTS'siz, birinchi so'rov HTTP bo'lishi mumkin (http://bank.com keyin HTTPS'ga redirect) — lekin o'sha birinchi HTTP so'rov MITM hujumiga zaif (hujumchi redirect'ni ushlab, HTTP'da ushlab qoladi — downgrade hujumi); HSTS bilan brauzer birinchi so'rovni ham HTTPS'da qiladi (HTTP'ga umuman urinmaydi — downgrade to'siladi). preload — saytni brauzerlarning HSTS ro'yxatiga qo'shish (hatto birinchi tashrifda ham HTTPS). Ikki nuqta: (1) HTTPS — sertifikat (Let's Encrypt bepul) + HTTPHTTPS yo'naltirish + HSTS (doimo HTTPS); (2) HSTS — brauzer saytni doimo HTTPS'da ochadi (HTTP downgrade hujumiga qarshi — birinchi so'rov ham himoyalangan). HSTS — HTTPS'ni majburiy qiladi (foydalanuvchi tasodifan HTTP'da qolmaydi). Vercel/platformalar HSTS'ni qo'shadi (yoki siz header bilan — 2.4). HTTPS + HSTS — to'liq transport himoyasi (shifrlangan + downgrade to'siq). Bu — A02 (Cryptographic Failures) va A05 (Misconfiguration)'ni oldini oladi.

2.3. CORS (cross-origin)

text
  CORS — qaysi SAYT sizning API'ngizga murojaat qila oladi (brauzer himoyasi):

  SAME-ORIGIN POLICY (brauzer qoidasi):
   brauzer default: sayt FAQAT O'Z origin'iga so'rov yubora oladi
   origin = protokol + domen + port (https://app.com:443)
   boshqa origin'ga (https://api.boshqa.com) — BLOKLANADI (default)

  CORS — bu cheklovni BO'SHATISH (server ruxsat bersa):
   server header bilan "menga bu origin'dan so'rov OK" deydi:
  Access-Control-Allow-Origin: https://app.com   (FAQAT shu sayt)

   XAVFLI — har origin'ga ruxsat:
  Access-Control-Allow-Origin: *   (HAR sayt API'ga murojaat — ehtiyot!)
  + Access-Control-Allow-Credentials: true   * bilan BIRGA bo'lmaydi (xavfli)

   XAVFSIZ — aniq origin(lar):
   faqat ruxsat etilgan sayt(lar) (allowlist — app.com, admin.app.com)

   CORS — qaysi origin API'ga murojaat (server header bilan ruxsat — default bloklangan)
   "*" ehtiyot (public API OK, lekin credentials bilan emas); aniq origin afzal

CORS (cross-origin) — qaysi sayt sizning API'ngizga murojaat qila olishini boshqarish. Same-Origin Policy (brauzer qoidasi): brauzer default — sayt faqat o'z origin'iga so'rov yubora oladi (JavaScript orqali); origin = protokol + domen + port (https://app.com:443); boshqa origin'ga (https://api.boshqa.com) so'rov — brauzer bloklaydi (default — xavfsizlik). CORS (Cross-Origin Resource Sharing) — bu cheklovni bo'shatish (server ruxsat bersa): server javob header'ida "menga bu origin'dan so'rov OK" deydi — Access-Control-Allow-Origin: https://app.com (faqat shu sayt murojaat qila oladi). Xavfli sozlash: Access-Control-Allow-Origin: * (har origin'ga ruxsat — har sayt sizning API'ngizga murojaat qila oladi — ehtiyot!) — ayniqsa Access-Control-Allow-Credentials: true bilan birga (* + credentials — xavfli, brauzer ham buni rad qiladi — chunki har sayt cookie bilan so'rov yuborar edi). Xavfsiz sozlash: aniq origin(lar) — faqat ruxsat etilgan sayt(lar) (allowlist — app.com, admin.app.com — boshqalar rad). Ikki nuqta: (1) CORS — qaysi origin API'ga murojaat qila oladi (server header bilan ruxsat — default brauzer bloklaydi — same-origin policy); (2) * ehtiyot (public, ochiq API uchun OK — masalan ob-havo API — lekin credentials/cookie bilan emas); aniq origin afzal (allowlist). Muhim tushuncha: CORS — brauzer himoyasi (faqat brauzer JavaScript'iga ta'sir qiladi — server-to-server yoki Postman'ga emas) — u API'ngizni himoyalamaydi (autentifikatsiya himoyalaydi), balki boshqa saytlar brauzerda sizning API'ngiz ishlatishini boshqaradi. Noto'g'ri CORS (* + credentials) — xavf; juda qattiq CORS — ilova buzilishi (frontend API'ga murojaat qila olmaydi). To'g'ri — aniq origin (frontend domeningiz). CORS — A05 (misconfiguration)'ning keng qismi.

2.4. Xavfsizlik header'lari (CSP, X-Frame, ...)

text
  XAVFSIZLIK HEADER'LARI — brauzerga qo'shimcha himoya qoidalari:

  1. Content-Security-Policy (CSP) — qaysi manbadan kod (XSS himoya — 14.2):
  default-src 'self'; script-src 'self'
   faqat o'z domeningizdan script (XSS skript bloklanadi)

  2. Strict-Transport-Security (HSTS) — doimo HTTPS 2.2-bob:
  max-age=31536000; includeSubDomains

  3. X-Frame-Options — clickjacking himoya (iframe taqiq — 2.5):
  DENY  (sahifani iframe'da ko'rsatib bo'lmaydi)

  4. X-Content-Type-Options — MIME sniffing himoya:
  nosniff  (brauzer fayl turini "taxminlamasin")

  5. Referrer-Policy — referrer maxfiyligi:
  strict-origin-when-cross-origin

  6. Permissions-Policy — brauzer xususiyatlari (kamera, geolokatsiya):
  camera=(), geolocation=()  (keraksizni o'chir)

   Xavfsizlik header'lari — CSP (XSS), HSTS (HTTPS), X-Frame (clickjacking), nosniff (MIME)
   Defense in depth — kod himoyasi + header'lar (qo'shimcha brauzer qatlami)

Xavfsizlik header'lari (CSP, X-Frame, ...) — brauzerga qo'shimcha himoya qoidalari. Bular HTTP javob header'lari — brauzerga "bu saytda qanday xavfsizlik qoidalari" deb aytadi (qo'shimcha himoya qatlami). Asosiylari: (1) Content-Security-Policy (CSP) — qaysi manbadan kod yuklanishini cheklaydi (XSS himoya — 14.2: 2.6): default-src 'self'; script-src 'self' (faqat o'z domeningizdan script — XSS skript kiritilsa ham bloklanadi); (2) Strict-Transport-Security (HSTS) — doimo HTTPS (2.2 — downgrade to'siq); (3) X-Frame-Options — clickjacking himoyasi 2.5-bob: DENY (sahifani <iframe>da ko'rsatib bo'lmaydi — yomon sayt sizning sahifangizni yashirin iframe'da ko'rsatib alday olmaydi); (4) X-Content-Type-Options — MIME sniffing himoyasi: nosniff (brauzer fayl turini "taxminlamasin" — masalan yuklangan fayl .txt, lekin brauzer uni JavaScript deb ishlatmaslik); (5) Referrer-Policy — referrer maxfiyligi (strict-origin-when-cross-origin — boshqa saytga o'tganda to'liq URL'ni yubormaslik — maxfiylik); (6) Permissions-Policy — brauzer xususiyatlarini cheklash (camera=(), geolocation=() — keraksiz xususiyatlarni o'chirish — agar ilova kamera ishlatmasa, taqiqlash). Ikki nuqta: (1) xavfsizlik header'lari — CSP (XSS), HSTS (HTTPS), X-Frame (clickjacking), nosniff (MIME sniffing) — har biri ma'lum hujumdan; (2) defense in depth — kod himoyasi (XSS escape — 14.2) + header'lar (CSP — qo'shimcha brauzer qatlami) — biri buzilsa, ikkinchisi ushlaydi. Bu header'lar oson qo'shiladi (helmet kutubxonasi — 2.6, yoki Next.js middleware — 13.6: Misol 7) va katta ta'sir (ko'p hujumni to'sadi). Ko'p sayt bularni unutadi (kod himoyasiga e'tibor, header'lar yo'q) — bu A05 (misconfiguration). Har production sayt xavfsizlik header'lari bilan bo'lishi kerak (oson, samarali — defense in depth).

2.5. Clickjacking va frame himoyasi

text
  CLICKJACKING — foydalanuvchini YASHIRIN iframe orqali aldash:

  HUJUM:
   hujumchi sizning saytingizni SHAFFOF iframe'da yuklaydi (foydalanuvchi ko'rmaydi)
   ustiga soxta tugma ("Yutuqni oling") qo'yadi
   foydalanuvchi "Yutuq" tugmasini bosadi  aslida YASHIRIN iframe'dagi
    sizning "Pul o'tkaz"/"Tasdiqlash" tugmangizni bosadi (bilmasdan)

  HIMOYA:
  1. X-Frame-Options header:
  X-Frame-Options: DENY        (hech kim iframe'da ko'rsata olmaydi)
  X-Frame-Options: SAMEORIGIN  (faqat o'z saytingiz iframe qila oladi)

  2. CSP frame-ancestors (zamonaviy):
  Content-Security-Policy: frame-ancestors 'none'   (yoki 'self')

   Clickjacking — yashirin iframe orqali foydalanuvchini aldab tugma bostirish
   Himoya — X-Frame-Options: DENY yoki CSP frame-ancestors 'none' (iframe taqiq)

Clickjacking va frame himoyasi — yashirin iframe hujumi. Clickjacking — foydalanuvchini yashirin iframe orqali aldash. Hujum: (1) hujumchi sizning saytingizni (masalan bank, ijtimoiy tarmoq) shaffof (ko'rinmas) iframe'da o'z saytida yuklaydi; (2) iframe ustiga soxta, jozibali kontent qo'yadi ("Yutuqni oling — bu tugmani bosing"); (3) foydalanuvchi "Yutuq" tugmasini bosadi, lekin aslida o'sha nuqtada yashirin iframe'dagi sizning saytingizning tugmasi bor ("Pul o'tkazish", "Ruxsat berish", "Tasdiqlash") — foydalanuvchi bilmasdan o'sha tugmani bosadi (chunki iframe shaffof — u faqat soxta kontentni ko'radi). Natija: foydalanuvchi niyatisiz amal qiladi (pul o'tkazadi, ruxsat beradi). Bu CSRF 14.4-bobga o'xshaydi (foydalanuvchi niyatisiz amal), lekin iframe + soxta UI orqali. Himoya: (1) X-Frame-Options header — DENY (sahifani hech kim iframe'da ko'rsata olmaydi) yoki SAMEORIGIN (faqat o'z saytingiz iframe qila oladi — boshqa sayt rad); (2) CSP frame-ancestors (zamonaviy, kuchliroq) — frame-ancestors 'none' (hech kim) yoki 'self' (faqat o'zi). Ikki nuqta: (1) clickjacking — yashirin iframe orqali foydalanuvchini aldab tugma bostirish (niyatisiz amal); (2) himoya — X-Frame-Options: DENY yoki CSP frame-ancestors 'none' (iframe'da ko'rsatishni taqiqlaydi). Bu oddiy, lekin muhim himoya (bir header — clickjacking to'siladi). Har sayt (ayniqsa amal qiladigan — bank, sozlama) X-Frame-Options: DENY (yoki SAMEORIGIN agar o'z iframe kerak bo'lsa) bilan bo'lishi kerak. Helmet 2.6-bob buni avtomatik qo'shadi. Clickjacking — kam e'tibor beriladi, lekin keng (yashirin iframe — ko'p sayt himoyasiz). Frame himoyasi — A05'ning qismi (xavfsiz header sozlash).

2.6. Helmet va xavfsiz sozlash (A05)

text
  HELMET — xavfsizlik header'larni bir kutubxonada (Express):

  import helmet from "helmet";
  app.use(helmet());   //  barcha xavfsizlik header'lari (CSP, HSTS, X-Frame, nosniff...)
  //  bir qatorda: CSP, HSTS, X-Frame-Options, X-Content-Type-Options, ...

  NEXT.JS — middleware yoki next.config (13.6: Misol 7, 13.10: Misol 2):
  // middleware.ts'da header'lar (CSP, X-Frame...) — qo'lda yoki kutubxona

  XAVFSIZ SOZLASH (A05 — Security Misconfiguration):
   Default parol/sozlamani O'ZGARTIR (admin/admin — yo'q)
   Keraksiz xizmat/port/endpoint O'CHIR (hujum yuzasi — 14.1: 2.5)
   Xato xabari — UMUMIY (stack trace foydalanuvchiga emas — 14.1)
   Direktoriya ro'yxati o'chir (server fayllarini ko'rsatmaslik)
   Yangilab tur (eski versiya — zaiflik — A06, 14.9)
   Xavfsizlik header'lari (helmet — yuqorida)

   Helmet — xavfsizlik header'larni bir kutubxonada (Express — oson)
   A05 — default o'zgartir + keraksizni o'chir + umumiy xato + header'lar + yangilash

Helmet va xavfsiz sozlash (A05) — header'larni oson qo'shish va sozlash xatolarini oldini olish. Helmet — Express uchun xavfsizlik header'larni bir kutubxonada qo'shadigan vosita: app.use(helmet()) — bir qatorda barcha asosiy header'lar (CSP, HSTS, X-Frame-Options, X-Content-Type-Options, va h.k. — 2.4) qo'shiladi (sukut bo'yicha xavfsiz sozlamalar). Bu juda oson (qo'lda har header'ni yozish o'rniga — bir kutubxona). Next.js'da — middleware (13.6: Misol 7) yoki next.config (13.10: Misol 2) bilan header'lar (qo'lda yoki kutubxona — next-safe). Xavfsiz sozlash (A05 — Security Misconfiguration — 14.1: 2.2): (1) default parol/sozlamani o'zgartir (admin/admin, default DB parol — yo'q — eng keng xato); (2) keraksiz xizmat/port/endpoint o'chir (hujum yuzasini kamaytir — 14.1: 2.5 — ishlatilmaydigan API, debug endpoint — yo'q); (3) xato xabari umumiy (stack trace, DB xatosi foydalanuvchiga emas — ichki ma'lumot sizadi — 14.1 — production'da umumiy "Xatolik yuz berdi", tafsilot log'da); (4) direktoriya ro'yxati o'chir (server fayllar ro'yxatini ko'rsatmaslik); (5) yangilab tur (eski versiya — ma'lum zaifliklar — A06 — 14.9 — npm audit); (6) xavfsizlik header'lari (helmet). Ikki nuqta: (1) helmet — xavfsizlik header'larni bir kutubxonada (Express — oson, bir qator); (2) A05 — default o'zgartir + keraksizni o'chir + umumiy xato + header'lar + yangilash. A05 (Security Misconfiguration) — eng keng zaifliklardan (default sozlamalar, header yo'q, ortiqcha ruxsat) — chunki ko'pincha e'tibordan chetda (kod ishlaydi, lekin sozlama xavfsiz emas). Helmet (header'lar) + xavfsiz sozlash qoidalari (default, keraksiz, xato, yangilash) — A05'ni oldini oladi. Bu — ilovaning "tashqi sozlash" xavfsizligi (ichki kod emas — konfiguratsiya). Oson, lekin ko'p e'tibordan chetda (shuning uchun A05 — keng).

2.7. TLS handshake, sertifikat zanjiri va versiyalar

text
  TLS HANDSHAKE — shifrlangan ulanish qanday o'rnatiladi (soddalashtirilgan):

  1. ClientHello    brauzer: "salom, men bu TLS versiya va cipher'larni bilaman"
  2. ServerHello    server: "TLS 1.3, bu cipher'ni tanladim" + SERTIFIKAT yuboradi
  3. SERTIFIKAT tekshiruvi  brauzer: sertifikat ishonchli CA'dan (zanjir)mi,
                             domenga mosmi, muddati o'tmaganmi?
  4. Kalit almashuv  ikkala tomon umumiy maxfiy kalit hosil qiladi (ochiq
                       kalit / Diffie-Hellman) — o'rtada uzatilmaydi
  5. Shifrlangan seans  endi barcha ma'lumot simmetrik kalit bilan shifrlangan

  SERTIFIKAT ZANJIRI (chain of trust):
  Sizning sertifikat  Oraliq CA  Ildiz CA (brauzerga oldindan ishonchli)
   brauzer ildiz CA'ga ishonadi (o'rnatilgan)  zanjir orqali sizga ishonadi

  TLS VERSIYALARI:
  TLS 1.2 — hali keng, xavfsiz (to'g'ri cipher bilan)
  TLS 1.3 — zamonaviy, tezroq (handshake kamroq qadam), xavfsizroq (eski,
            zaif cipher'lar olib tashlangan) — afzal
   SSL 3.0, TLS 1.0/1.1 — eskirgan, zaif — o'chirilishi kerak

   Handshake — sertifikat tekshiruvi + kalit almashuv  shifrlangan seans
   TLS 1.3 afzal; SSL/TLS 1.0/1.1 — o'chir; zanjir ildiz CA'ga borib taqaladi

TLS handshake, sertifikat zanjiri va versiyalar — HTTPS "ostida" nima sodir bo'ladi. Handshake (qo'l berishish) — ulanish shifrlanishidan oldingi kelishuv: (1) brauzer ClientHello yuboradi (qo'llab-quvvatlaydigan TLS versiyalari va cipher suite'lar ro'yxati); (2) server ServerHello bilan versiya va cipher'ni tanlaydi hamda sertifikatini yuboradi; (3) brauzer sertifikatni tekshiradi — ishonchli CA (Certificate Authority) tomonidan imzolanganmi (zanjir orqali), domenga (app.com) mosmi, muddati o'tmaganmi, bekor qilinmaganmi; (4) kalit almashuv — ikkala tomon umumiy maxfiy (simmetrik) kalitni hosil qiladi, lekin bu kalit o'zi tarmoqda uzatilmaydi (ochiq kalit kriptografiyasi / Diffie-Hellman); (5) shundan keyin butun seans shu kalit bilan shifrlanadi. Sertifikat zanjiri (chain of trust): sizning sertifikatingizni bevosita ildiz CA emas, balki oraliq CA imzolaydi, oraliq CA'ni esa ildiz CA imzolaydi; brauzer va operatsion tizimda ildiz CA'lar ro'yxati oldindan o'rnatilgan (ishonchli) — brauzer zanjirni sizning sertifikatingizdan ildiz CA'gacha kuzatib, ishonch hosil qiladi. Cipher suite — handshake'da kelishilgan algoritmlar to'plami (kalit almashuv + shifrlash + yaxlitlik) — zamonaviy, kuchli cipher'lar tanlanishi kerak. TLS versiyalari: TLS 1.2 hali keng qo'llaniladi va to'g'ri cipher bilan xavfsiz; TLS 1.3 — zamonaviy, handshake kamroq qadamda (tezroq) va xavfsizroq (eski, zaif cipher'lar butunlay olib tashlangan) — afzal ko'riladi; SSL 3.0, TLS 1.0/1.1 — eskirgan, ma'lum zaifliklar bilan — o'chirilishi kerak. Ikki nuqta: (1) handshake = sertifikat tekshiruvi + kalit almashuv, so'ng shifrlangan seans; (2) TLS 1.3 afzal, eski versiyalar o'chiriladi, ishonch zanjiri ildiz CA'ga borib taqaladi. Amalda platforma (Vercel — 13.10: 2.7) yoki Nginx 10.7-bob TLS'ni to'g'ri versiya/cipher bilan sozlaydi, sertifikatni esa Let's Encrypt 10.8-bob beradi — bu tafsilotlarni tushunish sozlamani va xatolarni ("sertifikat muddati o'tgan", "ishonchsiz zanjir") to'g'ri talqin qilishga yordam beradi.

2.8. Mixed content (aralash kontent)

text
  MIXED CONTENT — HTTPS sahifada HTTP resurs:

  https://app.com sahifasi ichida:
  <img src="http://cdn.example.com/rasm.png">    HTTP (shifrsiz!)
  <script src="http://cdn.example.com/lib.js">   HTTP (juda xavfli!)

   sahifa HTTPS, lekin resurs HTTP orqali  o'rtada o'qish/o'zgartirish mumkin
   brauzer: PASSIVE (rasm) — ogohlantiradi; ACTIVE (script) — BLOKLAYDI

  YECHIM:
   barcha resurslar https:// bilan (yoki protokolsiz: //cdn.../lib.js)
   CSP: upgrade-insecure-requests (HTTP resurslarni avtomatik HTTPS'ga)

   Mixed content — HTTPS sahifada HTTP resurs (shifrsiz teshik)
   Barcha resurs HTTPS; CSP upgrade-insecure-requests yordam beradi

Mixed content (aralash kontent) — HTTPS sahifa ichida HTTP orqali yuklangan resurs. Sahifaning o'zi https:// bo'lsa-da, uning ichidagi rasm, skript, stil yoki fetch so'rovi http:// orqali yuklansa — o'sha resurs shifrlanmagan (o'rtada o'qish/o'zgartirish mumkin) — bu HTTPS'ning ma'nosini buzadi. Brauzer ikki xil munosabatda bo'ladi: passive mixed content (rasm, video — sahifaga bevosita kod kiritmaydi) — odatda ogohlantiradi yoki yuklamaydi; active mixed content (skript, stil, fetch, iframe — sahifa xatti-harakatiga ta'sir qiladi) — butunlay bloklaydi (chunki o'zgartirilgan skript sahifani egallashi mumkin). Yechim: barcha resurslarni https:// orqali yuklash (yoki protokolsiz //host/... — sahifa protokolini meros qiladi); qo'shimcha himoya — CSP direktivasi upgrade-insecure-requests (brauzer barcha HTTP resurs so'rovlarini avtomatik HTTPS'ga ko'taradi). Ikki nuqta: (1) mixed content — HTTPS sahifadagi HTTP resurs, bu shifrlangan qatlamda teshik; (2) barcha resurs HTTPS bo'lishi, upgrade-insecure-requests esa qoldiq havolalarni himoyalashi kerak. Bu ko'pincha eski/qattiq kodlangan http:// havolalardan kelib chiqadi (rasm CDN, tashqi kutubxona) — HTTPS'ga o'tishda alohida tekshiriladi.

2.9. CORS chuqurroq — simple vs preflight, credentials, keng xatolar

text
  CORS SO'ROV TURLARI:

  SIMPLE (oddiy) so'rov — preflight'siz to'g'ridan-to'g'ri yuboriladi:
   GET / POST / HEAD + oddiy header'lar + oddiy Content-Type
    (text/plain, form-urlencoded, multipart)

  PREFLIGHT (oldindan so'rash) — brauzer avval OPTIONS yuboradi:
   PUT/DELETE/PATCH, yoki maxsus header (Authorization, application/json)
  1. Brauzer  OPTIONS (preflight): "shu metod/header'ga ruxsatmi?"
     Access-Control-Request-Method: DELETE
     Access-Control-Request-Headers: authorization, content-type
  2. Server  ruxsat header'lari bilan javob:
     Access-Control-Allow-Methods: GET,POST,PUT,DELETE
     Access-Control-Allow-Headers: authorization, content-type
     Access-Control-Max-Age: 86400    preflight'ni 1 kun kesh (qayta so'ramaydi)
  3. OK bo'lsa  brauzer asosiy so'rovni yuboradi

  CREDENTIALS (cookie / Authorization bilan):
   so'rovda credentials bo'lsa, server:
     Access-Control-Allow-Origin: https://app.com    ANIQ (* MUMKIN EMAS)
     Access-Control-Allow-Credentials: true
   "*" + credentials = brauzer rad etadi (xavfsizlik)

   CORS XAVFSIZLIK XATOLARI:
   origin reflection: kelgan Origin'ni ko'r-ko'rona qaytarish (= har origin OK)
   null origin'ga ruxsat (sandbox iframe / redirect null yuboradi — xavf)
   regex xato: /app\.com/  "app.com.hacker.com" ham mos (nuqta escape emas)

   Simple — to'g'ridan; preflight (OPTIONS) — PUT/DELETE/maxsus header uchun
   Credentials bilan aniq origin shart; origin reflection/null/regex — xato

CORS chuqurroq — simple vs preflight, credentials, keng xatolar. CORS so'rovlari ikki turga bo'linadi. Simple (oddiy) so'rov — brauzer uni to'g'ridan-to'g'ri yuboradi (preflight'siz): metod GET/POST/HEAD, faqat oddiy header'lar, va Content-Type faqat text/plain, application/x-www-form-urlencoded yoki multipart/form-data bo'lsa. Preflight (oldindan so'rash) — boshqa hollarda (masalan PUT/DELETE/PATCH, yoki Authorization header, yoki Content-Type: application/json) brauzer avval OPTIONS so'rovini yuboradi: "shu metod va header'larga ruxsat beriladimi?" (Access-Control-Request-Method, Access-Control-Request-Headers); server ruxsat header'lari bilan javob beradi (Access-Control-Allow-Methods, Access-Control-Allow-Headers), va Access-Control-Max-Age bilan preflight javobini keshlash muddatini beradi (masalan 86400 — 1 kun — brauzer har so'rovda qayta preflight qilmaydi); ruxsat bo'lsa brauzer asosiy so'rovni yuboradi. Credentials (cookie yoki Authorization bilan cross-origin so'rov): server Access-Control-Allow-Credentials: true qaytarishi va Access-Control-Allow-Originni aniq origin bilan berishi shart — bu holda * ishlamaydi (brauzer rad etadi), chunki har saytga cookie bilan kirishga ruxsat berish xavfli bo'lardi. Keng CORS xavfsizlik xatolari: (1) origin reflection — server kelgan Origin sarlavhasini ko'r-ko'rona Access-Control-Allow-Originga qaytaradi (allowlist'ni tekshirmasdan) — bu amalda "har origin'ga ruxsat" (*ga teng, credentials bilan bo'lsa juda xavfli); (2) null origin'ga ruxsatOrigin: null (sandbox iframe, ba'zi redirect'lar yuboradi) allowlist'ga qo'shilsa, hujumchi buni ekspluatatsiya qiladi; (3) regex xatosi — origin'ni noto'g'ri naqsh bilan tekshirish (/app\.com/ yoki escape qilinmagan nuqta app.com) evil-app.com yoki app.com.hacker.comga ham mos kelib qoladi. Ikki nuqta: (1) simple so'rov to'g'ridan yuboriladi, preflight (OPTIONS) esa PUT/DELETE/maxsus header uchun oldindan so'raydi; (2) credentials bilan aniq origin majburiy, origin reflection / null origin / regex xatolari — keng zaifliklar. To'g'ri yondashuv — aniq allowlist bilan qat'iy tenglik tekshiruvi (Misol 3), NestJS/Express enableCors/cors() sozlamasi orqali (5.20 cross-ref).

2.10. CORS xatolarini debugging qilish

text
  CORS XATOSI — brauzer konsolida (namunaviy):
  "Access to fetch at 'https://api.app.com' from origin 'https://app.com'
   has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header..."

  DEBUGGING QADAMLAR:
  1. Bu SERVER xatosi emas — brauzer bloklayapti (server javob berdi,
     lekin ruxsat header yo'q/noto'g'ri)  server 200 qaytarsa ham blok bo'ladi
  2. Network tab  OPTIONS (preflight) so'rovini ko'r  javob header'larini tekshir
  3. Access-Control-Allow-Origin server javobida bormi, so'rov origin'iga mosmi?
  4. Preflight (OPTIONS) 200/204 qaytaryaptimi? (yoki 404 — route yo'q)
  5. Credentials bilan?  Allow-Credentials: true + ANIQ origin (* emas) kerak

   CORS xatosi — brauzer bloki (server emas); Network > OPTIONS javobini tekshir
   * + credentials, preflight 404, mos kelmagan origin — keng sabablar

CORS xatolarini debugging qilish. CORS xatosi brauzer konsolida ko'rinadi ("...blocked by CORS policy: No 'Access-Control-Allow-Origin' header..."). Muhim tushuncha: bu server xatosi emas — server odatda javob beradi (hatto 200 bilan), lekin brauzer kerakli ruxsat header'i yo'qligi (yoki mos kelmagani) uchun javobni JavaScript'ga bermaydi (bloklaydi). Debugging qadamlari: (1) buni server tomonida "500 xato" deb qidirmaslik kerak — muammo ruxsat header'larida; (2) brauzer Network panelida preflight OPTIONS so'rovini topib, uning javob header'larini ko'rish; (3) Access-Control-Allow-Origin server javobida bor-yo'qligini va so'rov Originiga mosligini tekshirish; (4) preflight OPTIONS 200/204 qaytaryaptimi yoki 404 (route mavjud emas — server OPTIONSni ishlamayapti); (5) credentials ishlatilsa — Access-Control-Allow-Credentials: true va aniq origin borligini tekshirish. Ikki nuqta: (1) CORS xatosi — brauzer bloki (server emas), shuning uchun Network panelidagi OPTIONS javobini tekshirish kerak; (2) keng sabablar — * + credentials, preflight 404, mos kelmagan yoki yo'q Allow-Origin. Odatiy tuzatish — server CORS sozlamasida so'rov origin'ini allowlist'ga qo'shish va preflight'ni to'g'ri ishlatish (Express cors() / NestJS enableCors avtomatik OPTIONSni boshqaradi — 5.20, Misol 3).

text
  QO'SHIMCHA HIMOYA HEADER'LARI:

  CROSS-ORIGIN IZOLYATSIYA (Spectre kabi hujumlarga qarshi):
  Cross-Origin-Opener-Policy: same-origin        (COOP — oyna izolyatsiyasi)
  Cross-Origin-Embedder-Policy: require-corp      (COEP)
  Cross-Origin-Resource-Policy: same-origin       (CORP — resursni himoya)

  MAXFIY SAHIFA KESHI:
  Cache-Control: no-store, no-cache, must-revalidate   (maxfiy — keshlamaslik)
   bank/profil sahifasi brauzer/proxy keshida qolmasin

  COOKIE XAVFSIZLIGI (Set-Cookie — 14.4 / 14.6 cross-ref):
  Set-Cookie: token=...; HttpOnly; Secure; SameSite=Strict
   HttpOnly (JS o'qiy olmaydi — XSS o'g'irlamaydi)
   Secure (faqat HTTPS'da yuboriladi) · SameSite (CSRF himoya)

  SRI (Subresource Integrity — CDN skript butunligi):
  <script src="https://cdn/lib.js"
          integrity="sha384-..." crossorigin="anonymous"></script>
   CDN buzilsa/o'zgarsa (hash mos kelmasa) — brauzer skriptni ISHLATMAYDI

   COOP/COEP/CORP — cross-origin izolyatsiya; Cache-Control — maxfiy sahifa
   Cookie: HttpOnly+Secure+SameSite; SRI — CDN skript hash tekshiruvi

COOP/COEP/CORP, Cache-Control, cookie va SRI — qolgan muhim himoya header'lari. Cross-origin izolyatsiya header'lari — brauzer oynasi va resurslarini boshqa origin'lardan ajratadi (Spectre kabi yon-kanal hujumlariga qarshi): Cross-Origin-Opener-Policy: same-origin (COOP — sizning oynangizni boshqa origin ochgan oynadan uzadi), Cross-Origin-Embedder-Policy: require-corp (COEP — faqat ruxsat bergan cross-origin resurslarni yuklaydi), Cross-Origin-Resource-Policy: same-origin (CORP — resursingizni boshqa saytlar o'rnatib olishidan himoya qiladi). Cache-Control (maxfiy sahifa) — bank balansi, profil, hisob sahifalari brauzer yoki proxy keshida qolib, boshqa foydalanuvchiga ko'rinmasligi uchun: Cache-Control: no-store, no-cache, must-revalidate (keshlamaslik). Cookie xavfsizligi (Set-Cookie — 14.4 CSRF va 14.6 sessiya cross-ref): HttpOnly (JavaScript cookie'ni o'qiy olmaydi — XSS token'ni o'g'irlay olmaydi), Secure (cookie faqat HTTPS orqali yuboriladi — shifrsiz tarmoqda oshkor bo'lmaydi), SameSite=Strict/Lax (cookie cross-site so'rovda yuborilmaydi — CSRF himoyasi). SRI (Subresource Integrity) — tashqi CDN'dan yuklangan skript/stil o'zgartirilmaganini kafolatlaydi: <script src="..." integrity="sha384-..." crossorigin="anonymous"> — brauzer yuklangan fayl hash'ini integrity qiymati bilan solishtiradi; agar CDN buzilgan yoki fayl o'zgargan bo'lsa (hash mos kelmasa), brauzer faylni ishlatmaydi. Ikki nuqta: (1) COOP/COEP/CORP — cross-origin izolyatsiya, Cache-Control — maxfiy sahifani keshdan saqlash; (2) cookie uchun HttpOnly+Secure+SameSite, tashqi resurs uchun SRI hash tekshiruvi. Bu header'lar ilg'or, lekin production ilova (ayniqsa moliyaviy/shaxsiy ma'lumot bilan) uchun defense in depth'ni to'ldiradi.


3. Sintaksis — tez ma'lumotnoma

text
HTTPS 2.1-bob:       TLS sertifikat (Let's Encrypt bepul / Vercel avtomatik)
HSTS 2.2-bob:        Strict-Transport-Security: max-age=31536000; includeSubDomains
CORS 2.3-bob:        Access-Control-Allow-Origin: https://app.com (aniq, * emas)
CSP 2.4-bob:         Content-Security-Policy: default-src 'self'; script-src 'self'
X-FRAME 2.5-bob:     X-Frame-Options: DENY | CSP frame-ancestors 'none'
NOSNIFF 2.4-bob:     X-Content-Type-Options: nosniff
HELMET 2.6-bob:      app.use(helmet())  (Express — barcha header)
A05 2.6-bob:         default o'zgartir + keraksiz o'chir + umumiy xato + yangilash
TLS 2.7-bob:         TLS 1.3 afzal; SSL/TLS 1.0/1.1 o'chir; zanjir  ildiz CA
MIXED 2.8-bob:       Content-Security-Policy: upgrade-insecure-requests
PREFLIGHT 2.9-bob:   OPTIONS + Allow-Methods/Headers/Max-Age (PUT/DELETE/JSON)
CREDENTIALS 2.9-bob: Allow-Credentials: true + ANIQ origin (* mumkin emas)
COOP/COEP 2.11-bob:  Cross-Origin-Opener/Embedder/Resource-Policy
COOKIE 2.11-bob:     Set-Cookie: ...; HttpOnly; Secure; SameSite=Strict
SRI 2.11-bob:        <script integrity="sha384-..." crossorigin="anonymous">
CACHE 2.11-bob:      Cache-Control: no-store (maxfiy sahifa)

4. Batafsil misollar

Har misol: Maqsad + izohli kod + "Bu nima qiladi".

Misol 1 — Helmet (Express xavfsizlik header'lari — 2.6)

Maqsad: Express ilovaga barcha xavfsizlik header'larini bir kutubxona bilan qo'shish. Bu eng oson, eng samarali sozlash himoyasi.

tsx
import express from "express";
import helmet from "helmet";

const app = express();

//  Barcha xavfsizlik header'lari (bir qator):
app.use(helmet());
//  qo'shadi: Content-Security-Policy, Strict-Transport-Security,
//   X-Frame-Options, X-Content-Type-Options, X-DNS-Prefetch-Control, ...

// Maxsus sozlash kerak bo'lsa (CSP moslash):
app.use(
  helmet({
    contentSecurityPolicy: {
      directives: {
        defaultSrc: ["'self'"],
        scriptSrc: ["'self'", "https://trusted-cdn.com"],   // ishonchli CDN
        imgSrc: ["'self'", "data:", "https:"],
        // inline script (XSS xavf) — taqiqlangan (default)
      },
    },
    hsts: { maxAge: 31536000, includeSubDomains: true, preload: true },
  })
);

Bu nima qiladi: Bu — helmet bilan xavfsizlik header'lari (eng oson sozlash himoyasi — 2.6). app.use(helmet())bir qator bilan barcha asosiy xavfsizlik header'larini qo'shadi: Content-Security-Policy (XSS — 14.2), Strict-Transport-Security (HSTS — HTTPS — 2.2), X-Frame-Options (clickjacking — 2.5), X-Content-Type-Options (MIME — 2.4), va boshqalar — har biri sukut bo'yicha xavfsiz qiymat bilan. Bu juda samarali (bir kutubxona — o'nlab himoya). Maxsus sozlash (CSP moslash): ko'pincha CSP'ni ilovaga moslash kerak (masalan ishonchli CDN'dan script, rasm manbalari) — contentSecurityPolicy.directives bilan: scriptSrc: ["'self'", "https://trusted-cdn.com"] (o'z domen + ishonchli CDN — boshqa script bloklanadi), imgSrc (rasm manbalari), va inline script default taqiqlangan (XSS xavf — agar kerak bo'lsa, nonce/hash bilan — lekin inline'dan qochish yaxshiroq). hsts — HTTPS majburiy (1 yil, subdomenlar, preload — 2.2). Nega helmet: qo'lda har header'ni yozish (CSP, HSTS, X-Frame... — har biri to'g'ri format, qiymat) zerikarli va xatoga moyil; helmet ularning hammasini to'g'ri, sukut bo'yicha xavfsiz qiladi (sinalgan default'lar). CSP — eng murakkab (har ilova uchun moslanadi — qaysi manbalar ruxsat) — qolgani odatda default yetadi. Helmet — Express ilovaning standart xavfsizlik qadami (har Express ilova helmet() bilan boshlanishi kerak). Next.js'da o'xshash (middleware/config — Misol 2). Bu — A05 (misconfiguration)'ni oldini olishning eng oson usuli (header'lar — bir kutubxona). Defense in depth (kod himoyasi + header'lar — 2.4).

Misol 2 — Next.js xavfsizlik header'lari (2.4, 13.6)

Maqsad: Next.js'da xavfsizlik header'larini middleware/config bilan qo'shish. Bu Next.js ilovasining tashqi himoya qatlami.

tsx
// next.config.js — barcha sahifaga header (13.10: Misol 2):
const securityHeaders = [
  { key: "Strict-Transport-Security", value: "max-age=31536000; includeSubDomains; preload" },
  { key: "X-Frame-Options", value: "DENY" },                      // clickjacking (2.5)
  { key: "X-Content-Type-Options", value: "nosniff" },            // MIME (2.4)
  { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
  { key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=()" },
  {
    key: "Content-Security-Policy",
    value: "default-src 'self'; script-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'",
  },
];

module.exports = {
  async headers() {
    return [{ source: "/:path*", headers: securityHeaders }];   // barcha yo'lga
  },
};

Bu nima qiladi: Bu — Next.js xavfsizlik header'lari (tashqi himoya qatlami — 2.4, 13.6, 13.10: Misol 2). next.config.jsning headers() funksiyasi orqali barcha sahifaga (source: "/:path*") xavfsizlik header'lari qo'shiladi: (1) HSTS (Strict-Transport-Security — doimo HTTPS — 2.2); (2) X-Frame-Options: DENY (clickjacking — iframe taqiq — 2.5); (3) X-Content-Type-Options: nosniff (MIME sniffing — 2.4); (4) Referrer-Policy (referrer maxfiyligi); (5) Permissions-Policy (kamera, mikrofon, geolokatsiya o'chiq — ilova ishlatmasa — 2.4); (6) CSP (default-src 'self'; script-src 'self'... — XSS himoya — 14.2: 2.6 — faqat o'z manbalardan, style-src 'unsafe-inline' — Tailwind/inline stil uchun — ehtiyot, lekin stil XSS kam). Bu header'lar har javobga qo'shiladi (butun sayt himoyalangan — markaziy). Helmet (Express — Misol 1) o'rniga Next.js'da: next.config headers() (statik header'lar — barcha sahifa) yoki middleware (13.6: Misol 7 — dinamik, shartli header'lar). next.config oddiy holatlar uchun (barcha sahifa bir xil header), middleware murakkabroq (masalan nonce bilan CSP — dinamik). Nega kerak: Next.js default ba'zi header beradi, lekin to'liq xavfsizlik header'lari (CSP, HSTS, X-Frame) qo'lda qo'shiladi (yoki next-safe kutubxona). Bu A05 (misconfiguration)'ni oldini oladi (header'lar yo'q — keng zaiflik). CSP eng muhim, eng murakkab — har ilovaga moslanadi (qaysi manbalar — script, rasm, stil — ruxsat); juda qattiq CSP ilovani buzadi (script ishlamaydi), juda bo'sh CSP foydasiz — balans kerak ('self' + ishonchli manbalar). Next.js sayt deploy'dan oldin (production checklist — 13.10: 2.10) xavfsizlik header'lari tekshiriladi (securityheaders.com — header'larni baholaydi). Bu — Next.js ilovaning tashqi himoyasi (kod ichidagi XSS escape + tashqi CSP header — defense in depth).

Misol 3 — CORS to'g'ri sozlash (2.3)

Maqsad: API'ga CORS'ni xavfsiz (aniq origin, * emas) sozlash. Bu API'ngizning qaysi saytlarga ochiqligini boshqaradi.

tsx
// EXPRESS — cors kutubxonasi:
import cors from "cors";

//  XAVFLI — har origin + credentials:
// app.use(cors({ origin: "*", credentials: true }));   // har sayt + cookie — xavfli!

//  XAVFSIZ — aniq origin(lar) allowlist:
const allowedOrigins = ["https://app.myshop.uz", "https://admin.myshop.uz"];
app.use(
  cors({
    origin: (origin, callback) => {
      // origin allowlist'dami? (yoki origin yo'q — same-origin/Postman):
      if (!origin || allowedOrigins.includes(origin)) callback(null, true);
      else callback(new Error("CORS: ruxsat etilmagan origin"));
    },
    credentials: true,   // cookie bilan (faqat aniq origin bilan xavfsiz)
    methods: ["GET", "POST", "PUT", "DELETE"],
  })
);

// NEXT.JS Route Handler — qo'lda CORS (13.6: 2.10):
// Response header: "Access-Control-Allow-Origin": allowedOrigin (so'rov origin tekshir)

Bu nima qiladi: Bu — CORS'ni xavfsiz sozlash (API qaysi saytlarga ochiq — 2.3). Xavfli sozlash: cors({ origin: "*", credentials: true }) — har origin'ga (*) ruxsat + credentials (cookie) — bu xavfli (har sayt sizning API'ngizga cookie bilan so'rov yubora oladi — CSRF-kabi xavf) va brauzer ham buni rad qiladi (* + credentials taqiqlangan). Xavfsiz sozlash: aniq origin allowlistallowedOrigins = ["https://app.myshop.uz", "https://admin.myshop.uz"] (faqat sizning frontend domenlaringiz). cors({ origin: callback }) — har so'rovda origin allowlist'dami tekshiriladi: agar allowlist'da (yoki origin yo'q — same-origin so'rov yoki Postman/server-to-server — CORS faqat brauzerga ta'sir qiladi) — ruxsat, aks holda rad ("ruxsat etilmagan origin"). credentials: true (cookie bilan — endi xavfsiz, chunki aniq origin — * emas). methods — ruxsat etilgan HTTP metodlar. Next.js Route Handler'da — qo'lda (13.6: 2.10 — Access-Control-Allow-Origin header'ni so'rov origin'iga qarab o'rnatish). Nega muhim: CORS — boshqa saytlar brauzerda sizning API'ngizni ishlatishini boshqaradi (frontend domeningiz — ruxsat, boshqa saytlar — rad). Noto'g'ri (* + credentials) — har sayt cookie bilan so'rov; to'g'ri (aniq origin) — faqat sizning frontend. Muhim eslatma: CORS — autentifikatsiya emas (CORS faqat brauzer JavaScript'iga ta'sir qiladi — Postman, server-to-server, mobil app CORS'ni e'tiborsiz qoldiradi) — API'ngizni himoyalamaydi (auth himoyalaydi — 13.9), balki boshqa saytlarning brauzerda foydalanish boshqaradi. To'g'ri CORS (aniq origin) — A05'ning qismi (noto'g'ri CORS — keng misconfiguration). Public API (ob-havo — auth yo'q, ochiq) uchun * OK (credentials'siz); xususiy API uchun aniq origin.

Misol 4 — CSP nonce (inline script xavfsiz — 2.4)

Maqsad: CSP bilan inline script'ni xavfsiz qilish — nonce orqali. Bu qattiq CSP'da zarur inline script uchun.

tsx
// MUAMMO: CSP 'self' inline script'ni bloklaydi (XSS himoya — yaxshi),
// lekin ba'zan inline script kerak (analytics, dastlabki sozlama)

// YECHIM — nonce (har so'rovda noyob tasodifiy belgi):
import crypto from "crypto";

// middleware.ts (Next.js):
export function middleware() {
  const nonce = crypto.randomBytes(16).toString("base64");   // har so'rovda noyob

  const csp = `script-src 'self' 'nonce-${nonce}'; default-src 'self'`;
  //  faqat shu nonce'li inline script ishlaydi (hujumchi nonce'ni bilmaydi)

  const response = NextResponse.next();
  response.headers.set("Content-Security-Policy", csp);
  response.headers.set("x-nonce", nonce);   // sahifaga uzatish uchun
  return response;
}

// Sahifada — nonce bilan inline script:
// <script nonce={nonce}>...</script>    faqat shu script ishlaydi (nonce mos)
//  XSS skript (nonce'siz) — bloklanadi

Bu nima qiladi: Bu — CSP nonce (inline script'ni xavfsiz qilish — 2.4). Muammo: qattiq CSP (script-src 'self') inline script'ni (<script>...</script> — sahifa ichida) bloklaydi — bu yaxshi (XSS himoya — hujumchi inline <script> kiritsa — bloklanadi — 14.2: 2.6), lekin ba'zan zarur inline script bor (analytics, dastlabki tema sozlamasi, kritik kod). Hammaga 'unsafe-inline' berish — CSP'ni buzadi (har inline script ruxsat — XSS himoyasi yo'qoladi). Yechim — nonce (number used once — bir martalik tasodifiy belgi): (1) har so'rovda noyob nonce generatsiya (crypto.randomBytes — taxmin qilib bo'lmaydi); (2) CSP'da script-src 'self' 'nonce-${nonce}' (faqat shu nonce'li inline script ruxsat); (3) sahifadagi zarur inline script'ga <script nonce={nonce}> (mos nonce). Natija: sizning inline script'ingiz (to'g'ri nonce bilan) ishlaydi, lekin XSS skript (hujumchi kiritgan — nonce'siz, chunki hujumchi har so'rovdagi noyob nonce'ni bilmaydi) — bloklanadi. Demak nonce — "faqat ruxsat berilgan inline script ishlaydi" (har so'rovda yangi parol kabi). Bu qattiq CSP (XSS himoya) + zarur inline script (nonce bilan) balansi — 'unsafe-inline' (xavfli — hammaga ruxsat) o'rniga nonce (faqat ruxsat berilganga). Next.js'da middleware bilan (har so'rov — yangi nonce, CSP header, sahifaga uzatish). Bu ilg'or CSP texnikasi (zamonaviy, xavfsiz inline script). Ko'p ilova 'unsafe-inline' ishlatadi (oson, lekin CSP'ni zaiflashtiradi) — nonce afzal (qattiq CSP saqlanadi). CSP — eng kuchli XSS himoyasi, lekin to'g'ri sozlash (nonce/hash — inline uchun) talab qiladi. Bu — defense in depth'ning (kod escape + CSP) eng kuchli shakli.

Misol 5 — Xavfsiz sozlash auditi (A05 — 2.6)

Maqsad: Ilovani A05 (Security Misconfiguration) bo'yicha tekshirish — default, keraksiz, xato, header. Bu sozlash xavfsizliginin audit ro'yxati.

text
A05 — SECURITY MISCONFIGURATION AUDITI:

XAVFSIZLIK HEADER'LARI:
  [ ] HTTPS + HSTS 2.2-bob
  [ ] CSP (XSS — 2.4)
  [ ] X-Frame-Options DENY (clickjacking — 2.5)
  [ ] X-Content-Type-Options nosniff
  [ ] securityheaders.com'da A/A+ baho

DEFAULT/KERAKSIZ:
  [ ] Default parol o'zgartirilgan (admin/admin yo'q)
  [ ] Keraksiz endpoint/xizmat o'chirilgan (debug, test)
  [ ] Direktoriya ro'yxati o'chiq emas

XATO BOSHQARUV:
  [ ] Stack trace foydalanuvchiga EMAS (production umumiy xato)
  [ ] DB/server xatosi yashirin (faqat log'da)

CORS:
  [ ] Aniq origin (* emas, credentials bilan — 2.3)

YANGILASH (A06):
  [ ] npm audit toza (eski/zaif paket yo'q — 14.9)
  [ ] Framework/kutubxona yangi versiya

ENV/SECRET 14.6-bob:
  [ ] Secret env'da (kodda/git'da yo'q)
  [ ] NEXT_PUBLIC_ faqat public

Bu nima qiladi: Bu — A05 (Security Misconfiguration) auditi (sozlash xavfsizligi tekshiruvi — 2.6). A05 — eng keng zaifliklardan (sozlash xatolari — default, header yo'q, ortiqcha ruxsat), va u tizimli tekshiriladi (bu ro'yxat). Beshta soha: (1) xavfsizlik header'lari — HTTPS+HSTS, CSP, X-Frame, nosniff bormi (2.2, 2.4, 2.5), va securityheaders.comda saytni tekshirish (header'larni A/F baholaydi — A+ maqsad — bepul vosita); (2) default/keraksiz — default parol o'zgartirilganmi (admin/admin yo'q), keraksiz endpoint/xizmat o'chirilganmi (debug, test endpoint — hujum yuzasi — 14.1: 2.5), direktoriya ro'yxati ochiq emasmi; (3) xato boshqaruv — stack trace/DB xatosi foydalanuvchiga emas (production umumiy xato — ichki ma'lumot sizmasin — 14.1); (4) CORS — aniq origin (* + credentials emas — 2.3); (5) yangilash (A06) — npm audit toza, framework/kutubxona yangi 14.9-bob; (6) env/secret 14.6-bob — secret env'da (kodda/git'da yo'q), NEXT_PUBLIC_ faqat public. Bu — amaliy audit ro'yxati (har production deploy'dan oldin — 13.10: 2.10 production checklist'ning xavfsizlik qismi). Har band — potensial misconfiguration (agar "yo'q" bo'lsa — tuzatish). securityheaders.com va Mozilla Observatory — bepul vositalar (saytni tekshirib, header'lar/sozlamalarni baholaydi — aniq tavsiyalar). A05 keng (ko'pincha e'tibordan chetda — kod ishlaydi, lekin sozlash zaif) — shuning uchun tizimli audit (bu ro'yxat) muhim. Bu 14.1: Misol 5 (umumiy OWASP audit)ning A05'ga xos, batafsil versiyasi. Xavfsiz sozlash — kod xavfsizligi (XSS, injection) kabi muhim (zaif sozlash — ochiq eshik). Audit — sozlash xavfsizligini o'lchovli qiladi (his emas — aniq tekshiruv, vosita bilan baho).


5. To'g'ri va noto'g'ri holatlar

1) Transport

text
 HTTP (parol ochiq — MITM — 2.1)
 HTTPS + HSTS (shifrlangan — 2.2)

2) CORS

text
 origin: "*" + credentials (xavfli — 2.3)
 aniq origin allowlist (Misol 3)

3) Header'lar

text
 xavfsizlik header yo'q (A05 — 2.4)
 helmet / CSP+HSTS+X-Frame (Misol 1, 2)

4) iframe

text
 X-Frame yo'q (clickjacking — 2.5)
 X-Frame: DENY (Misol 2)

5) Xato xabari

text
 stack trace foydalanuvchiga (ma'lumot sizadi)
 umumiy xato (production — 2.6)

6) Inline script + CSP

text
 'unsafe-inline' (CSP zaiflashadi)
 nonce (faqat ruxsat berilgan — Misol 4)

6. Keng tarqalgan xatolar va yechimlari

Xato 1 — HTTP (HTTPS yo'q)

Sababi: sertifikat yo'q 2.1-bob. Yechimi: Let's Encrypt / Vercel avtomatik + HSTS 2.2-bob.

Xato 2 — CORS * + credentials

Sababi: har origin 2.3-bob. Yechimi: aniq origin allowlist (Misol 3).

Xato 3 — Xavfsizlik header yo'q

Sababi: A05 2.4-bob. Yechimi: helmet / config header (Misol 1, 2).

Xato 4 — Clickjacking (iframe)

Sababi: X-Frame yo'q 2.5-bob. Yechimi: X-Frame: DENY (Misol 2).

Xato 5 — CSP juda qattiq (ilova buzildi)

Sababi: zarur manba bloklangan. Yechimi: ishonchli manba qo'sh / nonce (Misol 4).

Xato 6 — Stack trace production'da

Sababi: xato tafsiloti foydalanuvchiga. Yechimi: umumiy xato + log 2.6-bob.


7. Integratsiya — bu mavzu stack'ning qayerida uchraydi

  • Deploy 13.10-bob: HTTPS, domen, env (transport, sozlash).
  • Middleware 13.6-bob: xavfsizlik header'lari (CSP, X-Frame).
  • XSS 14.2-bob: CSP (XSS himoya qatlami).
  • CSRF 14.4-bob: CORS, SameSite (cross-origin).
  • OWASP 14.1-bob: A05 (misconfiguration), A02 (crypto — HTTPS).
  • Backend 5.20-bob: helmet, CORS (Express/NestJS enableCors).
  • DevOps (10.7, 10.8): Nginx, SSL/TLS (HTTPS, sertifikat sozlash).
  • Sessiya/cookie (14.4, 14.6): Set-Cookie HttpOnly/Secure/SameSite 2.11-bob.

8. Eng yaxshi amaliyotlar (best practices)

  • HTTPS + HSTS (majburiy — MITM — 2.1, 2.2).
  • CORS aniq origin (* + credentials emas — Misol 3).
  • Helmet / xavfsizlik header'lari (CSP, X-Frame, nosniff — Misol 1, 2).
  • X-Frame: DENY (clickjacking — 2.5).
  • CSP nonce (inline script — 'unsafe-inline' emas — Misol 4).
  • Umumiy xato (stack trace yashir — 2.6).
  • Default o'zgartir + keraksiz o'chir (A05 — Misol 5).
  • securityheaders.com tekshir (A/A+ baho — Misol 5).
  • Yangilab tur (npm audit — A06 — 14.9).
  • A05 audit (sozlash tekshiruvi — Misol 5).
  • TLS 1.3 (eski SSL/TLS 1.0/1.1 o'chir — 2.7).
  • Mixed content yo'q (barcha resurs HTTPS — 2.8).
  • Cookie: HttpOnly + Secure + SameSite 2.11-bob.
  • SRI (tashqi CDN skript hash tekshiruvi — 2.11).
  • CORS: allowlist tenglik (origin reflection/regex xato emas — 2.9).

9. Amaliy loyiha: "Xavfsiz Transport va Sozlash"

HTTPS, CORS, header'lar va xavfsiz sozlashni mustahkamlash.

Maqsad

Ilovani transport/sozlash darajasida himoyalang: HTTPS, CORS, xavfsizlik header'lari, A05 audit.

Talablar (requirements)

  1. HTTPS + HSTS: shifrlangan + doimo HTTPS 2.2-bob.
  2. Xavfsizlik header'lari: helmet yoki config (CSP, X-Frame, nosniff — Misol 1, 2).
  3. CORS: aniq origin allowlist (Misol 3).
  4. CSP: to'g'ri sozlangan (nonce zarur bo'lsa — Misol 4).
  5. Clickjacking: X-Frame: DENY 2.5-bob.
  6. Xato: umumiy (stack trace yashir — 2.6).
  7. A05 audit: default, keraksiz, header tekshir (Misol 5).
  8. securityheaders.com: A/A+ baho.
  9. Test: HTTP, CORS, iframe sinab ko'r.
  10. npm audit: zaif paket yo'q (A06).

Maslahatlar (hint)

  • HTTPS + HSTS (Xato 1).
  • CORS aniq origin (Xato 2).
  • Helmet (Xato 3).
  • X-Frame (Xato 4).
  • CSP balans (Xato 5).

"Tayyor" mezonlari (acceptance criteria)

  • HTTPS + HSTS.
  • Xavfsizlik header'lari (CSP, X-Frame, nosniff).
  • CORS aniq origin.
  • securityheaders.com A/A+.
  • Clickjacking himoya.
  • A05 audit o'tdi.

Yechim kodi ataylab berilmagan — bu loyihani o'zingiz yozib ko'ring.


10. Xulosa va keyingi bobga ko'prik

Bu bobda HTTPS, CORS va xavfsizlik header'larini chuqur o'rgandik:

Endi siz ilovaning tashqi himoyasini qura olasiz: HTTPS (shifrlangan), CORS (aniq origin), xavfsizlik header'lari (CSP, X-Frame, HSTS), va xavfsiz sozlash (A05). Bu — kod himoyasiga qo'shimcha defense in depth qatlami.

Keyingi bob — 14.8-bob: Rate limiting va DoS himoyasi. Sozlashni bildik; endi so'rov hajmi himoyasini ko'ramiz: rate limiting (so'rovni cheklash — brute force, abuse, API suiiste'mol), algoritmlar (token bucket, sliding window), DoS/DDoS himoyasi, va amaliy sozlash (Redis, Upstash, edge). Bu — ilovani ortiqcha yuk va suiiste'moldan himoya.


Foydalanilgan rasmiy/ishonchli manbalar

  • OWASP Cheat Sheet Series — "Transport Layer Security", "HTTP Security Response Headers", "Clickjacking Defense", "Content Security Policy", "Cross-Origin Resource Sharing (CORS)", "Session Management" (cookie bayroqlari)
  • OWASP Top 10 — A02:2021 (Cryptographic Failures), A05:2021 (Security Misconfiguration)
  • MDN Web Docs — HTTPS, CORS, Same-Origin Policy, Content-Security-Policy, Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, Cross-Origin-Opener/Embedder/Resource-Policy, Set-Cookie (HttpOnly/Secure/SameSite), Subresource Integrity, Mixed content
  • RFC standartlari — RFC 8446 (TLS 1.3), RFC 6797 (HSTS), RFC 6265 (Cookie), Fetch Standard (CORS/preflight — WHATWG)
  • Helmet.js — Express xavfsizlik header'lari kutubxonasi (rasmiy hujjat)
  • Let's Encrypt — bepul, avtomatik TLS sertifikatlari (ISRG)
  • Sayt baholash vositalari — securityheaders.com, Mozilla Observatory, SSL Labs (Qualys) — TLS/header sozlamalarini tekshirish va baholash

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
14.7-bob: HTTPS, CORS va xavfsizlik header'lari — Wisar