Mundarija (39)
- Bu darsda
- 1. Nega bu kerak?
- 2. Asosiy qoida: brauzerga ishonmang
- 2.1 required ni 5 soniyada o'chirish
- 2.2 Formasiz yuborish
- 2.3 Yashirin maydon ham o'zgaradi
- 2.4 Unda brauzer validatsiyasi nima uchun kerak?
- 3. Yo'l xavfsizligi: HTTPS va to'g'ri metod
- 3.1 Forma faqat HTTPS orqali
- 3.2 Maxfiy ma'lumot GET bilan yuborilmaydi
- 4. autocomplete="off": xavfsizlik afsonasi
- 5. Botlarga qarshi: honeypot
- 5.1 G'oya
- 5.2 HTML'da
- 5.3 Server nima qiladi
- 5.4 Cheklovi
- 6. CAPTCHA
- 6.1 Nima u
- 6.2 Cloudflare Turnstile'ni ulash
- 6.3 U qanday ishlaydi
- 7. Rate limit: oldindan tanishuv
- 8. CSRF: oldindan tanishuv
- 8.1 Hujum
- 8.2 Himoya g'oyasi
- 9. Hujumchi nigohi
- «Bahor» formasiga qo'shilgan himoya
- 10. Ko'p uchraydigan xatolar
- 10.1 "Brauzerda required bor — yetarli"
- 10.2 Maxfiy kalit HTML'da
- 10.3 Honeypot type="hidden" bilan
- 10.4 Honeypot halol mehmonni ham ushlaydi
- 10.5 Login formasi GET bilan
- 11. Mashqlar
- 1-mashq (oson): Xavfli formani toping
- 2-mashq (o'rta): Obuna formasiga honeypot
- 3-mashq (qiyin): Fikr formasi uchun himoya rejasi
- 12. Real ishda
- Xulosa
- Manbalar
HTML forma xavfsizligi: spam, botlar va hujumlardan himoya
Qisqacha: Har bir forma — saytga ochilgan eshik: undan odamlar ham, botlar ham, hujumchilar ham kiradi. Minimal himoya: forma HTTPS orqali va maxfiy ma'lumot uchun POST bilan yuboriladi, botlarga qarshi honeypot maydon va kerak bo'lsa CAPTCHA (masalan, Cloudflare Turnstile) qo'yiladi. Eng muhim qoida: brauzerdagi tekshiruv faqat qulaylik uchun — har bir qiymat serverda qaytadan tekshiriladi.
Bu darsda
- Nega brauzer validatsiyasi himoya emasligini o'z qo'lingiz bilan ko'rsatib bera olasiz.
- Formani HTTPS va to'g'ri metod bilan yuborasiz, maxfiy ma'lumotni URL'ga chiqarmaysiz.
- Honeypot maydon qo'yasiz va CAPTCHA turlarini tanlay olasiz.
- CSRF va rate limit g'oyasini tushuntira olasiz.
autocomplete="off"haqidagi afsonalarni ajratasiz.
Oldin bilishingiz kerak: Qulay va accessible forma, HTTPS va TLS, Maydon holatlari va yashirin maydonlar, Brauzer validatsiyasi.
1. Nega bu kerak?
O'tgan darsda «Bahor» choyxonasining bron formasini tugatdik. Sayt internetga chiqdi. Ertasi kuni ertalab choyxona egasi Jasur aka 340 ta yangi bronni ko'radi. Hammasi tungi soat 2 dan 4 gacha kelgan. Ismlar — "asdfgh", izohlarda — kazino havolalari, mehmonlar soni — 500.
Bu ishni odam qilmagan. Bot — internetdagi formalarni o'zi topib, o'zi to'ldiradigan dastur — qilgan. Botlar hamma saytni tinmay aylanib yuradi. Sayt qanchalik kichik bo'lmasin, ular formangizni bir necha kunda topadi.
Botdan tashqari maqsadli hujumchilar ham bor. Ular formangizdagi zaif joyni ataylab qidiradi. Bu darsda ikkalasiga qarshi HTML tomonidagi himoyani quramiz. Serverdagi qismini esa g'oya darajasida ko'ramiz — backend qismida to'liq o'rganamiz.
2. Asosiy qoida: brauzerga ishonmang
2.1 required ni 5 soniyada o'chirish
Brauzer validatsiyasi darsida required, min, max va pattern ni o'rgandik. Ular qanchalik kuchli? Sinab ko'ramiz:
- Bron formasini brauzerda oching.
- "Mehmonlar soni" maydoniga sichqonchaning o'ng tugmasini bosib, Inspect ni tanlang.
- Elements panelida
max="20"ustiga ikki marta bosing va o'chiring. DevTools darsida atributni shunday tahrirlagan edik. - Maydonga
500yozib, formani yuboring.
Brauzer hech narsa demaydi. Forma serverga odam=500 ni yuboradi. Hujumchi uchun required ham, maxlength ham, pattern ham — shunchaki o'chiriladigan matn.
2.2 Formasiz yuborish
Undan ham oddiyroq usul bor: brauzer umuman kerak emas. HTTP so'rov — bu matnli xabar. Uni terminaldan istalgan dastur yuboradi:
curl https://example.com/bron \
-d "ism=" -d "odam=500" -d "sana=1999-01-01"Windows PowerShell'da curl o'rniga curl.exe yozing. -d — "shu name=value juftlikni so'rov tanasida yubor" degani. -d bor bo'lsa, curl so'rovni avtomatik POST qiladi. Server buni oddiy forma yuborishidan ajrata olmaydi. Botlar ham aynan shunday ishlaydi — ular sahifani ko'rmaydi, faqat so'rov yuboradi.
Maslahat:
example.com— namuna manzil, u bu so'rovga405(metodga ruxsat yo'q) javobini beradi. Haqiqiy loyihangizda buni faqat o'z saytingizda sinang. Begona saytga bunday so'rovlar yuborish — qonun buzilishi bo'lishi mumkin.
2.3 Yashirin maydon ham o'zgaradi
Maydon holatlari darsida type="hidden" maydonni ko'rgan edik. U ekranda ko'rinmaydi — lekin Elements panelida ko'rinadi va tahrirlanadi.
<!-- ❌ narxni brauzerdan olish -->
<form action="https://example.com/buyurtma" method="post">
<input type="hidden" name="taom" value="osh">
<input type="hidden" name="narx" value="35000">
<button type="submit">Oshga buyurtma berish</button>
</form>Hujumchi 35000 ni 1 ga o'zgartiradi va bir so'mga osh buyurtma qiladi. Server narx ni ishonib olsa — choyxona zarar ko'radi.
To'g'ri yo'l: brauzer faqat nima tanlanganini yuboradi (taom=osh). Narxni server o'z bazasidan oladi. Brauzerdan kelgan har qanday son, narx yoki huquq — shunchaki "iltimos", buyruq emas.
2.4 Unda brauzer validatsiyasi nima uchun kerak?
| Brauzerdagi tekshiruv | Serverdagi tekshiruv | |
|---|---|---|
| Kim uchun | Halol mehmon | Hamma, jumladan hujumchi |
| Vazifasi | Tez yordam, qulaylik | Xavfsizlik va to'g'ri ma'lumot |
| Chetlab o'tsa bo'ladimi | Ha, bir necha soniyada | Yo'q |
| Majburiymi | Tavsiya etiladi | Har doim |
Brauzer tekshiruvi — mehmonga "raqamni to'liq yozmadingiz" deb darhol aytadigan yordamchi. Serverdagi tekshiruv — eshikdagi qo'riqchi. Biri ikkinchisining o'rnini bosmaydi.
Tekshirib ko'ring: Bron formasida
maxlength="200"bor. Server izohni 200 belgidan uzunligini tekshirishi kerakmi?
Javob
Ha. maxlength ni DevTools'da o'chirish yoki curl bilan 10 megabaytlik izoh yuborish mumkin. Server tekshirmasa, bazani keraksiz ma'lumot bilan to'ldirish yoki serverni sekinlashtirish mumkin. HTML'dagi har bir cheklov serverda takrorlanadi.
3. Yo'l xavfsizligi: HTTPS va to'g'ri metod
3.1 Forma faqat HTTPS orqali
HTTPS va TLS darsida ko'rdik: HTTP'da ma'lumot ochiq matn bo'lib ketadi. Kafedagi umumiy Wi-Fi'da o'tirgan boshqa odam uni o'qiy oladi. HTTPS esa uni shifrlaydi.
Forma uchun ikki joy muhim:
- Sahifaning o'zi HTTPS'da ochilsin. Parol maydoni bor sahifa HTTP'da bo'lsa, brauzer manzil qatorida "Not secure" (xavfsiz emas) deb ogohlantiradi.
actionmanzili hamhttps://bilan boshlansin. Sahifa HTTPS'da bo'lsa-yu, formahttp://manzilga yuborilsa, Chrome yuborishdan oldin ogohlantirish oynasini chiqaradi.
<!-- ❌ ma'lumot ochiq ketadi -->
<form action="http://example.com/bron" method="post"><!-- ✅ -->
<form action="https://example.com/bron" method="post">Bugun bepul sertifikat (Let's Encrypt) va hostinglar HTTPS'ni avtomatik beradi. HTTP'da forma qoldirishga hech qanday sabab yo'q.
3.2 Maxfiy ma'lumot GET bilan yuborilmaydi
Forma qanday ishlaydi darsida ko'rgandik: method="get" maydonlarni URL'ga qo'shadi. Login formasi GET bilan yuborilsa, manzil shunday bo'ladi:
https://example.com/kirish?telefon=998900000000&parol=Bahor2026HTTPS bu URL'ni yo'lda shifrlaydi. Lekin muammo yo'lda emas — URL ko'p joyda saqlanib qoladi:
- brauzer tarixida — kompyuterdan keyin foydalangan har kim ko'radi;
- server va proksi loglarida — oddiy matn fayllarda;
- boshqa saytga o'tilganda
Referersarlavhasida (HTTP sarlavhalari); - ekran rasmida yoki havolani "ulashish" paytida.
Qoida: parol, karta raqami, SMS kodi va umuman shaxsiy ma'lumot — faqat method="post". GET — qidiruv va filtr kabi, URL'da ko'rinishi zarar qilmaydigan narsalar uchun.
Tekshirib ko'ring: Choyxona menyusidagi qidiruv formasi (
?q=osh) qaysi metod bilan yuboriladi?
Javob
GET. Qidiruv so'zi maxfiy emas, aksincha — URL'da bo'lgani yaxshi: natijani saqlash va do'stga yuborish mumkin. Maxfiylik yo'q joyda GET to'g'ri tanlov.
4. autocomplete="off": xavfsizlik afsonasi
autocomplete darsida avtoto'ldirishni o'rgandik. Ba'zi dasturchilar "xavfsizlik uchun" hamma joyga autocomplete="off" yozadi. Bu nima uchun afsona:
- Hujumchi sizning brauzeringizdan foydalanmaydi. U curl yoki bot bilan so'rov yuboradi — avtoto'ldirish unga umuman ta'sir qilmaydi.
- Brauzerlar ko'p holatda bu buyruqni e'tiborsiz qoldiradi. Login va parol maydonlarida parol menejeri baribir ishlaydi. Bu ataylab qilingan: parol menejerlari xavfsizlikni oshiradi.
- Zarari bor. Parolni avtomatik saqlab bo'lmasa, odam "123456" kabi eslab qolish oson parol tanlaydi. Bu xavfsizlikni pasaytiradi.
autocomplete="off" o'rinli joylar ham bor: botlar uchun tuzoq maydon (keyingi bo'lim), CAPTCHA javobi va o'zingiz taklif ro'yxatini chiqaradigan maydon. SMS kodi uchun esa autocomplete="one-time-code" yaxshiroq — telefon kodni o'zi taklif qiladi.
Maslahat: Yana bir yaqin afsona — parol maydoniga nusxa qo'yishni (paste) taqiqlash. Bu JavaScript bilan qilinadi va parol menejerlarini buzadi. AQShning NIST parol yo'riqnomasi ham nusxa qo'yishga ruxsat berishni tavsiya qiladi.
5. Botlarga qarshi: honeypot
5.1 G'oya
Honeypot (asal idishi) — odam ko'rmaydigan, lekin bot to'ldiradigan tuzoq maydon. Ayiq asal idishiga o'zi keladi — bot ham bo'sh maydonni ko'rsa, uni to'ldirmay qolmaydi. Chunki oddiy bot sahifani ko'rmaydi, HTML'dagi hamma maydonni ketma-ket to'ldiradi.
Server qoidasi oddiy: tuzoq maydonda biror narsa bo'lsa — yuboruvchi bot.
5.2 HTML'da
<div class="asal-idish">
<label for="veb-sayt">Bu maydonni bo'sh qoldiring</label>
<input id="veb-sayt" name="veb_sayt" type="text"
tabindex="-1" autocomplete="off">
</div>Qatorma-qator:
class="asal-idish"— CSS bu blokni ekrandan chetga suradi. CSS'ni keyingi qismda o'rganamiz. Hozir bilish kifoya: blok HTML'da bor, ekranda yo'q.name="veb_sayt"— botlarga "jozibali" nom. Botlar "sayt", "url", "email" kabi maydonlarni albatta to'ldiradi.tabindex="-1"—Tabbosilganda fokus bu maydonga tushmaydi. Bu atributni Fokus va tahrir atributlari darsida to'liq ko'ramiz.autocomplete="off"— brauzer halol mehmon uchun bu maydonni o'zi to'ldirib qo'ymasin. Aks holda odam bot deb rad etiladi.label— ekran o'quvchi foydalanuvchisi maydonga duch kelsa, nima qilishni biladi.
Nega type="hidden" emas? Chunki botlar yashirin maydonlarni taniydi va ularga tegmaydi. hidden atributi ham shunday — u bot uchun ochiq belgi.
5.3 Server nima qiladi
Tuzoq to'lgan bo'lsa, server bronni saqlamaydi. Lekin xato ham qaytarmaydi — oddiy "Rahmat!" sahifasini ko'rsatadi. Aks holda bot muallifi tuzoqni sezib, uni chetlab o'tishni o'rganadi.
Honeypot'ning sherigi — vaqt tuzog'i. Server forma sahifasini bergan vaqtni yashirin maydonga yozadi. Forma 3 soniyadan tez yuborilsa — bu odam emas: odam 6 ta maydonni bunchalik tez to'ldira olmaydi.
5.4 Cheklovi
Honeypot "ko'r-ko'rona" ishlaydigan ommaviy botlarni to'xtatadi. Aynan sizning saytingizni nishonga olgan hujumchi tuzoqni osongina ko'radi. Shuning uchun u birinchi qatlam, yagona himoya emas.
Tekshirib ko'ring: Nega honeypot maydonga
autocomplete="off"qo'yish muhim?
Javob
Uning nomi veb_sayt — brauzer uni "sayt manzili" deb o'ylab, halol mehmon uchun avtomatik to'ldirib qo'yishi mumkin. Unda server odamni bot deb hisoblaydi va bron yo'qoladi. autocomplete="off" — autocomplete ning kam uchraydigan, lekin to'g'ri ishlatilishi.
6. CAPTCHA
6.1 Nima u
CAPTCHA — "kompyuter va odamni ajratadigan avtomatik test" degan inglizcha iboraning qisqartmasi. Siz uni ko'rgansiz: "Men robot emasman" belgisi yoki "svetoforli rasmlarni tanlang".
| Xizmat | Qanday ishlaydi | E'tibor bering |
|---|---|---|
| reCAPTCHA v2 (Google) | Belgi, ba'zan rasmli jumboq | Jumboq ko'zi ojiz va keksalar uchun qiyin |
| reCAPTCHA v3 (Google) | Ko'rinmas, 0.0–1.0 ball beradi | Chegara ballni server tanlaydi |
| hCaptcha | reCAPTCHA'ga o'xshash | Maxfiylikka ko'proq e'tibor |
| Cloudflare Turnstile | Ko'pincha hech narsa so'ramaydi | Bepul, Cloudflare hostingi shart emas |
Har qanday CAPTCHA'ning narxi bor. Rasmli jumboq halol mehmonni ham qiynaydi va accessibility'ni buzadi. Google xizmatlari foydalanuvchini kuzatadi, degan maxfiylik savoli ham bor. Shuning uchun bugun ko'p loyihalar ko'rinmas yoki deyarli ko'rinmas usulni tanlaydi.
6.2 Cloudflare Turnstile'ni ulash
Turnstile — Cloudflare kompaniyasining bepul CAPTCHA xizmati. Odatda mehmondan hech narsa so'ramaydi: brauzerni fonda tekshiradi va "Muvaffaqiyatli" deb belgi qo'yadi. Uni saytga qo'shish uchun Cloudflare panelidan ikki kalit olinadi:
- sayt kaliti (sitekey) — ochiq, HTML'ga yoziladi;
- maxfiy kalit (secret key) — faqat serverda saqlanadi, hech qachon HTML'ga yozilmaydi.
HTML qismi:
<form action="https://example.com/bron" method="post">
<!-- ... bron maydonlari ... -->
<div class="cf-turnstile"
data-sitekey="1x00000000000000000000AA"></div>
<button type="submit">Stolni band qilish</button>
</form>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js"
async defer></script>scriptqatori Cloudflare'ning dasturini sahifaga ulaydi. Skriptlarni Skriptlarni ulash darsida o'rganamiz.div class="cf-turnstile"— vidjet shu joyda chiziladi. Dastur uni aynan shuclassnomi bo'yicha topadi.data-sitekey— sayt kaliti. Yuqoridagi1x00000000000000000000AA— Cloudflare'ning sinov kaliti: u doim "o'tdi" deydi. O'rganish uchun qulay. Haqiqiy saytda o'zingizning kalitingiz yoziladi.
6.3 U qanday ishlaydi
- Mehmon sahifani ochadi. Turnstile brauzerni fonda tekshiradi.
- Tekshiruvdan o'tsa, formaga o'zi yashirin maydon qo'shadi:
name="cf-turnstile-response", qiymati — uzun token (bir martalik ruxsatnoma). - Forma yuborilganda token boshqa maydonlar bilan birga serverga ketadi.
- Server tokenni o'zining maxfiy kaliti bilan Cloudflare'ga yuborib so'raydi: "Bu token haqiqiymi?".
- Cloudflare "ha" yoki "yo'q" deydi. "Yo'q" bo'lsa, bron saqlanmaydi.
Token 5 daqiqa amal qiladi va faqat bir marta tekshiriladi. Serverdagi qismini CAPTCHA va bot himoyasi darsida yozamiz.
Diqqat: 4-qadamni unutish — eng xavfli xato. Vidjet sahifada turibdi, lekin server tokenni tekshirmasa, bot vidjetni shunchaki chetlab o'tadi. U curl bilan tokensiz so'rov yuboradi — va server qabul qiladi. CAPTCHA faqat serverdagi tekshiruv bilan himoya.
7. Rate limit: oldindan tanishuv
Bot bitta so'rov emas, minglab so'rov yuboradi. Server bunga rate limit (tezlik chegarasi) bilan javob beradi: bitta manzildan ma'lum vaqtda faqat ma'lum miqdorda so'rov qabul qilinadi. Xuddi bankomat kabi: PIN-kodni 3 marta xato tersangiz, karta bloklanadi.
«Bahor» uchun misol qoidalar:
- bitta telefon raqamidan — soatiga 3 ta bron;
- bitta IP manzildan — daqiqasiga 10 ta so'rov;
- login formasida — 5 ta xato paroldan keyin 15 daqiqa kutish.
Chegaradan oshgan so'rovga server 429 Too Many Requests ("juda ko'p so'rov") status kodini qaytaradi. Bu butunlay server ishi, HTML'da hech narsa yozilmaydi. Batafsil — Rate limiting darsida.
Rate limit ayniqsa SMS yuboradigan formalarda muhim. Har bronga tasdiqlash SMS'i ketsa, bot minglab begona raqamlarga SMS yubortiradi. Har bir SMS uchun esa choyxona pul to'laydi.
8. CSRF: oldindan tanishuv
8.1 Hujum
Malika «Bahor» saytiga kirgan: sayt uni cookie orqali eslab qolgan (HTTP sarlavhalari va cookie darsida ko'rgandik). Keyin u Telegram'dan kelgan "Bepul osh yutib oling!" havolasini ochadi. U sahifada shunday forma bor:
<!-- ❌ hujumchining sahifasi (boshqa sayt) -->
<form action="https://example.com/bron/bekor"
method="post">
<input type="hidden" name="bron_id" value="1024">
<button type="submit">Sovg'ani olish</button>
</form>Malika tugmani bosadi. Forma «Bahor» saytiga yuboriladi. Brauzer so'rovga «Bahor» cookie'sini o'zi qo'shib yuboradi. Server "Malika bronini bekor qildi" deb o'ylaydi.
Bu — CSRF (Cross-Site Request Forgery): "saytlararo so'rovni qalbakilashtirish". Hujumchi sizning nomingizdan, sizning brauzeringiz orqali so'rov yuboradi.
8.2 Himoya g'oyasi
Asosiy himoya — CSRF token: server har bir formaga o'zi yaratgan tasodifiy maxfiy qiymatni yashirin maydon qilib qo'yadi.
<input type="hidden" name="csrf_token"
value="q8Zr1vN4cXk2pT7wL0aE">Server so'rov kelganda tokenni tekshiradi. Hujumchining sahifasi bu tokenni bilmaydi va o'qiy olmaydi. Same-Origin Policy boshqa saytning sahifasini o'qishga ruxsat bermaydi. Tokensiz so'rov esa rad etiladi.
Ikkinchi qatlam — cookie'ning SameSite sozlamasi. U brauzerga "bu cookie'ni boshqa saytdan kelgan so'rovga qo'shma" deydi. Ikkalasi ham server tomonida sozlanadi — Tokenni qayerda saqlash va CSRF darsida. Zamonaviy freymvorklar CSRF token maydonini formaga avtomatik qo'shadi.
Tekshirib ko'ring: CSRF hujumida hujumchi Malikaning parolini bilishi shartmi?
Javob
Yo'q. Hujumning hiylasi shunda: parolni bilish shart emas. Malika allaqachon kirgan, brauzer cookie'ni o'zi yuboradi. Hujumchi faqat so'rovni "Malikaning qo'li bilan" jo'natadi. Shuning uchun server "so'rov haqiqatan ham o'z sahifamdan keldimi?" ekanini token bilan tekshiradi.
9. Hujumchi nigohi
Endi o'zimizni hujumchi o'rniga qo'yamiz va «Bahor» formasini "buzishga" urinamiz:
| Hujum | Qanday | Himoya |
|---|---|---|
| Spam botlar | Minglab soxta bron | Honeypot, vaqt tuzog'i, Turnstile |
| Validatsiyani chetlash | max ni o'chirish, curl |
Serverda qayta tekshirish |
| Yashirin maydonni o'zgartirish | narx=1 |
Muhim qiymatni server o'zi hisoblaydi |
| Tokenni tekshirmaslik | Vidjetsiz so'rov | Server tokenni Cloudflare'da tekshiradi |
| Ko'p so'rov, SMS pumping | Bitta manzildan oqim | Rate limit |
| CSRF | Begona saytdagi forma | CSRF token, SameSite cookie |
| Izohga kod yozish | <script> izohda |
Chiqarishda ekranlash |
Oxirgi qatorga alohida to'xtalamiz. Hujumchi izohga <script>...</script> yozadi. Admin panel izohni HTML sifatida chiqarsa, bu kod menejerning brauzerida ishlaydi. Bu XSS deb ataladi. Himoya — server izohni sahifaga chiqarishda < ni < ga aylantiradi. Maxsus belgilar va entitylar darsidagi usul. To'liq — HTML darajasidagi xavfsizlik darsida.
Yana bitta himoya — kam ma'lumot yig'ish. O'tgan darsda familiya, email va tug'ilgan sanani olib tashlagan edik. Yig'ilmagan ma'lumot o'g'irlanmaydi ham.
Bu himoyalar qatlam-qatlam ishlaydi. Honeypot oddiy botni, Turnstile aqlliroq botni, rate limit oqimni, server tekshiruvi esa qolgan hamma narsani to'xtatadi. Bittasi yorilsa, keyingisi ushlaydi.
«Bahor» formasiga qo'shilgan himoya
O'tgan darsdagi formaga faqat uchta bo'lak qo'shiladi:
<!DOCTYPE html>
<html lang="uz">
<head>
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width, initial-scale=1">
<title>Stol band qilish — Choyxona «Bahor»</title>
</head>
<body>
<main>
<h1>Stol band qilish</h1>
<form action="https://example.com/bron"
method="post">
<input type="hidden" name="csrf_token"
value="q8Zr1vN4cXk2pT7wL0aE">
<div>
<label for="ism">Ismingiz</label>
<input id="ism" name="ism" type="text"
autocomplete="name"
required maxlength="50">
</div>
<!-- ... qolgan maydonlar o'tgan darsdagidek ... -->
<div class="asal-idish">
<label for="veb-sayt">Bu maydonni bo'sh qoldiring</label>
<input id="veb-sayt" name="veb_sayt" type="text"
tabindex="-1" autocomplete="off">
</div>
<div class="cf-turnstile"
data-sitekey="1x00000000000000000000AA"></div>
<button type="submit">Stolni band qilish</button>
</form>
</main>
<script
src="https://challenges.cloudflare.com/turnstile/v0/api.js"
async defer></script>
</body>
</html>csrf_token qiymatini har safar server yaratadi — bu yerda namuna. Kod html-validate dan xatosiz o'tadi.
10. Ko'p uchraydigan xatolar
10.1 "Brauzerda required bor — yetarli"
Eng keng tarqalgan va eng qimmat xato. Tuzatish: serverda har maydon uchun o'sha qoidani takrorlang: bo'sh emasmi, uzunligi, turi, chegarasi.
10.2 Maxfiy kalit HTML'da
<!-- ❌ -->
<div class="cf-turnstile" data-sitekey="..."
data-secret="0x4AAAAAAA..."></div>Sahifa kodi hammaga ochiq — Ctrl + U bilan ko'rinadi. Maxfiy kalit faqat serverda, muhit o'zgaruvchisida turadi. Sahifaga faqat sayt kaliti yoziladi.
10.3 Honeypot type="hidden" bilan
Botlar yashirin maydonlarni taniydi va to'ldirmaydi — tuzoq ishlamaydi. Tuzatish: oddiy type="text" maydon, CSS bilan ekrandan chetga surilgan.
10.4 Honeypot halol mehmonni ham ushlaydi
autocomplete="off" yo'q, nomi email — brauzer uni to'ldirib qo'yadi. Tuzatish: autocomplete="off", formadagi haqiqiy maydonlarga o'xshamaydigan nom va aniq label.
10.5 Login formasi GET bilan
method yozilmasa, standart qiymat — GET. Parol URL'ga chiqadi. Tuzatish: maxfiy ma'lumotli har formada method="post" ni aniq yozing.
11. Mashqlar
1-mashq (oson): Xavfli formani toping
Quyidagi login formasida ikkita xavfsizlik xatosi bor. Toping va tuzating.
<form action="http://example.com/kirish">
<label for="tel">Telefon</label>
<input id="tel" name="telefon" type="tel"
autocomplete="tel">
<label for="parol">Parol</label>
<input id="parol" name="parol" type="password"
autocomplete="current-password">
<button type="submit">Kirish</button>
</form>Eslatma: action manzilining boshiga va method atributiga qarang (method yozilmasa nima bo'lishini Forma qanday ishlaydi darsida ko'rgandik).
Yechim
http://— parol ochiq matn bo'lib ketadi.https://bo'lishi kerak.methodyo'q — standart GET, parol URL'ga, tarix va loglarga tushadi.method="post"kerak.
<form action="https://example.com/kirish" method="post">autocomplete="current-password" esa xato emas — aksincha, parol menejeri ishlashi uchun kerak.
2-mashq (o'rta): Obuna formasiga honeypot
Choyxonaning "Yangi taomlar haqida xabar oling" formasida bitta email maydoni bor. Unga honeypot maydon qo'shing. Nomini kompaniya qiling.
<form action="https://example.com/obuna" method="post">
<label for="email">Email manzilingiz</label>
<input id="email" name="email" type="email"
autocomplete="email" required>
<button type="submit">Obuna bo'lish</button>
</form>Maydonda to'rtta narsa bo'lsin: label, type="text", tabindex="-1" va .
Yechim
<form action="https://example.com/obuna" method="post">
<label for="email">Email manzilingiz</label>
<input id="email" name="email" type="email"
autocomplete="email" required>
<div class="asal-idish">
<label for="kompaniya">Bu maydonni bo'sh qoldiring</label>
<input id="kompaniya" name="kompaniya" type="text"
tabindex="-1" autocomplete="off">
</div>
<button type="submit">Obuna bo'lish</button>
</form>Maydon haqiqiy email maydonidan keyin, tugmadan oldin turibdi. Server: kompaniya bo'sh bo'lmasa — obunani saqlamaydi, lekin "Rahmat!" deb javob beradi.
3-mashq (qiyin): Fikr formasi uchun himoya rejasi
Choyxonada "Fikringizni qoldiring" formasi bor: ism, baho (1–5) va izoh. Izohlar keyinchalik saytning bosh sahifasida chiqadi.
- Hujumchi nigohi bilan kamida 4 ta hujumni yozing.
- Har biriga himoya yozing va u HTML'da yoki serverda ekanini belgilang.
- Formaning HTML'ini yozing: honeypot, CSRF token maydoni va Turnstile sinov kaliti bilan.
Yechim
| Hujum | Himoya | Qayerda |
|---|---|---|
| Spam botlar reklama yozadi | Honeypot + Turnstile | HTML + server |
baho=100 yoki baho=-5 |
Baho 1–5 ekanini tekshirish | Server |
Izohda <script> (XSS) |
Chiqarishda ekranlash | Server |
| Bitta odam 1000 ta fikr | Rate limit | Server |
| Begona saytdan yuborish | CSRF token | HTML + server |
Izoh bosh sahifada chiqqani uchun XSS bu yerda eng xavfli hujum. Uni har bir mehmon ko'radi.
<form action="https://example.com/fikr" method="post">
<input type="hidden" name="csrf_token"
value="serverdan-keladigan-qiymat">
<div>
<label for="ism">Ismingiz (ixtiyoriy)</label>
<input id="ism" name="ism" type="text"
autocomplete="name" maxlength="60">
</div>
<div>
<label for="baho">Baho (1 dan 5 gacha)</label>
<input id="baho" name="baho" type="number"
min="1" max="5" required>
</div>
<div>
<label for="izoh">Fikringiz</label>
<textarea id="izoh" name="izoh" rows="4"
maxlength="1000" required></textarea>
</div>
<div class="asal-idish">
<label for="veb-sayt">Bu maydonni bo'sh qoldiring</label>
<input id="veb-sayt" name="veb_sayt" type="text"
tabindex="-1" autocomplete="off">
</div>
<div class="cf-turnstile"
data-sitekey="1x00000000000000000000AA"></div>
<button type="submit">Fikr qoldirish</button>
</form>Sahifa oxiriga Turnstile skripti qo'shiladi — xuddi «Bahor» formasidagidek. min, max va maxlength — mehmon uchun qulaylik, server esa ularni qaytadan tekshiradi.
12. Real ishda
- Har bir ochiq forma — ro'yxatdan o'tish, aloqa, izoh, bron — ishga tushgan kuni botlarga duch keladi. Ko'p kompaniyalar honeypot va Turnstile'ni birinchi kundan qo'yadi.
- Freymvorklar (Next.js, NestJS — kursda o'rganamiz) CSRF himoyasi va rate limit uchun tayyor vositalarga ega. Lekin ularni yoqish va to'g'ri sozlash — dasturchi ishi.
- OWASP — veb-xavfsizlik bo'yicha xalqaro jamoa. Uning Top 10 ro'yxatida "Injection" va "Broken Access Control" doim bor. Ikkalasi ham ko'pincha formadan boshlanadi.
- SMS pumping — butun dunyoda keng tarqalgan hujum: SMS kod yuboradigan formaga hujum qilib, kompaniyani katta SMS hisobiga tushiradi. Shuning uchun SMS yuboradigan har forma rate limit va CAPTCHA bilan himoyalanadi.
- Intervyuda so'raladi: "Frontend validatsiya bor, backend'da tekshirish shartmi?" To'g'ri javob — "ha, har doim", va sababi curl misoli bilan.
Xulosa
- Brauzerdagi tekshiruv — qulaylik, himoya emas: DevTools va curl uni bir necha soniyada chetlab o'tadi.
- Muhim qiymatlar (narx, huquq) brauzerdan olinmaydi, server o'zi hisoblaydi.
- Forma faqat HTTPS orqali; maxfiy ma'lumot faqat POST bilan.
autocomplete="off"xavfsizlik bermaydi; u honeypot kabi tor holatlar uchun.- Botlarga qarshi qatlamlar: honeypot, vaqt tuzog'i, CAPTCHA (Turnstile) — token esa albatta serverda tekshiriladi.
- Rate limit va CSRF token — server himoyasi, lekin forma dizaynida hozirdan hisobga olinadi.
Keyingi dars: Zamonaviy forma imkoniyatlari — 2025–2026 yillarda brauzerlarga qo'shilgan yangi forma vositalari va ularni qachon ishlatish mumkinligini ko'ramiz.
Manbalar
- OWASP Cheat Sheet Series: "Cross-Site Request Forgery Prevention", "Input Validation" — cheatsheetseries.owasp.org
- Cloudflare: "Turnstile — Get started", "Testing" — developers.cloudflare.com/turnstile
- MDN: "Sending form data" (xavfsizlik bo'limi) va "Website security" — developer.mozilla.org
- NIST SP 800-63B: parol bo'yicha tavsiyalar — pages.nist.gov/800-63-4
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!