Clickjacking nima va saytni undan qanday himoya qilish kerak
Asoslar3 daqInnovialabs tahririyati
Qisqacha
Clickjacking — saytingiz qopqon ustidagi ko‘rinmas iframe’ga yuklanadi va foydalanuvchi boshqa narsani bosyapman deb sizning tugmangizni bosadi. Himoya — CSP frame-ancestors va X-Frame-Options sarlavhalari bilan sahifalarni joylashtirishni taqiqlash.
Qisqa javob
Clickjacking («bosishni ushlab olish») — hujumchi saytingizni o‘z sahifasidagi shaffof iframe’ga yuklab, uni «Sovg‘ani olish» yoki «Reklamani yopish» kabi zararsiz tugma ustiga aniq joylashtiradigan hujum.
Foydalanuvchi qopqonni ko‘radi, lekin aslida saytingizning ko‘rinmas tugmasini bosadi. Agar u shu paytda saytingizda avtorizatsiyadan o‘tgan bo‘lsa, amal uning nomidan — barcha huquqlari va cookie’lari bilan bajariladi.
Texnik jihatdan qanday ko‘rinadi
Hujumchi sahifasida taxminan quyidagicha kod bo‘ladi:
<button style="position:absolute; top:200px; left:150px">Sovg‘ani olish</button>
<iframe src="https://example.com/settings"
style="opacity:0; position:absolute; top:0; left:0; width:800px; height:600px; z-index:2">
</iframe>
Iframe to‘liq shaffof (opacity:0) va tugmadan yuqorida (z-index) joylashgan. Koordinatalar shunday tanlanganki, «Sovg‘ani olish» ostida, masalan, «Hisobni o‘chirish» yoki «Tasdiqlash» tugmasi turadi.
CSRF himoyasi bu yerda yordam bermaydi: so‘rov sizning saytingizdan, haqiqiy seans ichida, haqiqiy tokenlar bilan yuboriladi.
Real zarar ssenariylari
- Sozlamalarni o‘zgartirish: profilni ommaviy qilish, xavfsizlik bildirishnomalarini o‘chirish.
- Amallarni tasdiqlash: o‘tkazma, bir bosishda xarid, pullik obuna.
- Ruxsat berish: kamera yoki mikrofonga kirish, hisobga uchinchi tomon ilovasini ulash.
- Layk va obunalar: foydalanuvchi nomidan ijtimoiy amallarni sun’iy oshirish.
- Ma’lumotlarni o‘chirish: bitta tasdiqli «O‘chirish» tugmalari.
Bir-ikki bosish muhim amalga olib keladigan sahifalar eng zaif hisoblanadi.
Qanday himoyalanish kerak
Asosiy qoida: sahifa brauzerga uni begona freymlarga joylashtirish mumkinmi yoki yo‘qligini o‘zi aytadi. Buning uchun ikkita javob sarlavhasi bor.
| Sarlavha | Qiymat | Nima qiladi |
|---|---|---|
Content-Security-Policy | frame-ancestors 'none' | Hamma joyda joylashtirishni taqiqlaydi |
Content-Security-Policy | frame-ancestors 'self' | Faqat o‘z domeningizda ruxsat beradi |
Content-Security-Policy | frame-ancestors 'self' https://partner.example | O‘z domeningiz va aniq ro‘yxat |
X-Frame-Options | DENY yoki SAMEORIGIN | Eski brauzerlar uchun eski sarlavha |
CSP frame-ancestors — zamonaviy va moslashuvchan variant. Moslik uchun X-Frame-Optionsni ham qo‘shimcha yuboring. Ikkalasi berilgan bo‘lsa, zamonaviy brauzerlar frame-ancestorsga amal qiladi.
Nginx uchun misol:
add_header Content-Security-Policy "frame-ancestors 'self'" always;
add_header X-Frame-Options "SAMEORIGIN" always;
Next.js uchun next.config.jsdagi misol:
module.exports = {
async headers() {
return [{
source: '/(.*)',
headers: [
{ key: 'Content-Security-Policy', value: "frame-ancestors 'self'" },
{ key: 'X-Frame-Options', value: 'SAMEORIGIN' },
],
}];
},
};
Muhim: frame-ancestors <meta> tegida ishlamaydi, faqat HTTP-sarlavha sifatida.
Muhim amallar uchun qo‘shimcha choralar:
- Qayta tasdiqlash: hisobni o‘chirish va o‘tkazmalardan oldin parol yoki kod so‘rash.
- Seans cookie’lariga
SameSite=LaxyokiStrictatributi — shunda brauzer ularni begona saytdagi freym ichida yubormaydi.
Sahifani joylashtirib bo‘lmasligini qanday tekshirish kerak
- Sarlavhalar: DevTools’ni oching, Network yorlig‘ida hujjatni tanlang va
frame-ancestorsliContent-Security-PolicyhamdaX-Frame-Optionsborligini tekshiring. Yokicurl -I https://saytingizbuyrug‘ini bajaring. - Amaliy test:
<iframe src="https://saytingiz">bilan lokal HTML-fayl yarating va uni brauzerda oching. Sayt o‘rnida bo‘sh joy yoki xato ko‘rinishi, konsolda esaframe-ancestorssababli bloklangani haqida xabar chiqishi kerak. - Faqat bosh sahifani emas, sozlamalar, to‘lov va admin sahifalarini ham tekshiring — sarlavhalar ba’zan hamma marshrutlar uchun berilmaydi.
Ko‘p uchraydigan xatolar
- Faqat bosh sahifani himoyalab, shaxsiy kabinetni sarlavhasiz qoldirish.
frame-ancestorsni<meta>orqali berishga urinish.- JavaScript’dagi «freymdan chiqish» skriptlariga tayanish — ularni chetlab o‘tish mumkin.
- Qandaydir vidjet ishlashi uchun «har ehtimolga qarshi»
frame-ancestors *qo‘yish.