Inline script — JavaScript kodi alohida fayldan yuklanmasdan, HTML hujjatning o‘zidagi <script> elementi yoki event handler atributi ichida yozilgan kod. Masalan, <script>init()</script> va <button onclick="save()"> inline script hisoblanadi. U kichik kodni tez joylashtirishga imkon beradi, ammo Content Security Policy, cache, kodni qayta ishlatish va Cross-Site Scripting himoyasi nuqtai nazaridan alohida cheklovlarga ega.
Brauzerda bajarilishi
HTML parser oddiy <script> tegiga yetganda hujjat parsingini to‘xtatib, kodni bajarishi mumkin. Inline scriptda src yuklanishi yo‘q, lekin uzoq hisoblash renderingni baribir bloklaydi. defer atributining inline classic script uchun tashqi scriptdagi kabi ma’nosi yo‘q. Module script esa odatda deferred xatti-harakatga ega va strict mode’da ishlaydi.
Script elementining matni HTML parser qoidalariga ham bo‘ysunadi. JavaScript string ichida </script> paydo bo‘lsa, brauzer scriptni erta tugatishi mumkin. Server data’ni scriptga qo‘lda birlashtirmaydi. JSON xavfsiz serializatsiya qilinadi yoki alohida application/json element/endpoint orqali uzatiladi.
Event handler atributlari
onclick, onload va boshqa on* atributlari ham inline scriptdir. Ularning scope va string parsing xatti-harakati odatiy modul funksiyasidan farq qilishi mumkin. DOMda addEventListener orqali handler ulash markupni xatti-harakatdan ajratadi va qat’iy CSP bilan ishlashni osonlashtiradi.
javascript: URL ham kod bajarish kontekstini yaratadi. URLni HTML escape qilish bu scheme’ni xavfsiz qilmaydi. Foydalanuvchi bergan href qiymati parser orqali tekshirilib, faqat ruxsat etilgan https, kerak bo‘lsa mailto kabi schemelar qabul qilinadi.
Content Security Policy
script-src direktivasi ruxsat etilgan script manbalarini belgilaydi. Qat’iy CSP inline scriptni standart holatda bloklaydi. 'unsafe-inline' barcha ko‘p inline kodlarga ruxsat berib, XSSga qarshi qatlamni sezilarli zaiflashtiradi. Nonce yoki hash faqat aniq tasdiqlangan inline scriptni ishga tushirishga imkon beradi.
Content-Security-Policy: script-src 'nonce-R4nd0mValue'
<script nonce="R4nd0mValue">init()</script>
Nonce har HTTP javobi uchun kriptografik tasodifiy yaratiladi va attacker kiritmasiga oshkor qilinmaydi. Static inline script uchun CSP hash ishlatilishi mumkin; koddagi bir byte o‘zgarish hashni yangilashni talab qiladi. Handler atributlar oddiy script nonce bilan avtomatik ruxsat olmaydi, shu sababli ular tashqi yoki nonce’li scriptdagi addEventListenerga ko‘chiriladi.
Cache va arxitektura
Inline kod HTML bilan birga har sahifa javobida yuboriladi va brauzer uni alohida uzoq muddat cache qila olmaydi. Tashqi fingerprintli bundle esa o‘zgarmaguncha cache’da qoladi. Juda kichik bootstrap kod uchun inline shakl qo‘shimcha requestni kamaytirishi mumkin, lekin HTTP/2/3 va cache sharoitida foyda o‘lchanadi.
Server-side rendering frameworklari hydration data yoki bootstrap script qo‘shishi mumkin. Framework nonce’ni barcha hosil qilgan scriptlarga uzatishi va data’ni HTML parserdan chiqib ketmaydigan tarzda serialize qilishi kerak. Faqat template autoescape’iga tayanish JavaScript konteksti uchun yetarli bo‘lmasligi mumkin.
XSS bilan bog‘lanishi
Inline scriptning mavjudligi o‘zi XSS degani emas. XSS ishonchsiz data kod sifatida bajarilganda yuz beradi. Biroq sahifa ko‘plab inline kodga tayanib 'unsafe-inline' talab qilsa, CSP injection ta’sirini cheklashda kamroq foyda beradi. Kodni tashqi modulga ajratish, unsafe DOM sinklarni kamaytirish va contextual escaping asosiy himoyani mustahkamlaydi.
Bog‘liq tushunchalar
JavaScript, Content Security Policy, CSP nonce, Cross-Site Scripting, Script element, Event handler, DOM