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
- Qonuniy va axloqiy chegaralar
- Asosiy tushunchalar: CIA, authN va authZ, sessiyalar
- OWASP Top 10:2025 — QA ko'zi bilan
- Access control: IDOR/BOLA va rollar
- Autentifikatsiya va sessiyalar
- Kiritilgan ma'lumotlar: injection va XSS'dan himoyani tekshirish
- Konfiguratsiya: header'lar, xato xabarlari, CORS
- Maxfiy ma'lumotlar va biznes mantiq
- API va mobil xavfsizlik: OWASP API Top 10, MASVS
- Vositalar: SAST, DAST, SCA va ZAP
- Xavfsizlik regression testlari (Playwright)
- Topilmani baholash va xabar qilish: CVSS v4.0
- QA xavfsizlik checklisti
- Amaliy mashqlar
- Xulosa
- Manbalar
1. Qonuniy va axloqiy chegaralar {#qoidalar}
Bu darsdagi har bir tekshiruv faqat quyidagi sharoitda bajariladi:
- Tizim sizning kompaniyangizga tegishli va sizga yozma ruxsat (scope) berilgan.
- Test test/staging muhitida, test akkauntlari va test ma'lumotlari bilan o'tkaziladi.
- Real foydalanuvchilar ma'lumotlariga tegilmaydi; tasodifan zaiflik ko'rsangiz — to'xtaysiz va maxfiy xabar qilasiz.
- 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?
| Rol | Asosiy vazifa | Qachon |
|---|---|---|
| QA engineer | Xavfsizlik talablari bajarilganini tekshiradi, regression testlar yozadi, "abuse case"larni o'ylaydi | Har sprintda |
| Security engineer | Arxitektura, threat modeling, SAST/DAST sozlash, jamoaga maslahat | Doimiy |
| Pentester | Kelishilgan scope ichida chuqur, qo'lda hujum simulyatsiyasi | Yirik 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
| Tamoyil | Ma'nosi | DemoBozor'da buzilishi |
|---|---|---|
| Confidentiality (maxfiylik) | Ma'lumotni faqat ruxsati borlar ko'radi | Xaridor boshqa odamning manzili va telefonini ko'radi |
| Integrity (yaxlitlik) | Ma'lumotni faqat ruxsati borlar o'zgartiradi | Mijoz buyurtma narxini o'zi o'zgartira oladi |
| Availability (mavjudlik) | Tizim kerak paytda ishlaydi | Aksiya 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 uchun404).
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
localStorageda saqlamang — u yerdagi ma'lumotni sahifadagi istalgan JavaScript o'qiy oladi;HttpOnlycookie 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).
| # | Toifa | QA nimani tekshiradi | DemoBozor misoli |
|---|---|---|---|
| A01 | Broken Access Control | Gorizontal (boshqa foydalanuvchi) va vertikal (yuqori rol) ruxsatlar; to'g'ridan-to'g'ri URL/API orqali kirish | Xaridor /admin sahifasini yoki boshqa xaridorning buyurtmasini ochadi |
| A02 | Security Misconfiguration | Xavfsizlik header'lari, xato xabarlarida stack trace, ochiq debug/Swagger, standart parollar | 500 javobida SQL so'rov va fayl yo'li ko'rinadi |
| A03 | Software Supply Chain Failures | Kutubxonalardagi ma'lum zaifliklar, lockfile, CI'dagi skanerlar hisoboti | Ma'lum CVE'li eski kutubxona prod'da ishlayapti |
| A04 | Cryptographic Failures | Hamma joyda HTTPS va HSTS, maxfiy ma'lumot ochiq matnda saqlanmaydi | Karta raqami loglarda to'liq yozilgan |
| A05 | Injection | Maxsus belgilar tizimni buzmaydi; foydalanuvchi matni kod sifatida bajarilmaydi | Ismdagi apostrof (O'g'iloy) 500 xato beradi |
| A06 | Insecure Design | Biznes mantiqdagi teshiklar, "abuse case"lar | Bir promo-kodni ikki marta ishlatish mumkin |
| A07 | Authentication Failures | Login/OTP cheklovlari, parol siyosati, sessiya muddati, logout | 3 ta xato SMS koddan keyin blok ishlamaydi |
| A08 | Software or Data Integrity Failures | Tashqi manbadan kelgan ma'lumot va yangilanishlar imzosi tekshiriladimi | To'lov provayderi callback'ining imzosi tekshirilmaydi |
| A09 | Security Logging and Alerting Failures | Muhim hodisalar loglanadimi, ogohlantirish bormi, logda parol/token yo'qmi | 100 ta muvaffaqiyatsiz login — hech kim xabar topmaydi |
| A10 | Mishandling of Exceptional Conditions | Bog'liq servis ishlamay qolganda tizim xavfsiz holatda qoladimi | To'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
| Resurs | Amal | A tokeni bilan B resursiga | Kutilgan natija |
|---|---|---|---|
| Buyurtma | GET /orders/{id} | B buyurtmasini o'qish | 404 yoki 403, begona ma'lumot yo'q |
| Buyurtma | POST /orders/{id}/cancel | B buyurtmasini bekor qilish | 404/403, B buyurtmasi o'zgarmagan |
| Manzil | PATCH /addresses/{id} | B manzilini o'zgartirish | 404/403 |
| Sharh | DELETE /reviews/{id} | B sharhini o'chirish | 404/403 |
| Admin | GET /admin/users | Xaridor tokeni bilan | 403 |
| Har qanday | Tokensiz | — | 401 |
Qadamlar:
- Test muhitida ikkita xaridor (A va B) va bitta admin yarating.
- B'ning resurslari ID'larini yozib oling (buyurtma, manzil, sharh).
- A tokeni bilan har bir resurs va har bir amal (o'qish, o'zgartirish, o'chirish) uchun so'rov yuboring.
- Kutilgan javob —
403/404, va B'ning ma'lumoti o'zgarmagani, javobda uning ma'lumotlari yo'qligi. - Bu tekshiruvlarni avtomatlashtiring (11-bo'lim).
🧠 Esda tuting:
403mi yoki404mi?404resurs mavjudligini ham yashiradi;403ochiqroq. Ikkalasi ham to'g'ri bo'lishi mumkin — muhimi, jamoa siyosati bir xil bo'lsin va hech qachon200+ 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:
| Tekshiruv | Kutilgan natija |
|---|---|
| 3 ta noto'g'ri koddan keyin 4-urinish (hatto to'g'ri kod bilan) | Blok: 429 + Retry-After: 900 |
| 15 daqiqadan keyin | Yana urinish mumkin |
| 120 soniyadan eski kod | Rad etiladi |
| Bir marta ishlatilgan kod | Qayta ishlamaydi |
| 60 soniyadan oldin qayta yuborish | Rad etiladi yoki tugma faol emas |
| Ro'yxatdan o'tmagan raqam | Xabar 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:
- Server tomonida validatsiya — uzunlik, tur, format (ism 2–50, sharh 10–1000 belgi).
- Parametrlangan so'rovlar — SQL so'rov matni va foydalanuvchi qiymati alohida yuboriladi (QA 12).
- 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
| Tekshiruv | Qanday | Kutilgan natija |
|---|---|---|
| O'zbekcha apostroflar | Ism: O'g'iloy, Oʻtkir Gʻaniyev, kirillcha Ғайрат | Saqlanadi va aynan shunday ko'rinadi; 500 yo'q |
| Maxsus belgilar | Qo'shtirnoq, &, <, >, %, \, emoji | Saqlanadi va to'g'ri ko'rinadi |
| HTML ko'rinishidagi matn | Sharhga <i>test</i> yozing | Sahifada aynan <i>test</i> matni ko'rinadi, kursiv emas |
| Uzunlik chegaralari | API'ga to'g'ridan-to'g'ri 1 va 51 belgili ism | 422 va tushunarli xato |
| Turlar | quantity: "abc", quantity: -1 | 400/422, 500 emas |
| Fayl yuklash | Ruxsat etilmagan tur, juda katta hajm | Rad etiladi; fayl nomi o'zgartiriladi |
⚠️ Diqqat: Oddiy apostrof (
') yoki qo'shtirnoq500 Internal Server Errorga 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
| Header | Vazifasi | Misol qiymat |
|---|---|---|
Strict-Transport-Security | Brauzer saytga faqat HTTPS orqali kiradi (HSTS) | max-age=31536000; includeSubDomains |
Content-Security-Policy | Qaysi manbadan skript/stil/rasm yuklash mumkinligini cheklaydi | default-src 'self'; frame-ancestors 'none' |
X-Content-Type-Options | Brauzer Content-Type'ni "taxmin qilmaydi" | nosniff |
frame-ancestors (CSP) yoki X-Frame-Options | Saytni begona sahifa ichiga iframe qilib qo'yishni taqiqlaydi | frame-ancestors 'none' |
Referrer-Policy | Boshqa saytga o'tganda URL qancha oshkor bo'lishini cheklaydi | strict-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)
| Tekshiruv | Qayerda qaraladi |
|---|---|
| Telefon, manzil, token URL'da yo'q | Network tab, Proxyman, server loglari |
| Analytics hodisalarida PII yo'q | Proxyman bilan analytics so'rovlarini kuzatish |
| Loglarda parol, SMS kod, token, to'liq karta raqami yo'q | Server loglari, Xcode console, logcat |
UI'da karta niqoblangan (**** 1234) | Ilova ekranlari |
| Maxfiy sahifalar keshlanmaydi | Cache-Control: no-store header'i |
| Hamma joyda HTTPS | Aralash 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:
| Qoida | Tekshiruv | Kutilgan natija |
|---|---|---|
| Miqdor 1–99 | API'ga quantity: 0 va quantity: -3 | 422; UI'dagi cheklov yetarli emas — server ham tekshiradi |
| Narx serverda hisoblanadi | So'rovdagi price maydonini o'zgartirib yuborish | Server mijoz yuborgan narxni e'tiborsiz qoldiradi |
| Promo-kod bir marta | Bir xil kodni ikkinchi buyurtmada ishlatish | Rad etiladi |
| Chegirmalar qo'shilmaydi | Yangi mijoz 10% + promo 15% | Faqat kattasi (15%) qo'llanadi |
| Holat o'tishlari | DELIVERED buyurtmani bekor qilish | Rad etiladi (QA 6) |
| Ikki marta bosish | Bir xil POST /orders ni bir vaqtda 2 marta yuborish | Bitta buyurtma yaratiladi (idempotency, QA 11) |
| Pul qaytarish | Qaytariladigan summa to'langandan oshmaydi | Rad 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)
| ID | Nomi | QA tekshiruvi (qisqa) |
|---|---|---|
| API1 | Broken Object Level Authorization | Ikki akkaunt usuli: begona obyektga ruxsat yo'q |
| API2 | Broken Authentication | Token muddati, logout, OTP/login cheklovlari |
| API3 | Broken Object Property Level Authorization | Ortiqcha maydonlar qaytmaydi; role kabi maydonni o'zgartirib bo'lmaydi |
| API4 | Unrestricted Resource Consumption | Sahifalash limiti (limit=100000 rad etiladi), fayl hajmi, rate limit |
| API5 | Broken Function Level Authorization | Xaridor admin funksiyalarini chaqira olmaydi |
| API6 | Unrestricted Access to Sensitive Business Flows | Aksiya mahsulotlarini avtomatik "supurib olish"ga qarshi cheklovlar bormi |
| API7 | Server Side Request Forgery | URL qabul qiladigan joylar (masalan, rasm havolasi) faqat ruxsat etilgan manzillarga boradi |
| API8 | Security Misconfiguration | Header'lar, CORS, xato xabarlari |
| API9 | Improper Inventory Management | Eski API versiyalari (/v0, /beta) hujjatlashtirilgan yoki o'chirilgan |
| API10 | Unsafe Consumption of APIs | Tashqi 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/SharedPreferencesda 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}
| Tur | Nima qiladi | Misollar | Qachon ishlaydi |
|---|---|---|---|
| SAST | Manba kodni statik tahlil qiladi | CodeQL, Semgrep | Har PR'da |
| SCA | Kutubxonalardagi ma'lum zaifliklarni topadi | npm audit, Dependabot, OSV-Scanner | Har PR'da va har kuni |
| Secret scanning | Kodga tushib qolgan kalit va parollarni topadi | GitHub secret scanning, gitleaks | Har push'da |
| DAST | Ishlab turgan ilovani tashqaridan tekshiradi | ZAP, Burp Suite | Staging'da, kechasi |
| Pentest | Mutaxassisning 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.
| Baho | Ball |
|---|---|
| None | 0.0 |
| Low | 0.1 – 3.9 |
| Medium | 4.0 – 6.9 |
| High | 7.0 – 8.9 |
| Critical | 9.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}
| Soha | Tekshiruv | Natija |
|---|---|---|
| Access control | Ikki akkaunt bilan har resurs uchun o'qish/o'zgartirish/o'chirish | ☐ |
| Access control | Xaridor admin funksiyalari va sahifalariga kira olmaydi | ☐ |
| Access control | role, isPremium kabi maydonlarni mijoz o'zgartira olmaydi | ☐ |
| AuthN | OTP: muddat, bir martalik, 3 urinishdan keyin blok, 429 | ☐ |
| AuthN | Logout'dan keyin eski token 401 | ☐ |
| AuthN | Ro'yxatdan o'tgan/o'tmagan raqam xabarlari bir xil | ☐ |
| Input | Apostrof, qo'shtirnoq, kirill, emoji — 500 yo'q, to'g'ri saqlanadi | ☐ |
| Input | HTML ko'rinishidagi matn oddiy matn sifatida chiqadi | ☐ |
| Input | Server tomonida uzunlik/tur/format validatsiyasi | ☐ |
| Config | HSTS, CSP, nosniff, Referrer-Policy bor; X-Powered-By yo'q | ☐ |
| Config | 500 javoblarida stack trace yo'q | ☐ |
| Config | CORS begona origin'ni aks ettirmaydi | ☐ |
| Data | PII URL, log va analytics'da yo'q; CVV saqlanmaydi | ☐ |
| Logic | Narx serverda, promo bir marta, miqdor 1–99 serverda tekshiriladi | ☐ |
| Logic | Ikki marta yuborilgan buyurtma bitta yaratadi | ☐ |
| Logging | Muhim hodisalar (login, admin amallari, refund) loglanadi | ☐ |
| Errors | Tashqi servis ishlamasa, tizim xavfsiz holatda qoladi (A10) | ☐ |
| Supply chain | npm audit/Dependabot/OSV-Scanner CI'da ishlaydi | ☐ |
| Mobile | Token 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?
500javobida PostgreSQL xato matni va jadval nomi ko'rinadi.- Xaridor
/api/v1/admin/usersni chaqirib, ro'yxatni oladi. - To'lov servisi ishlamay qolganda buyurtma holati baribir
PAIDbo'ladi. - Loyiha ma'lum zaiflikka ega eski kutubxona versiyasidan foydalanadi.
- Bitta promo-kodni cheksiz marta ishlatish mumkin.
- 50 ta muvaffaqiyatsiz admin login urinishi hech qayerda qayd etilmaydi.
<details> <summary>💡 Javobni ko'rish</summary>
- A02 Security Misconfiguration (ortiqcha ma'lumot beruvchi xato xabarlari).
- A01 Broken Access Control (vertikal huquq; API'da — API5:2023 BFLA).
- A10 Mishandling of Exceptional Conditions (istisno holatda "fail-open").
- A03 Software Supply Chain Failures.
- A06 Insecure Design (biznes mantiq).
- 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>
| Kim | Amal | Resurs egasi | Kutilgan |
|---|---|---|---|
| A | GET | A | 200 |
| A | GET | B | 404 (yoki 403), B ma'lumoti yo'q |
| A | PATCH | B | 404/403, B manzili o'zgarmagan |
| A | DELETE | B | 404/403, B manzili joyida |
| Tokensiz | GET | A | 401 |
| Admin | GET | B | Siyosatga ko'ra: 200 (agar adminga ruxsat bo'lsa) |
| A | GET | mavjud bo'lmagan ID | 404 (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>
- 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.
- **
X-Powered-By: Express** — texnologiya oshkor qilinmoqda (past jiddiylik, A02). - Yo'q header'lar:
Strict-Transport-Security,X-Content-Type-Options: nosniff,Content-Security-Policy(API uchun hamframe-ancestors),Referrer-Policy. 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>
- Bir foydalanuvchi bir kodni ikkinchi buyurtmada ishlatadi → rad etiladi.
- Bir buyurtmaga ikki xil promo-kod (UI orqali va API orqali) → faqat bittasi.
- Minimal summaga yetgandan keyin kod qo'llanib, so'ng savatdan mahsulot olib tashlanadi → chegirma qayta hisoblanadi yoki olib tashlanadi.
- Muddati o'tgan kod → rad etiladi; vaqt zonasi chegarasida (Asia/Tashkent, 23:59/00:00) xatti-harakat to'g'ri.
- Bir xil kod bilan ikki buyurtma bir vaqtda (parallel) yuboriladi → faqat bittasida qo'llanadi.
- Buyurtma bekor qilinganda kod qaytariladimi — talabda yozilgan qoidaga mosmi.
- 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>
| Ball | Baho |
|---|---|
| 0.0 | None |
| 3.9 | Low |
| 4.0 | Medium |
| 7.1 | High |
| 8.9 | High |
| 9.3 | Critical |
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}
- OWASP Top 10:2025
- OWASP Top 10 — loyiha sahifasi
- OWASP API Security Top 10 — 2023
- OWASP MASVS
- OWASP MASTG
- OWASP Web Security Testing Guide (WSTG)
- OWASP ASVS
- OWASP Cheat Sheet — Insecure Direct Object Reference Prevention
- OWASP Cheat Sheet — Authorization
- OWASP Cheat Sheet — Authentication
- OWASP Cheat Sheet — Session Management
- OWASP Cheat Sheet — HTML5 Security
- OWASP Cheat Sheet — SQL Injection Prevention
- OWASP Cheat Sheet — Cross Site Scripting Prevention
- OWASP Cheat Sheet — HTTP Headers
- OWASP Cheat Sheet — Mass Assignment
- OWASP Cheat Sheet — File Upload
- OWASP Cheat Sheet — Error Handling
- OWASP Cheat Sheet — Logging
- OWASP Cheat Sheet — Vulnerability Disclosure
- MDN — Content-Security-Policy
- MDN — Strict-Transport-Security
- MDN — CORS
- FIRST — CVSS v4.0 Specification
- FIRST — CVSS v4.0 Calculator
- ZAP — Baseline Scan
- zaproxy/action-baseline — GitHub
- npm audit
- Google OSV-Scanner
- GitHub — Dependabot
- PCI SSC FAQ — sensitive authentication data
- RFC 9116 — security.txt
- OWASP Juice Shop — GitHub
- PortSwigger Web Security Academy
- O'zbekiston Respublikasi Jinoyat kodeksi — lex.uz