Azimjon Abdurasulov

QA 24: Security testing asoslari — OWASP Top 10:2025, IDOR, injection va QA xavfsizlik checklisti

🧪 QA Engineer — Zero to Hero

QA 24: Security testing asoslari — OWASP Top 10:2025, IDOR, injection va QA xavfsizlik checklisti

Holat: 2026-yil oktabr. Dars OWASP Top 10:2025 (2025-yil noyabrda chiqqan, 2021-yildan keyingi birinchi yangilanish), OWASP API Security Top 10 2023, OWASP MASVS v2.1.0 va CVSS v4.0 asosida yozilgan. Yondashuv himoyaviy: QA o'z mahsulotining test muhitida himoya mexanizmlari ishlayotganini tekshiradi va avtomatlashtiradi.

Bu darsdan keyin siz: xavfsizlikni "pentester'lar ishi" deb chetga surmay, har sprintda o'z mahsulotingizdagi asosiy xavflarni tekshira olasiz:

  • QA, pentester va security engineer o'rtasidagi chegarani va qonuniy qoidalarni bilasiz;
  • OWASP Top 10:2025 va API Top 10 bo'yicha qaysi talablarni tekshirishni bilasiz;
  • access control (IDOR/BOLA), autentifikatsiya, kiritilgan ma'lumotlar va header'lar uchun avtomatik testlar yozasiz;
  • topilmani CVSS v4.0 bilan baholab, maxfiy va to'g'ri formatda xabar qilasiz.

Mundarija

  1. Qonuniy va axloqiy chegaralar
  2. Asosiy tushunchalar: CIA, authN va authZ, sessiyalar
  3. OWASP Top 10:2025 — QA ko'zi bilan
  4. Access control: IDOR/BOLA va rollar
  5. Autentifikatsiya va sessiyalar
  6. Kiritilgan ma'lumotlar: injection va XSS'dan himoyani tekshirish
  7. Konfiguratsiya: header'lar, xato xabarlari, CORS
  8. Maxfiy ma'lumotlar va biznes mantiq
  9. API va mobil xavfsizlik: OWASP API Top 10, MASVS
  10. Vositalar: SAST, DAST, SCA va ZAP
  11. Xavfsizlik regression testlari (Playwright)
  12. Topilmani baholash va xabar qilish: CVSS v4.0
  13. QA xavfsizlik checklisti
  14. Amaliy mashqlar
  15. Xulosa
  16. Manbalar

