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)
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 haqiqatanbank.comekanini 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)
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.comkeyin 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)
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 afzalCORS (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!) — ayniqsaAccess-Control-Allow-Credentials: truebilan 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, ...)
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
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) yokiSAMEORIGIN(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: DENYyoki CSPframe-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(yokiSAMEORIGINagar 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)
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 + yangilashHelmet 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) yokinext.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
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 taqaladiTLS 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)
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 beradiMixed content (aralash kontent) — HTTPS sahifa ichida HTTP orqali yuklangan resurs. Sahifaning o'zi
https://bo'lsa-da, uning ichidagi rasm, skript, stil yokifetchso'rovihttp://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 resurslarnihttps://orqali yuklash (yoki protokolsiz//host/...— sahifa protokolini meros qiladi); qo'shimcha himoya — CSP direktivasiupgrade-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-requestsesa qoldiq havolalarni himoyalashi kerak. Bu ko'pincha eski/qattiq kodlanganhttp://havolalardan kelib chiqadi (rasm CDN, tashqi kutubxona) — HTTPS'ga o'tishda alohida tekshiriladi.
2.9. CORS chuqurroq — simple vs preflight, credentials, keng xatolar
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 — xatoCORS 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, vaContent-Typefaqattext/plain,application/x-www-form-urlencodedyokimultipart/form-databo'lsa. Preflight (oldindan so'rash) — boshqa hollarda (masalanPUT/DELETE/PATCH, yokiAuthorizationheader, yokiContent-Type: application/json) brauzer avvalOPTIONSso'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), vaAccess-Control-Max-Agebilan preflight javobini keshlash muddatini beradi (masalan86400— 1 kun — brauzer har so'rovda qayta preflight qilmaydi); ruxsat bo'lsa brauzer asosiy so'rovni yuboradi. Credentials (cookie yokiAuthorizationbilan cross-origin so'rov): serverAccess-Control-Allow-Credentials: trueqaytarishi vaAccess-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 kelganOriginsarlavhasini ko'r-ko'ronaAccess-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 ruxsat —Origin: 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 nuqtaapp.com)evil-app.comyokiapp.com.hacker.comga ham mos kelib qoladi. Ikki nuqta: (1) simple so'rov to'g'ridan yuboriladi, preflight (OPTIONS) esaPUT/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/ExpressenableCors/cors()sozlamasi orqali (5.20 cross-ref).
2.10. CORS xatolarini debugging qilish
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 sabablarCORS 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
200bilan), 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 preflightOPTIONSso'rovini topib, uning javob header'larini ko'rish; (3)Access-Control-Allow-Originserver javobida bor-yo'qligini va so'rovOriginiga mosligini tekshirish; (4) preflightOPTIONS200/204qaytaryaptimi yoki404(route mavjud emas — serverOPTIONSni ishlamayapti); (5) credentials ishlatilsa —Access-Control-Allow-Credentials: trueva aniq origin borligini tekshirish. Ikki nuqta: (1) CORS xatosi — brauzer bloki (server emas), shuning uchun Network panelidagiOPTIONSjavobini tekshirish kerak; (2) keng sabablar —*+ credentials, preflight404, mos kelmagan yoki yo'qAllow-Origin. Odatiy tuzatish — server CORS sozlamasida so'rov origin'ini allowlist'ga qo'shish va preflight'ni to'g'ri ishlatish (Expresscors()/ NestJSenableCorsavtomatikOPTIONSni boshqaradi — 5.20, Misol 3).
2.11. COOP/COEP/CORP, Cache-Control, cookie va SRI
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 tekshiruviCOOP/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'iniintegrityqiymati 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 uchunHttpOnly+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
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.
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.
// 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.
// 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 allowlist — allowedOrigins = ["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.
// 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) — bloklanadiBu 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.
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 publicBu 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
HTTP (parol ochiq — MITM — 2.1)
HTTPS + HSTS (shifrlangan — 2.2)2) CORS
origin: "*" + credentials (xavfli — 2.3)
aniq origin allowlist (Misol 3)3) Header'lar
xavfsizlik header yo'q (A05 — 2.4)
helmet / CSP+HSTS+X-Frame (Misol 1, 2)4) iframe
X-Frame yo'q (clickjacking — 2.5)
X-Frame: DENY (Misol 2)5) Xato xabari
stack trace foydalanuvchiga (ma'lumot sizadi)
umumiy xato (production — 2.6)6) Inline script + CSP
'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)
- HTTPS + HSTS: shifrlangan + doimo HTTPS 2.2-bob.
- Xavfsizlik header'lari: helmet yoki config (CSP, X-Frame, nosniff — Misol 1, 2).
- CORS: aniq origin allowlist (Misol 3).
- CSP: to'g'ri sozlangan (nonce zarur bo'lsa — Misol 4).
- Clickjacking: X-Frame: DENY 2.5-bob.
- Xato: umumiy (stack trace yashir — 2.6).
- A05 audit: default, keraksiz, header tekshir (Misol 5).
- securityheaders.com: A/A+ baho.
- Test: HTTP, CORS, iframe sinab ko'r.
- 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:
- HTTPS/TLS 2.1-bob; HSTS/sertifikat 2.2-bob; CORS 2.3-bob; xavfsizlik header'lari 2.4-bob; clickjacking 2.5-bob; helmet/A05 sozlash 2.6-bob; TLS handshake/versiyalar 2.7-bob; mixed content 2.8-bob; CORS chuqur — preflight/credentials/xatolar 2.9-bob; CORS debugging 2.10-bob; COOP/COEP/CORP, Cache-Control, cookie, SRI 2.11-bob.
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!