Output escaping — ishonchsiz ma’lumotni HTML, atribut, JavaScript, CSS yoki URL kabi chiqish kontekstida boshqaruv sintaksisi emas, oddiy data sifatida talqin qilinishini ta’minlaydigan kodlash jarayoni. Veb-ilovada u Cross-Site Scripting hujumiga qarshi asosiy nazoratlardan biridir. Escaping ma’lumot bazaga kirayotganda universal tarzda emas, aynan chiqarilayotgan sink va parser qoidalariga muvofiq bajariladi.
HTML matn konteksti
HTML element ichidagi matnda <, >, &, qo‘shtirnoq kabi belgilar entity bilan ifodalanadi. Masalan, foydalanuvchi kiritgan <script> satri brauzer tomonidan teg sifatida emas, ko‘rinadigan matn sifatida chiqishi kerak:
<p><script>alert(1)</script></p>
Template engine autoescape funksiyasi odatda shu kontekstni xavfsiz boshqaradi. Dasturchi safe, raw HTML yoki mark_safe kabi bypassni ishlatsa, qiymatning kelib chiqishi va sanitization kafolati aniq bo‘lishi kerak. “Admin kiritgan” matn ham hisob buzilganda yoki import orqali ishonchsiz bo‘lishi mumkin.
Atribut konteksti
Atribut qiymati har doim qo‘shtirnoq ichiga olinadi va tegishli attribute encoding ishlatiladi. Qo‘shtirnoqsiz atributda bo‘sh joy va boshqa belgilar yangi atribut boshlashi mumkin. Event handler atributlari, masalan onclick, aslida JavaScript konteksti bo‘lib, oddiy HTML escaping bilan xavfsiz bo‘lmaydi. Ishonchsiz qiymat bunday sinkka joylanmaydi.
URL atributida javascript: kabi scheme xavfi mavjud. HTML encode qilish scheme’ni zararsiz qilmaydi. URL parser bilan tekshiriladi, ruxsat etilgan https kabi scheme va kerak bo‘lsa host allowlisti qo‘llanadi. Query parametr alohida percent-encoding qilinadi, so‘ng butun URL HTML atribut sifatida escape qilinadi.
JavaScript va JSON
Foydalanuvchi qiymatini script blokiga satr birlashtirish bilan qo‘shish xavfli. JavaScript string escaping, HTML parserning </script> bilan blokni tugatish xatti-harakati va Unicode ajratgichlari birgalikda hisobga olinishi kerak. Eng xavfsiz usul data’ni DOMdagi data-* atributi, alohida JSON endpoint yoki frameworkning xavfsiz serializatsiyasi orqali uzatishdir.
JSON encodingning o‘zi qiymatni HTML ichiga xavfsiz joylashtirish kafolati emas. application/json javob aniq MIME type va nosniff bilan beriladi. Script ichiga JSON embed qilinsa, < kabi belgilar xavfsiz ko‘rinishga o‘tkaziladi va serialization tayyor kutubxona bilan bajariladi.
DOM sinklari
textContent matn joylashtirishda parserni ishga tushirmaydi va innerHTMLdan xavfsizroq. setAttribute atribut nomi qat’iy tanlanganda foydali, lekin href uchun URL validation baribir kerak. innerHTML, outerHTML, insertAdjacentHTML, document.write va string qabul qiladigan evalga o‘xshash APIlar xavfli sinklardir.
Content Security Policy va Trusted Types DOM XSS ta’sirini kamaytiradi. Trusted Types xavfli HTML sinklarga oddiy string berishni cheklab, markaziy policy talab qiladi. Bu mavjud injection xatosini avtomatik tuzatmaydi, ammo nazoratsiz sinklardan foydalanishni aniqlashga yordam beradi.
Escaping va sanitization
Escaping barcha markupni matnga aylantiradi. Rich text editor foydalanuvchiga ayrim HTML teglarini saqlashga ruxsat berganda sanitization kerak: parser asosidagi allowlist xavfli teg, atribut va URLlarni olib tashlaydi. Regex HTMLning murakkab parsing qoidalarini ishonchli qayta yarata olmaydi. Sanitized HTML keyin to‘g‘ri kontekstda chiqariladi va ikki marta encoding qilinmaydi.
Ma’lumotni bazada xom, semantik ko‘rinishda saqlash ko‘p hollarda uni HTML, email va PDF kabi turli chiqishlarga mos encode qilish imkonini beradi. Oldindan HTML-escaped qiymatni keyin JavaScriptga qo‘yish boshqa kontekst uchun xavfsiz emas va foydalanuvchiga & kabi ikki marta kodlangan matn ko‘rsatishi mumkin.
Bog‘liq tushunchalar
Cross-Site Scripting, HTML entity, Contextual encoding, Sanitization, Content Security Policy, Trusted Types, DOM