Output encoding — bu ko'p dasturchilar yetarli e'tibor bermaydigan, lekin xavfsizlik uchun nihoyatda muhim mavzu. Asosiy g'oya oddiy: foydalanuvchidan kelgan ma'lumotni qaytadan chiqarganda, uni shu kontekst uchun to'g'ri formatlash kerak. HTML ichida HTML encoding, JavaScript ichida JavaScript encoding, URL ichida URL encoding. Bu farqlarni bilmaslik eng katta XSS zaifliklariga olib keladi.
HTML kontekstida encoding
Eng ko'p uchraydigan holat — foydalanuvchi kiritgan matnni HTML sahifaga chiqarish. PHP'da buning uchun htmlspecialchars() funksiyasi ishlatiladi. Lekin uni to'g'ri ishlatish kerak: htmlspecialchars($matn, ENT_QUOTES | ENT_HTML5, 'UTF-8'). ENT_QUOTES bayrog'i ham bir tirnoq, ham qo'sh tirnoqni encode qiladi. ENT_HTML5 zamonaviy HTML standartiga mos. 'UTF-8' kodlash xavfsizligi uchun. Agar siz faqat htmlspecialchars($matn) yozsangiz, bir tirnoqlar encode qilinmaydi va attribute kontekstida zaiflik bo'ladi.
JavaScript kontekstida encoding
Ba'zan PHP dan JavaScript'ga qiymat o'tkazish kerak bo'ladi. Misol uchun, <script>var ism = "$ism";</script> ko'rinishida. Bu yerda htmlspecialchars() yetarli emas — chunki JavaScript kontekstida \\ va \\n kabi belgilar boshqacha ma'no beradi. To'g'ri usul — json_encode() ishlatish: <script>var ism = <?= json_encode($ism, JSON_HEX_TAG | JSON_HEX_AMP) ?>;</script>. json_encode avtomatik barcha xavfli belgilarni xavfsiz formatga o'tkazadi va string'ni qo'sh tirnoq bilan o'rab qaytaradi.
URL kontekstida encoding
URL'ga parametr qo'shganda urlencode() yoki rawurlencode() ishlatish kerak. Misol uchun, qidiruv natijasi sahifasiga link berish: <a href="search.php?q=<?= urlencode($q) ?>">. Bu funksiya & = ? # kabi maxsus belgilarni xavfsiz formatga o'tkazadi. Agar urlencode ishlatmasa, hujumchi q parametriga "&admin=1" qo'shib admin huquqlarini olishi mumkin.
Content Security Policy — qo'shimcha qatlam
CSP — bu brauzerga "shu sahifada faqat shu manbalardan ma'lumot yuklash mumkin" deb aytish usuli. CSP header'i orqali siz JavaScript faqat o'z domeningizdan, rasm faqat ma'lum CDN'dan, style faqat inline ruxsat berilgan deb belgilashingiz mumkin. Hatto XSS zaiflik bo'lsa ham, CSP hujumchining tashqi script yuklashiga to'sqinlik qiladi. Misol: Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-RANDOM'; style-src 'self' 'unsafe-inline'.
DOM-based XSS — alohida tur
Ba'zan XSS server kodida emas, balki JavaScript kodida bo'ladi. Misol uchun, document.write(location.hash) yoki innerHTML = userInput. Bu DOM-based XSS deyiladi va server tomonidan ko'rinmaydi. Himoya — JavaScript'da ham har doim xavfsiz funksiyalardan foydalanish: textContent (innerHTML o'rniga), createElement (document.write o'rniga), encodeURIComponent (raw URL o'rniga).
Template engine'lar avtomatik encoding
Zamonaviy template engine'lar (Twig, Blade, Smarty) avtomatik HTML encoding qiladi. Bu juda qulay — siz {{ $matn }} yozsangiz, u avtomatik xavfsiz chiqadi. Lekin diqqat: agar siz {{ $matn | raw }} yoki {!! $matn !!} yozsangiz, encoding o'chiriladi. Bu xavfli funksiyalarni faqat ishonchli ma'lumotlar uchun ishlatish kerak.
Sayt.uz amaliyot
Sayt.uz platformasida barcha foydalanuvchi kiritgan ma'lumotlar chiqishdan oldin htmlspecialchars() bilan filtrlanadi. JSON javoblarda json_encode ishlatiladi. URL parametrlarida urlencode qo'llaniladi. Content Security Policy header'lari faollashtirilgan. Saytingizni Sayt.uz hostingda joylashtirib, server darajasidagi qo'shimcha himoya qatlamlaridan foydalanishingiz mumkin. Domen ro'yxati va SSL sertifikat ham mavjud.