1. Qonuniy va axloqiy chegaralar {#qoidalar}

Bu darsdagi har bir tekshiruv faqat quyidagi sharoitda bajariladi:

  1. Tizim sizning kompaniyangizga tegishli va sizga yozma ruxsat (scope) berilgan.
  2. Test test/staging muhitida, test akkauntlari va test ma'lumotlari bilan o'tkaziladi.
  3. Real foydalanuvchilar ma'lumotlariga tegilmaydi; tasodifan zaiflik ko'rsangiz — to'xtaysiz va maxfiy xabar qilasiz.
  4. Begona saytlar, raqobatchilar, davlat tizimlari — hech qachon "sinab ko'rish" obyekti emas.

⚠️ Diqqat: Ko'p davlatlarda ruxsatsiz kirish jinoyat hisoblanadi. O'zbekiston Jinoyat kodeksida axborot texnologiyalari sohasidagi jinoyatlarga bag'ishlangan XX¹ bob bor (masalan, 278²-modda — kompyuter axborotidan qonunga xilof foydalanish). Amaldagi matnni lex.uz dan o'qing. "Men faqat tekshirib ko'rdim" degan bahona qonun oldida himoya emas.

Kim nima qiladi?

RolAsosiy vazifaQachon
QA engineerXavfsizlik talablari bajarilganini tekshiradi, regression testlar yozadi, "abuse case"larni o'ylaydiHar sprintda
Security engineerArxitektura, threat modeling, SAST/DAST sozlash, jamoaga maslahatDoimiy
PentesterKelishilgan scope ichida chuqur, qo'lda hujum simulyatsiyasiYirik relizlardan oldin, yiliga 1–2 marta

QA'ning kuchi — funksionallikni yaxshi bilishi: "promo-kodni ikki marta ishlatsa nima bo'ladi?", "xaridor admin sahifasining manzilini bilsa-chi?" kabi savollarni aynan QA birinchi bo'lib beradi.

Qonuniy mashq maydonlari

Ko'nikmani faqat shu uchun maxsus yaratilgan o'quv muhitlarida oshiring:

  • OWASP Juice Shop — ataylab zaif qilib yozilgan o'quv do'koni, o'z kompyuteringizda ishlaydi: docker run --rm -p 127.0.0.1:3000:3000 bkimminich/juice-shop;
  • PortSwigger Web Security Academy — bepul onlayn laboratoriyalar va nazariya;
  • DVWA — lokal o'quv ilovasi.

2. Asosiy tushunchalar: CIA, authN va authZ, sessiyalar {#asoslar}

CIA triadasi

TamoyilMa'nosiDemoBozor'da buzilishi
Confidentiality (maxfiylik)Ma'lumotni faqat ruxsati borlar ko'radiXaridor boshqa odamning manzili va telefonini ko'radi
Integrity (yaxlitlik)Ma'lumotni faqat ruxsati borlar o'zgartiradiMijoz buyurtma narxini o'zi o'zgartira oladi
Availability (mavjudlik)Tizim kerak paytda ishlaydiAksiya kuni login xizmati to'xtab qoladi

Authentication vs Authorization

  • Authentication (authN) — "Sen kimsan?" (login, SMS kod, token). Muvaffaqiyatsiz bo'lsa → 401 Unauthorized.
  • Authorization (authZ) — "Senga bu ruxsat etilganmi?" (rol, egalik). Ruxsat bo'lmasa → 403 Forbidden (yoki mavjudlikni yashirish uchun 404).

Batafsil status kodlari: QA 10, QA 11.

Sessiya va tokenlar

  • Cookie-sessiya: server sessiya ID'sini cookie'da beradi. Cookie atributlari: HttpOnly (JavaScript o'qiy olmaydi), Secure (faqat HTTPS), SameSite (QA 9).
  • Bearer token (ko'pincha JWT): har so'rovda Authorization: Bearer ... header'ida yuboriladi. Muddati (expiry) qisqa bo'lishi, logout'da bekor qilinishi kerak.
  • OWASP HTML5 Security Cheat Sheet tavsiyasi: sessiya identifikatorlarini localStorage da saqlamang — u yerdagi ma'lumotni sahifadagi istalgan JavaScript o'qiy oladi; HttpOnly cookie bu xavfni kamaytiradi.

3. OWASP Top 10:2025 — QA ko'zi bilan {#owasp-top10}

OWASP Top 10 — veb-ilovalardagi eng jiddiy xavf toifalari ro'yxati. 2025-yil versiyasida SSRF alohida toifa emas, A01 ichiga kirdi; ikkita yangi nom paydo bo'ldi — A03 (supply chain) va A10 (istisno holatlar).

#ToifaQA nimani tekshiradiDemoBozor misoli
A01Broken Access ControlGorizontal (boshqa foydalanuvchi) va vertikal (yuqori rol) ruxsatlar; to'g'ridan-to'g'ri URL/API orqali kirishXaridor /admin sahifasini yoki boshqa xaridorning buyurtmasini ochadi
A02Security MisconfigurationXavfsizlik header'lari, xato xabarlarida stack trace, ochiq debug/Swagger, standart parollar500 javobida SQL so'rov va fayl yo'li ko'rinadi
A03Software Supply Chain FailuresKutubxonalardagi ma'lum zaifliklar, lockfile, CI'dagi skanerlar hisobotiMa'lum CVE'li eski kutubxona prod'da ishlayapti
A04Cryptographic FailuresHamma joyda HTTPS va HSTS, maxfiy ma'lumot ochiq matnda saqlanmaydiKarta raqami loglarda to'liq yozilgan
A05InjectionMaxsus belgilar tizimni buzmaydi; foydalanuvchi matni kod sifatida bajarilmaydiIsmdagi apostrof (O'g'iloy) 500 xato beradi
A06Insecure DesignBiznes mantiqdagi teshiklar, "abuse case"larBir promo-kodni ikki marta ishlatish mumkin
A07Authentication FailuresLogin/OTP cheklovlari, parol siyosati, sessiya muddati, logout3 ta xato SMS koddan keyin blok ishlamaydi
A08Software or Data Integrity FailuresTashqi manbadan kelgan ma'lumot va yangilanishlar imzosi tekshiriladimiTo'lov provayderi callback'ining imzosi tekshirilmaydi
A09Security Logging and Alerting FailuresMuhim hodisalar loglanadimi, ogohlantirish bormi, logda parol/token yo'qmi100 ta muvaffaqiyatsiz login — hech kim xabar topmaydi
A10Mishandling of Exceptional ConditionsBog'liq servis ishlamay qolganda tizim xavfsiz holatda qoladimiTo'lov servisi timeout bo'lsa, buyurtma baribir PAID bo'lib qoladi

🎯 Intervyuda: OWASP Top 10 nima va QA uchun nega muhim? — Bu OWASP jamoasining veb-ilovalardagi eng keng tarqalgan va jiddiy xavf toifalari ro'yxati. QA uni test g'oyalari manbai sifatida ishlatadi: har toifa uchun mahsulotdagi tegishli talablar va testlar bormi, tekshiradi. Joriy versiya — 2025.


4. Access control: IDOR/BOLA va rollar {#access-control}

IDOR (Insecure Direct Object Reference) yoki API dunyosidagi nomi BOLA (Broken Object Level Authorization) — server so'ralgan obyekt (buyurtma, manzil, fayl) shu foydalanuvchiga tegishli ekanini tekshirmasligi. OWASP API Security Top 10 2023 da bu birinchi o'rinda (API1:2023).

IDOR/BOLA: begona buyurtmani ochishga urinish va to'g'ri server javobi

Nega bu bug juda ko'p uchraydi?

  • Mobil va SPA ilovalar API'ga ID bilan murojaat qiladi: GET /api/v1/orders/1002.
  • UI'da "begona buyurtma" tugmasi yo'q — dasturchi "baribir hech kim ko'rmaydi" deb o'ylaydi. Lekin tugmaning yashirilgani — himoya emas: API'ni to'g'ridan-to'g'ri chaqirish mumkin.
  • Token tekshiriladi (authN bor), lekin egalik tekshirilmaydi (authZ yo'q).

Test dizayni: ikki akkaunt usuli

ResursAmalA tokeni bilan B resursigaKutilgan natija
BuyurtmaGET /orders/{id}B buyurtmasini o'qish404 yoki 403, begona ma'lumot yo'q
BuyurtmaPOST /orders/{id}/cancelB buyurtmasini bekor qilish404/403, B buyurtmasi o'zgarmagan
ManzilPATCH /addresses/{id}B manzilini o'zgartirish404/403
SharhDELETE /reviews/{id}B sharhini o'chirish404/403
AdminGET /admin/usersXaridor tokeni bilan403
Har qandayTokensiz—401

Qadamlar:

  1. Test muhitida ikkita xaridor (A va B) va bitta admin yarating.
  2. B'ning resurslari ID'larini yozib oling (buyurtma, manzil, sharh).
  3. A tokeni bilan har bir resurs va har bir amal (o'qish, o'zgartirish, o'chirish) uchun so'rov yuboring.
  4. Kutilgan javob — 403/404, va B'ning ma'lumoti o'zgarmagani, javobda uning ma'lumotlari yo'qligi.
  5. Bu tekshiruvlarni avtomatlashtiring (11-bo'lim).

🧠 Esda tuting: 403 mi yoki 404 mi? 404 resurs mavjudligini ham yashiradi; 403 ochiqroq. Ikkalasi ham to'g'ri bo'lishi mumkin — muhimi, jamoa siyosati bir xil bo'lsin va hech qachon 200 + begona ma'lumot qaytmasin.

Maydon darajasidagi ruxsat (API3:2023 BOPLA)

Profilni yangilashda foydalanuvchi faqat ruxsat etilgan maydonlarni o'zgartira olishi kerak. Tekshiruv: PATCH /api/v1/profile ga fullName bilan birga role yoki isPremium kabi maydon qo'shib yuborsangiz, server uni e'tiborsiz qoldirishi yoki rad etishi kerak (mass assignment himoyasi). Javobda ham keraksiz maxfiy maydonlar (masalan, ichki izohlar, boshqa foydalanuvchi ID'lari) qaytmasligi kerak.

Mobil ilova API'ga aynan qaysi ID va maydonlarni yuborayotganini ko'rish uchun o'zingizning test build'ingiz trafigini Proxyman bilan kuzating.


5. Autentifikatsiya va sessiyalar {#auth}

DemoBozor qoidasi: SMS kod 6 raqam, 120 soniya amal qiladi, qayta yuborish 60 soniyadan keyin, 3 marta noto'g'ri kiritilsa raqam 15 daqiqaga bloklanadi. Bu qoidaning har bir bo'lagi — alohida test:

TekshiruvKutilgan natija
3 ta noto'g'ri koddan keyin 4-urinish (hatto to'g'ri kod bilan)Blok: 429 + Retry-After: 900
15 daqiqadan keyinYana urinish mumkin
120 soniyadan eski kodRad etiladi
Bir marta ishlatilgan kodQayta ishlamaydi
60 soniyadan oldin qayta yuborishRad etiladi yoki tugma faol emas
Ro'yxatdan o'tmagan raqamXabar ro'yxatdan o'tgan raqamnikidan farq qilmaydi (foydalanuvchilarni "sanab chiqish" mumkin bo'lmasin)

Sessiya va parol bo'yicha checklist

  • Logout dan keyin eski token bilan so'rov → 401 (token server tomonda ham bekor qilingan).
  • Faol bo'lmaganlik muddati (idle timeout) va maksimal sessiya muddati talabda yozilgan va ishlaydi.
  • Parol o'zgartirilganda boshqa qurilmalardagi sessiyalar bekor qilinadimi (talabga qarab)?
  • Parolni tiklash havolasi: bir martalik, qisqa muddatli, ishlatilgandan keyin yaroqsiz.
  • Sotuvchi/admin paneli paroli: 8–64 belgi, kamida 1 harf va 1 raqam; parol hech qachon API javobida yoki logda ko'rinmaydi.
  • Admin akkauntlari uchun ikki bosqichli autentifikatsiya (MFA) bormi?
  • Token URL'da (?token=...) uzatilmaydi — URL'lar loglarda va brauzer tarixida qoladi.

6. Kiritilgan ma'lumotlar: injection va XSS'dan himoyani tekshirish {#input}

Asosiy tamoyil: foydalanuvchi kiritgan matn — har doim ma'lumot, hech qachon kod emas. Dasturchi buni uch qatlamda ta'minlaydi:

  1. Server tomonida validatsiya — uzunlik, tur, format (ism 2–50, sharh 10–1000 belgi).
  2. Parametrlangan so'rovlar — SQL so'rov matni va foydalanuvchi qiymati alohida yuboriladi (QA 12).
  3. Kontekstga mos chiqarish (output encoding) + Content-Security-Policy — matn sahifada matn bo'lib ko'rinadi, HTML/skript sifatida emas.

QA'ning vazifasi — bu himoyalar har bir kiritish nuqtasida ishlayotganini tekshirish va avtomatlashtirish. Hujum payload'larini yod olish shart emas — chuqur tekshiruvni security jamoasi yoki pentester qiladi.

Xavfsiz va foydali tekshiruvlar

TekshiruvQandayKutilgan natija
O'zbekcha apostroflarIsm: O'g'iloy, Oʻtkir Gʻaniyev, kirillcha ҒайратSaqlanadi va aynan shunday ko'rinadi; 500 yo'q
Maxsus belgilarQo'shtirnoq, &, <, >, %, \, emojiSaqlanadi va to'g'ri ko'rinadi
HTML ko'rinishidagi matnSharhga <i>test</i> yozingSahifada aynan <i>test</i> matni ko'rinadi, kursiv emas
Uzunlik chegaralariAPI'ga to'g'ridan-to'g'ri 1 va 51 belgili ism422 va tushunarli xato
Turlarquantity: "abc", quantity: -1400/422, 500 emas
Fayl yuklashRuxsat etilmagan tur, juda katta hajmRad etiladi; fayl nomi o'zgartiriladi

⚠️ Diqqat: Oddiy apostrof (') yoki qo'shtirnoq 500 Internal Server Error ga olib kelsa — bu shunchaki "kichik bug" emas. Bu server SQL so'rovni foydalanuvchi matnidan "yopishtirib" qurayotganining belgisi bo'lishi mumkin. Uni security bug sifatida maxfiy ticket'da xabar qiling; tuzatish — parametrlangan so'rovlar. O'zbek ismlarida apostrof juda ko'p uchraydi, shuning uchun bu tekshiruv DemoBozor uchun ham funksional, ham xavfsizlik testi.

Dasturchilar uchun rasmiy tavsiyalar: OWASP SQL Injection Prevention va Cross Site Scripting Prevention cheat sheet'lari (Manbalar ro'yxatida).


7. Konfiguratsiya: header'lar, xato xabarlari, CORS {#config}

Xavfsizlik header'lari

HeaderVazifasiMisol qiymat
Strict-Transport-SecurityBrauzer saytga faqat HTTPS orqali kiradi (HSTS)max-age=31536000; includeSubDomains
Content-Security-PolicyQaysi manbadan skript/stil/rasm yuklash mumkinligini cheklaydidefault-src 'self'; frame-ancestors 'none'
X-Content-Type-OptionsBrauzer Content-Type'ni "taxmin qilmaydi"nosniff
frame-ancestors (CSP) yoki X-Frame-OptionsSaytni begona sahifa ichiga iframe qilib qo'yishni taqiqlaydiframe-ancestors 'none'
Referrer-PolicyBoshqa saytga o'tganda URL qancha oshkor bo'lishini cheklaydistrict-origin-when-cross-origin

Header'larni tekshirish uchun eng oddiy buyruq (o'z staging muhitingizda):

curl -sI https://staging.demobozor.example/api/v1/health | \
  grep -iE "^(strict-transport-security|content-security-policy|x-content-type-options|referrer-policy|server|x-powered-by):"

Qanday header'lar bo'lmasligi kerak? X-Powered-By: Express yoki Server: Apache/2.4.52 (Ubuntu) kabi texnologiya va versiyani oshkor qiladigan qiymatlar. O'quv saytlarida buni tez-tez ko'rasiz: 2026-yil oktabrda restful-booker javobida x-powered-by: Express, Toolshop API javobida server: Apache/2.4.52 (Ubuntu) bor edi. Bu odatda past jiddiylikdagi topilma (A02), lekin hisobotda qayd etiladi.

Xato xabarlari

500 javobi foydalanuvchiga stack trace, SQL so'rov, fayl yo'li, framework versiyasini ko'rsatmasligi kerak. To'g'ri javob: umumiy xabar + qo'llab-quvvatlash uchun so'rov ID'si (correlation id), batafsil ma'lumot esa faqat server logida (QA 13).

CORS

CORS — brauzerdagi boshqa domen sahifasi sizning API'ingiz javobini o'qiy oladimi, degan qoida (QA 9). Konfiguratsiya xatosi: server har qanday Origin ni Access-Control-Allow-Origin da qaytaradi va Access-Control-Allow-Credentials: true ham beradi. Tekshiruv: o'z staging API'ingizga ruxsat etilmagan origin bilan so'rov yuboring va javobni ko'ring:

curl -s -o /dev/null -D - -H "Origin: https://example.com" \
  https://staging.demobozor.example/api/v1/cart | grep -i "^access-control-"

Kutilgan natija: ruxsat etilmagan origin javobda aks ettirilmaydi.

Boshqa konfiguratsiya tekshiruvlari

  • Prod'da Swagger UI, debug endpoint'lar, test akkauntlari o'chirilganmi?
  • Standart (default) admin parollari o'zgartirilganmi?
  • Fayl saqlash joylari (bucket) ommaviy emasmi, papkalar ro'yxati (directory listing) yopiqmi?

8. Maxfiy ma'lumotlar va biznes mantiq {#data-logic}

Maxfiy ma'lumotlar (PII va to'lov)

TekshiruvQayerda qaraladi
Telefon, manzil, token URL'da yo'qNetwork tab, Proxyman, server loglari
Analytics hodisalarida PII yo'qProxyman bilan analytics so'rovlarini kuzatish
Loglarda parol, SMS kod, token, to'liq karta raqami yo'qServer loglari, Xcode console, logcat
UI'da karta niqoblangan (**** 1234)Ilova ekranlari
Maxfiy sahifalar keshlanmaydiCache-Control: no-store header'i
Hamma joyda HTTPSAralash kontent yo'q, HTTP → HTTPS redirect

Karta ma'lumotlari. PCI DSS v4.0 talabiga ko'ra karta tekshiruv kodi (CVV/CVC) avtorizatsiyadan keyin saqlanmaydi (3.3.1.2-talab). QA tekshiradi: CVV bazada, logda, analytics'da yo'q; karta ma'lumotlari odatda to'lov provayderining sahifasi yoki SDK'si orqali kiritiladi.

Biznes mantiq (A06 Insecure Design)

Bular kod emas, dizayn zaifliklari — ularni ko'pincha aynan QA topadi:

QoidaTekshiruvKutilgan natija
Miqdor 1–99API'ga quantity: 0 va quantity: -3422; UI'dagi cheklov yetarli emas — server ham tekshiradi
Narx serverda hisoblanadiSo'rovdagi price maydonini o'zgartirib yuborishServer mijoz yuborgan narxni e'tiborsiz qoldiradi
Promo-kod bir martaBir xil kodni ikkinchi buyurtmada ishlatishRad etiladi
Chegirmalar qo'shilmaydiYangi mijoz 10% + promo 15%Faqat kattasi (15%) qo'llanadi
Holat o'tishlariDELIVERED buyurtmani bekor qilishRad etiladi (QA 6)
Ikki marta bosishBir xil POST /orders ni bir vaqtda 2 marta yuborishBitta buyurtma yaratiladi (idempotency, QA 11)
Pul qaytarishQaytariladigan summa to'langandan oshmaydiRad etiladi

O'z test build'ingiz yuborgan so'rovni o'zgartirib, server tekshiruvlarini sinash uchun Proxyman dagi Breakpoint yoki Postman/Bruno'dan foydalaning — maqsad server validatsiyasini tasdiqlash.


9. API va mobil xavfsizlik: OWASP API Top 10, MASVS {#api-mobile}

OWASP API Security Top 10 (2023)

IDNomiQA tekshiruvi (qisqa)
API1Broken Object Level AuthorizationIkki akkaunt usuli: begona obyektga ruxsat yo'q
API2Broken AuthenticationToken muddati, logout, OTP/login cheklovlari
API3Broken Object Property Level AuthorizationOrtiqcha maydonlar qaytmaydi; role kabi maydonni o'zgartirib bo'lmaydi
API4Unrestricted Resource ConsumptionSahifalash limiti (limit=100000 rad etiladi), fayl hajmi, rate limit
API5Broken Function Level AuthorizationXaridor admin funksiyalarini chaqira olmaydi
API6Unrestricted Access to Sensitive Business FlowsAksiya mahsulotlarini avtomatik "supurib olish"ga qarshi cheklovlar bormi
API7Server Side Request ForgeryURL qabul qiladigan joylar (masalan, rasm havolasi) faqat ruxsat etilgan manzillarga boradi
API8Security MisconfigurationHeader'lar, CORS, xato xabarlari
API9Improper Inventory ManagementEski API versiyalari (/v0, /beta) hujjatlashtirilgan yoki o'chirilgan
API10Unsafe Consumption of APIsTashqi servis javobi ham validatsiya qilinadi

Mobil ilovalar: OWASP MASVS v2.1.0

MASVS (Mobile Application Security Verification Standard) — mobil ilova xavfsizligi talablari; uni qanday tekshirish MASTG (Mobile Application Security Testing Guide) da yozilgan. Nazorat guruhlari: MASVS-STORAGE, MASVS-CRYPTO, MASVS-AUTH, MASVS-NETWORK, MASVS-PLATFORM, MASVS-CODE, MASVS-RESILIENCE, MASVS-PRIVACY.

QA darajasidagi mobil tekshiruvlar:

  • token va shaxsiy ma'lumot UserDefaults / SharedPreferences da ochiq saqlanmaydi (Keychain / Keystore);
  • maxfiy ekranlar (masalan, to'lov) ilova almashtirgichdagi (app switcher) suratda ko'rinmaydi;
  • Xcode console va logcat'da token, SMS kod chiqmaydi;
  • prod build'da certificate pinning bor bo'lsa, Proxyman trafikni ocha olmaydi — bu kutilgan xatti-harakat (QA 15);
  • deep link'lar parametrlari validatsiya qilinadi, ruxsatlar (kamera, joylashuv) faqat kerak bo'lganda so'raladi (QA 14).

10. Vositalar: SAST, DAST, SCA va ZAP {#tools}

TurNima qiladiMisollarQachon ishlaydi
SASTManba kodni statik tahlil qiladiCodeQL, SemgrepHar PR'da
SCAKutubxonalardagi ma'lum zaifliklarni topadinpm audit, Dependabot, OSV-ScannerHar PR'da va har kuni
Secret scanningKodga tushib qolgan kalit va parollarni topadiGitHub secret scanning, gitleaksHar push'da
DASTIshlab turgan ilovani tashqaridan tekshiradiZAP, Burp SuiteStaging'da, kechasi
PentestMutaxassisning qo'lda chuqur tekshiruvi—Yirik relizlardan oldin
# SCA: high va critical zaifliklar bo'lsa, buyruq xato kodi bilan tugaydi
npm audit --audit-level=high

# OSV-Scanner: loyiha papkasini rekursiv tekshirish
osv-scanner scan source -r .

ZAP — "ZAP by Checkmarx", bepul va ochiq kodli DAST vositasi. Uning baseline scan rejimi saytni qisqa vaqt kezib chiqadi va faqat passiv tahlil qiladi — hujum so'rovlari yubormaydi. Shuning uchun u CI'da o'z staging muhitingizga qarshi ishlatish uchun qulay:

name: zap-baseline
on:
  schedule:
    - cron: "0 2 * * *" # har kuni 02:00 (UTC)

jobs:
  zap:
    runs-on: ubuntu-latest
    steps:
      - uses: zaproxy/action-baseline@v0.15.0
        with:
          target: ${{ vars.STAGING_URL }}

ZAP'ning faol (active) skanerlashi va Burp Suite bilan qo'lda tekshiruv — kelishilgan scope ichida security jamoasi bajaradigan ish.


11. Xavfsizlik regression testlari (Playwright) {#avtomatlashtirish}

Himoya bir marta ishlashi kifoya emas — keyingi refactoring uni jimgina buzib qo'yishi mumkin. Shuning uchun asosiy xavfsizlik qoidalarini regression test sifatida avtomatlashtiramiz. Quyidagi misollarni o'z kompyuteringizda ishga tushirish uchun kichik lokal DemoBozor API yozamiz — u to'g'ri himoyalangan namuna, testlar esa shu himoyalar ishlashini tasdiqlaydi.

Lokal mashq API'si

// lab/demobozor-api.mjs
// DemoBozor — xavfsizlik testlarini mashq qilish uchun kichik lokal API.
// Faqat o'z kompyuteringizda ishga tushiring: node lab/demobozor-api.mjs
import { createServer } from "node:http";

const PORT = Number(process.env.PORT ?? 4010);
const users = {
  "token-aziza": { id: 1, role: "buyer" },
  "token-bobur": { id: 2, role: "buyer" },
  "token-admin": { id: 3, role: "admin" },
};
const orders = {
  1001: { id: 1001, userId: 1, total: 349000 },
  1002: { id: 1002, userId: 2, total: 1250000 },
};
const failedOtp = {};
const escapeHtml = (s) => s.replace(/[&<>"']/g, (c) => `&#${c.charCodeAt(0)};`);

function send(res, status, body, extra = {}) {
  res.writeHead(status, {
    "Content-Type": "application/json; charset=utf-8",
    "Strict-Transport-Security": "max-age=31536000; includeSubDomains",
    "X-Content-Type-Options": "nosniff",
    "Content-Security-Policy": "default-src 'none'; frame-ancestors 'none'",
    "Referrer-Policy": "no-referrer",
    ...extra,
  });
  res.end(typeof body === "string" ? body : JSON.stringify(body));
}

async function readJson(req) {
  let raw = "";
  for await (const chunk of req) raw += chunk;
  return JSON.parse(raw || "{}");
}

createServer(async (req, res) => {
  const url = new URL(req.url, "http://localhost");
  if (url.pathname === "/health") return send(res, 200, { ok: true });

  // sharh muallifi sahifasi: foydalanuvchi matni HTML sifatida emas, matn sifatida chiqadi
  if (url.pathname === "/preview") {
    const name = escapeHtml(url.searchParams.get("name") ?? "");
    return send(
      res,
      200,
      `<html lang="uz"><body><h1>Sharh muallifi: ${name}</h1></body></html>`,
      { "Content-Type": "text/html; charset=utf-8" },
    );
  }

  // SMS kod: 3 ta noto'g'ri urinishdan keyin 15 daqiqalik blok (DemoBozor qoidasi)
  if (req.method === "POST" && url.pathname === "/api/v1/auth/verify") {
    const { phone, code } = await readJson(req);
    if ((failedOtp[phone] ?? 0) >= 3) {
      return send(
        res,
        429,
        { error: "TOO_MANY_ATTEMPTS" },
        { "Retry-After": "900" },
      );
    }
    if (code === "482913")
      return send(res, 200, { accessToken: "token-aziza" });
    failedOtp[phone] = (failedOtp[phone] ?? 0) + 1;
    return send(res, 400, { error: "INVALID_CODE" });
  }

  const user = users[(req.headers.authorization ?? "").replace(/^Bearer /, "")];
  if (!user) return send(res, 401, { error: "UNAUTHORIZED" });

  const orderMatch = url.pathname.match(/^\/api\/v1\/orders\/(\d+)$/);
  if (req.method === "GET" && orderMatch) {
    const order = orders[orderMatch[1]];
    // egalik tekshiruvi: begona buyurtma "topilmadi" deb javob beradi
    if (!order || (order.userId !== user.id && user.role !== "admin")) {
      return send(res, 404, { error: "NOT_FOUND" });
    }
    return send(res, 200, order);
  }

  if (req.method === "GET" && url.pathname === "/api/v1/admin/users") {
    if (user.role !== "admin") return send(res, 403, { error: "FORBIDDEN" });
    return send(res, 200, [{ id: 1 }, { id: 2 }, { id: 3 }]);
  }

  if (req.method === "PATCH" && url.pathname === "/api/v1/profile") {
    const { fullName } = await readJson(req);
    if (
      typeof fullName !== "string" ||
      fullName.length < 2 ||
      fullName.length > 50
    ) {
      return send(res, 422, { error: "INVALID_NAME" });
    }
    return send(res, 200, { id: user.id, fullName });
  }

  return send(res, 404, { error: "NOT_FOUND" });
}).listen(PORT, () => console.log(`DemoBozor API: http://localhost:${PORT}`));

Playwright konfiguratsiyasi

Playwright test boshlanishidan oldin serverni o'zi ishga tushiradi (webServer):

// playwright.config.ts
import { defineConfig } from "@playwright/test";

export default defineConfig({
  testDir: "./tests",
  reporter: "list",
  use: { baseURL: "http://localhost:4010" },
  webServer: {
    command: "node lab/demobozor-api.mjs",
    url: "http://localhost:4010/health",
    reuseExistingServer: false,
  },
});

Access control va konfiguratsiya testlari

// tests/access-control.spec.ts
import { test, expect } from "@playwright/test";

const AZIZA = { Authorization: "Bearer token-aziza" }; // 1001-buyurtma egasi
const BOBUR = { Authorization: "Bearer token-bobur" }; // 1002-buyurtma egasi

test.describe("A01 Broken Access Control", () => {
  test("tokensiz so'rov 401 qaytaradi", async ({ request }) => {
    const res = await request.get("/api/v1/orders/1001");
    expect(res.status()).toBe(401);
  });

  test("xaridor o'z buyurtmasini ko'radi", async ({ request }) => {
    const res = await request.get("/api/v1/orders/1001", { headers: AZIZA });
    expect(res.status()).toBe(200);
    expect((await res.json()).userId).toBe(1);
  });

  test("xaridor boshqa odamning buyurtmasini ko'ra olmaydi (IDOR)", async ({
    request,
  }) => {
    const res = await request.get("/api/v1/orders/1002", { headers: AZIZA });
    expect(res.status(), "Aziza Boburning buyurtmasini ko'rmasligi kerak").toBe(
      404,
    );
    expect(await res.text()).not.toContain("1250000");
  });

  test("xaridor admin endpoint'iga kira olmaydi", async ({ request }) => {
    const res = await request.get("/api/v1/admin/users", { headers: BOBUR });
    expect(res.status()).toBe(403);
  });
});

test("A02 Security Misconfiguration: xavfsizlik header'lari bor", async ({
  request,
}) => {
  const res = await request.get("/api/v1/orders/1001", { headers: AZIZA });
  const headers = res.headers(); // kalitlar kichik harfda
  expect(headers["x-content-type-options"]).toBe("nosniff");
  expect(headers["strict-transport-security"]).toContain("max-age=");
  expect(headers["content-security-policy"]).toBeDefined();
  expect(
    headers["x-powered-by"],
    "texnologiya oshkor qilinmasin",
  ).toBeUndefined();
});

Autentifikatsiya va kiritilgan ma'lumot testlari

// tests/auth-input.spec.ts
import { test, expect } from "@playwright/test";

test("A07: 3 ta noto'g'ri SMS koddan keyin raqam 15 daqiqaga bloklanadi", async ({
  request,
}) => {
  const phone = "+998901234567";
  for (let i = 1; i <= 3; i++) {
    const res = await request.post("/api/v1/auth/verify", {
      data: { phone, code: "000000" },
    });
    expect(res.status(), `${i}-urinish`).toBe(400);
  }
  // 4-urinish — hatto to'g'ri kod bilan ham blok bo'lishi kerak
  const blocked = await request.post("/api/v1/auth/verify", {
    data: { phone, code: "482913" },
  });
  expect(blocked.status()).toBe(429);
  expect(blocked.headers()["retry-after"]).toBe("900");
});

test("A05: foydalanuvchi matni HTML sifatida emas, oddiy matn sifatida chiqadi", async ({
  page,
}) => {
  const marker = "<i>DemoBozor</i>";
  await page.goto(`/preview?name=${encodeURIComponent(marker)}`);

  // matn aynan ko'rinishi kerak va sahifada <i> element paydo bo'lmasligi kerak
  await expect(page.getByRole("heading")).toContainText(marker);
  await expect(page.locator("h1 i")).toHaveCount(0);
});

test("o'zbekcha apostrofli ism xatosiz saqlanadi", async ({ request }) => {
  for (const fullName of [
    "O'g'iloy Karimova",
    "Oʻtkir Gʻaniyev",
    "Ғайрат Қодиров",
  ]) {
    const res = await request.patch("/api/v1/profile", {
      headers: { Authorization: "Bearer token-aziza" },
      data: { fullName },
    });
    expect(res.status(), fullName).toBe(200);
    expect((await res.json()).fullName).toBe(fullName);
  }
});
npm i -D @playwright/test
npx playwright install chromium
npx playwright test
# 8 passed

Real loyihada xuddi shu testlar baseURL ni staging API'ga qaratib ishlaydi, test akkauntlari tokenlari esa CI secret'laridan olinadi (QA 21). Playwright asoslari: QA 18, API testlari: QA 20.

💡 Maslahat: Har yangi endpoint uchun "ruxsat matritsasi" (rol × amal) testini qo'shishni Definition of Done'ga kiriting. Bu IDOR'ni reliz oldidan emas, PR bosqichida ushlaydi.


12. Topilmani baholash va xabar qilish: CVSS v4.0 {#reporting}

CVSS v4.0 asoslari

CVSS (Common Vulnerability Scoring System) — zaiflik jiddiyligini 0–10 ballda baholash standarti. v4.0 FIRST tomonidan 2023-yil 1-noyabrda chiqarilgan. Metrika guruhlari:

  • Base — zaiflikning o'zgarmas xususiyatlari (hujum vektori, murakkablik, kerakli huquqlar, foydalanuvchi ishtiroki, maxfiylik/yaxlitlik/mavjudlikka ta'siri);
  • Threat — vaqt bilan o'zgaradigan omillar (masalan, ma'lum exploit bormi);
  • Environmental — sizning muhitingizga xos omillar;
  • Supplemental — ballga ta'sir qilmaydigan qo'shimcha kontekst.

Faqat Base bilan hisoblangan ball CVSS-B, Threat qo'shilsa CVSS-BT, Environmental qo'shilsa CVSS-BE, hammasi bilan CVSS-BTE deb belgilanadi.

BahoBall
None0.0
Low0.1 – 3.9
Medium4.0 – 6.9
High7.0 – 8.9
Critical9.0 – 10.0

Misol. DemoBozor'dagi IDOR: tizimga kirgan har qanday xaridor tarmoq orqali, qo'shimcha shartsiz boshqa mijozlarning buyurtma ma'lumotlarini (telefon, manzil, summa) o'qiy oladi, lekin o'zgartira olmaydi.

CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N  →  7.1 (High)

AV:N — tarmoq orqali, PR:L — oddiy foydalanuvchi huquqi kerak, VC:H — maxfiylikka yuqori ta'sir, VI:N/VA:N — yaxlitlik va mavjudlikka ta'sir yo'q. Vektorni har doim FIRST'ning rasmiy kalkulyatorida tekshiring. Jamoangizning severity (QA 8) shkalasi CVSS bilan bir xil bo'lishi shart emas — biznes ta'siri ham hisobga olinadi.

Security bug report

Oddiy bug report'dan farqlari:

  • Maxfiy ticket: cheklangan ko'rinishdagi loyiha yoki "Security" turidagi issue; umumiy chat va guruhlarda tafsilot yozilmaydi.
  • Minimal qayta hosil qilish — faqat test muhiti va test akkauntlari bilan.
  • Dalillardagi token, telefon, manzillarni niqoblang (token-****, +998 90 *** ** 67).
  • Ta'sir: kim, nimaga, qancha ma'lumotga kira oladi.
Sarlavha:  [SECURITY] GET /api/v1/orders/{id} boshqa xaridor buyurtmasini qaytaradi (IDOR)
Muhit:     staging, api v2.14.0
Qadamlar:  1) Xaridor A (test akkaunt) bilan kirish
           2) Xaridor B'ga tegishli buyurtma ID'si bilan GET /api/v1/orders/{id}
Kutilgan:  404 yoki 403, B ma'lumotlari qaytmaydi
Haqiqiy:   200, javobda B'ning telefoni va manzili (dalil niqoblangan)
Ta'sir:    Har qanday xaridor ketma-ket ID'lar orqali boshqa mijozlar PII'sini o'qiy oladi
OWASP:     A01:2025, API1:2023
CVSS v4.0: 7.1 (High) — vektor yuqorida
Tavsiya:   Server tomonida egalik tekshiruvi; regression test qo'shish

Uchinchi tomon tizimida tasodifan zaiflik ko'rsangiz: uni boshqa tekshirmang, saytning /.well-known/security.txt faylida (RFC 9116) yoki bug bounty dasturida ko'rsatilgan kanal orqali xabar bering.


13. QA xavfsizlik checklisti {#security-checklist}

SohaTekshiruvNatija
Access controlIkki akkaunt bilan har resurs uchun o'qish/o'zgartirish/o'chirish☐
Access controlXaridor admin funksiyalari va sahifalariga kira olmaydi☐
Access controlrole, isPremium kabi maydonlarni mijoz o'zgartira olmaydi☐
AuthNOTP: muddat, bir martalik, 3 urinishdan keyin blok, 429☐
AuthNLogout'dan keyin eski token 401☐
AuthNRo'yxatdan o'tgan/o'tmagan raqam xabarlari bir xil☐
InputApostrof, qo'shtirnoq, kirill, emoji — 500 yo'q, to'g'ri saqlanadi☐
InputHTML ko'rinishidagi matn oddiy matn sifatida chiqadi☐
InputServer tomonida uzunlik/tur/format validatsiyasi☐
ConfigHSTS, CSP, nosniff, Referrer-Policy bor; X-Powered-By yo'q☐
Config500 javoblarida stack trace yo'q☐
ConfigCORS begona origin'ni aks ettirmaydi☐
DataPII URL, log va analytics'da yo'q; CVV saqlanmaydi☐
LogicNarx serverda, promo bir marta, miqdor 1–99 serverda tekshiriladi☐
LogicIkki marta yuborilgan buyurtma bitta yaratadi☐
LoggingMuhim hodisalar (login, admin amallari, refund) loglanadi☐
ErrorsTashqi servis ishlamasa, tizim xavfsiz holatda qoladi (A10)☐
Supply chainnpm audit/Dependabot/OSV-Scanner CI'da ishlaydi☐
MobileToken Keychain/Keystore'da; loglarda maxfiy ma'lumot yo'q☐

Batafsil talablar ro'yxati kerak bo'lsa — OWASP ASVS (joriy barqaror versiya 5.0.0), test usullari uchun — OWASP WSTG.


14. Amaliy mashqlar {#mashqlar}

Mashq 1: OWASP toifasini aniqlang

Har bir topilma qaysi OWASP Top 10:2025 toifasiga kiradi?

  1. 500 javobida PostgreSQL xato matni va jadval nomi ko'rinadi.
  2. Xaridor /api/v1/admin/users ni chaqirib, ro'yxatni oladi.
  3. To'lov servisi ishlamay qolganda buyurtma holati baribir PAID bo'ladi.
  4. Loyiha ma'lum zaiflikka ega eski kutubxona versiyasidan foydalanadi.
  5. Bitta promo-kodni cheksiz marta ishlatish mumkin.
  6. 50 ta muvaffaqiyatsiz admin login urinishi hech qayerda qayd etilmaydi.

<details> <summary>💡 Javobni ko'rish</summary>

  1. A02 Security Misconfiguration (ortiqcha ma'lumot beruvchi xato xabarlari).
  2. A01 Broken Access Control (vertikal huquq; API'da — API5:2023 BFLA).
  3. A10 Mishandling of Exceptional Conditions (istisno holatda "fail-open").
  4. A03 Software Supply Chain Failures.
  5. A06 Insecure Design (biznes mantiq).
  6. A09 Security Logging and Alerting Failures.

</details>

Mashq 2: IDOR test matritsasi

DemoBozor'da manzillar API'si bor: GET/PATCH/DELETE /api/v1/addresses/{id}. Rollar: xaridor A, xaridor B, admin. Test matritsasini tuzing: kim, qaysi amal, kimning resursi, kutilgan status.

<details> <summary>💡 Javobni ko'rish</summary>

KimAmalResurs egasiKutilgan
AGETA200
AGETB404 (yoki 403), B ma'lumoti yo'q
APATCHB404/403, B manzili o'zgarmagan
ADELETEB404/403, B manzili joyida
TokensizGETA401
AdminGETBSiyosatga ko'ra: 200 (agar adminga ruxsat bo'lsa)
AGETmavjud bo'lmagan ID404 (begona ID bilan bir xil format)

Har PATCH/DELETE tekshiruvidan keyin B tokeni bilan resursni qayta o'qib, o'zgarmaganini tasdiqlang — status kodning o'zi yetarli emas.

</details>

Mashq 3: Header'lar tahlili

Staging'dan olingan (xayoliy) javob header'lari:

HTTP/1.1 200 OK
Content-Type: application/json
X-Powered-By: Express
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true

So'rov Origin: https://example.com bilan yuborilgan, bu domen esa DemoBozor'ga tegishli emas. Qanday topilmalarni yozasiz?

<details> <summary>💡 Javobni ko'rish</summary>

  1. CORS noto'g'ri sozlangan — begona origin aks ettirilgan va credentials'ga ruxsat berilgan. Jiddiyroq topilma: boshqa sayt foydalanuvchi nomidan API javoblarini o'qishi mumkin bo'lib qoladi. Kutilgan: faqat ruxsat etilgan origin'lar ro'yxati.
  2. **X-Powered-By: Express** — texnologiya oshkor qilinmoqda (past jiddiylik, A02).
  3. Yo'q header'lar: Strict-Transport-Security, X-Content-Type-Options: nosniff, Content-Security-Policy (API uchun ham frame-ancestors), Referrer-Policy.
  4. HTTP/1.1 200 — staging HTTPS orqali ishlayotganini va HTTP → HTTPS redirect borligini alohida tekshiring.

</details>

Mashq 4: Promo-kod uchun "abuse case"lar

DemoBozor promo-kod qoidalari: 6–12 belgi (A–Z, 0–9), bitta buyurtmaga bitta, har promo uchun minimal summa va amal qilish muddati, har foydalanuvchi bir marta. Kamida 6 ta "noto'g'ri foydalanish" test g'oyasini yozing.

<details> <summary>💡 Javobni ko'rish</summary>

  1. Bir foydalanuvchi bir kodni ikkinchi buyurtmada ishlatadi → rad etiladi.
  2. Bir buyurtmaga ikki xil promo-kod (UI orqali va API orqali) → faqat bittasi.
  3. Minimal summaga yetgandan keyin kod qo'llanib, so'ng savatdan mahsulot olib tashlanadi → chegirma qayta hisoblanadi yoki olib tashlanadi.
  4. Muddati o'tgan kod → rad etiladi; vaqt zonasi chegarasida (Asia/Tashkent, 23:59/00:00) xatti-harakat to'g'ri.
  5. Bir xil kod bilan ikki buyurtma bir vaqtda (parallel) yuboriladi → faqat bittasida qo'llanadi.
  6. Buyurtma bekor qilinganda kod qaytariladimi — talabda yozilgan qoidaga mosmi.
  7. Chegirma "Yangi mijoz 10%" bilan qo'shilmaydi — faqat kattasi qo'llanadi.

</details>

Mashq 5: CVSS bahosi

Quyidagi ballarni sifat bahosiga aylantiring: 0.0, 3.9, 4.0, 7.1, 8.9, 9.3.

<details> <summary>💡 Javobni ko'rish</summary>

BallBaho
0.0None
3.9Low
4.0Medium
7.1High
8.9High
9.3Critical

Chegaralar: Low 0.1–3.9, Medium 4.0–6.9, High 7.0–8.9, Critical 9.0–10.0.

</details>

Mashq 6: Security bug report yozing

Vaziyat: staging'da sotuvchi panelida mahsulot narxini o'zgartirish so'rovi (PATCH /api/v1/seller/products/{id}) boshqa sotuvchining mahsuloti ID'si bilan ham 200 qaytardi va narx o'zgardi. Report'ni yozing (dalillarni niqoblashni unutmang).

<details> <summary>💡 Javobni ko'rish</summary>

Sarlavha:  [SECURITY] Sotuvchi boshqa sotuvchining mahsulot narxini o'zgartira oladi
           (PATCH /api/v1/seller/products/{id})
Muhit:     staging, seller-panel v1.8.2, api v2.14.0
Shartlar:  Ikki test sotuvchi akkaunti: S1 va S2; S2 ning mahsuloti P
Qadamlar:  1) S1 bilan kirish
           2) PATCH /api/v1/seller/products/{P ning id'si} {"price": 1000}
Kutilgan:  404 yoki 403; P narxi o'zgarmaydi
Haqiqiy:   200; P narxi 1000 so'mga o'zgardi (S2 akkauntida tasdiqlandi)
Ta'sir:    Integrity — har qanday sotuvchi raqobatchi mahsulotlari narxini buzishi mumkin
OWASP:     A01:2025, API1:2023 (BOLA)
Dalil:     so'rov/javob (token-**** bilan niqoblangan), S2 panelidagi skrinshot
Ko'rinish: faqat security va backend jamoasi
Tavsiya:   Server tomonida "mahsulot.sellerId === joriy sotuvchi" tekshiruvi;
           sotuvchi endpoint'lari uchun regression test

Jiddiylik yuqori — integrity'ga to'g'ridan-to'g'ri ta'sir va katta biznes zarari. Test muhitidagi o'zgartirilgan narxni qayta tiklashni ham unutmang.

</details>


Xulosa {#xulosa}

  • QA xavfsizlikda himoya mexanizmlari ishlayotganini tekshiradi va avtomatlashtiradi; faqat o'z tizimingiz, test muhiti va ruxsat bilan.
  • OWASP Top 10:2025 — test g'oyalari xaritasi: A01 Broken Access Control hamon birinchi, A03 supply chain va A10 istisno holatlar yangi nomlar.
  • IDOR/BOLA'ni ikki akkaunt usuli bilan tekshiring; UI'da tugmaning yashirilgani himoya emas.
  • Kiritilgan ma'lumot — doim ma'lumot: apostrofli o'zbek ismlari, maxsus belgilar va HTML ko'rinishidagi matn bilan validatsiya va encoding'ni tekshiring.
  • Header'lar, xato xabarlari, CORS, maxfiy ma'lumotlar va biznes mantiq — QA'ning kundalik xavfsizlik checklisti.
  • SAST/SCA/secret scanning har PR'da, ZAP baseline (passiv) kechasi staging'da; chuqur testlar — security jamoasi va pentester.
  • Topilmani CVSS v4.0 bilan baholang, maxfiy ticket'da, niqoblangan dalillar bilan xabar qiling.
  • Keyingi dars: QA 25: Accessibility, Localization va Visual testing — WCAG 2.2, axe-core va o'zbek tili nozikliklari

Manbalar {#manbalar}

  1. OWASP Top 10:2025
  2. OWASP Top 10 — loyiha sahifasi
  3. OWASP API Security Top 10 — 2023
  4. OWASP MASVS
  5. OWASP MASTG
  6. OWASP Web Security Testing Guide (WSTG)
  7. OWASP ASVS
  8. OWASP Cheat Sheet — Insecure Direct Object Reference Prevention
  9. OWASP Cheat Sheet — Authorization
  10. OWASP Cheat Sheet — Authentication
  11. OWASP Cheat Sheet — Session Management
  12. OWASP Cheat Sheet — HTML5 Security
  13. OWASP Cheat Sheet — SQL Injection Prevention
  14. OWASP Cheat Sheet — Cross Site Scripting Prevention
  15. OWASP Cheat Sheet — HTTP Headers
  16. OWASP Cheat Sheet — Mass Assignment
  17. OWASP Cheat Sheet — File Upload
  18. OWASP Cheat Sheet — Error Handling
  19. OWASP Cheat Sheet — Logging
  20. OWASP Cheat Sheet — Vulnerability Disclosure
  21. MDN — Content-Security-Policy
  22. MDN — Strict-Transport-Security
  23. MDN — CORS
  24. FIRST — CVSS v4.0 Specification
  25. FIRST — CVSS v4.0 Calculator
  26. ZAP — Baseline Scan
  27. zaproxy/action-baseline — GitHub
  28. npm audit
  29. Google OSV-Scanner
  30. GitHub — Dependabot
  31. PCI SSC FAQ — sensitive authentication data
  32. RFC 9116 — security.txt
  33. OWASP Juice Shop — GitHub
  34. PortSwigger Web Security Academy
  35. O'zbekiston Respublikasi Jinoyat kodeksi — lex.uz

Markdown manba

iOS Lessons