Asosiy kontentga o‘tish
Innovialabs

Clickjacking nima va saytni undan qanday himoya qilish kerak

Asoslar3 daq

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.

SarlavhaQiymatNima qiladi
Content-Security-Policyframe-ancestors 'none'Hamma joyda joylashtirishni taqiqlaydi
Content-Security-Policyframe-ancestors 'self'Faqat o‘z domeningizda ruxsat beradi
Content-Security-Policyframe-ancestors 'self' https://partner.exampleO‘z domeningiz va aniq ro‘yxat
X-Frame-OptionsDENY yoki SAMEORIGINEski 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=Lax yoki Strict atributi — shunda brauzer ularni begona saytdagi freym ichida yubormaydi.

Sahifani joylashtirib bo‘lmasligini qanday tekshirish kerak

  1. Sarlavhalar: DevTools’ni oching, Network yorlig‘ida hujjatni tanlang va frame-ancestorsli Content-Security-Policy hamda X-Frame-Options borligini tekshiring. Yoki curl -I https://saytingiz buyrug‘ini bajaring.
  2. 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 esa frame-ancestors sababli bloklangani haqida xabar chiqishi kerak.
  3. 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.

Ko‘p beriladigan savollar

Xavf pastroq, lekin sarlavhani baribir qo‘shing: bu konfiguratsiyadagi bitta qator, sayt esa vaqt o‘tib formalar, to‘lov yoki kirish imkoniyatiga ega bo‘lishi mumkin.

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.