Escaping — matndagi parser uchun maxsus ma’noga ega belgilarni oddiy data sifatida talqin qilinadigan ko‘rinishga o‘tkazish jarayoni. Masalan, HTMLda <, SQL string literalida qo‘shtirnoq, shell’da $ yoki bo‘sh joy sintaktik vazifaga ega. Har til va kontekstning escaping qoidasi boshqacha. Shu sababli “maxsus belgilarni escape qilish” universal funksiya emas; qaysi parser, qaysi pozitsiya va qaysi encoding ishlatilayotgani aniq bo‘lishi kerak.
Kontekstga bog‘liqlik
HTML matnida < qiymati < bilan ifodalanishi mumkin. JSON stringda qo‘shtirnoq \", URL query komponentida bo‘sh joy percent-encoding orqali yoziladi. Bu ko‘rinishlarni almashtirib ishlatish xavfli. URL-encoded satr HTML atributga qo‘yilganda atribut escaping ham, URL scheme validation ham talab etiladi.
Bir til ichida ham kontekstlar farq qiladi. HTML body, quoted attribute, unquoted attribute, script va style bloklari bir xil emas. JavaScript string uchun xavfsiz escape qilingan qiymat uni HTML parser </script> ketma-ketligi orqali blokdan chiqarmasligini kafolatlamasligi mumkin. Tayyor framework qiymatni qaysi sinkka qo‘yayotganini biladigan contextual encoding ishlatadi.
SQL va parametrlar
SQL string literalidagi ' belgisini ikki marta yozish ayrim dialectlarda escape bo‘lishi mumkin, ammo encoding, backslash rejimi va driver sozlamalari sabab qo‘lda escaping xatoga moyil. Parametrli prepared statement SQL tuzilmasini qiymatdan ajratadi va afzal usul hisoblanadi. Jadval nomi kabi parametr qilib bo‘lmaydigan identifikator allowlistdan olinadi.
Escaping queryning biznes ruxsatini tekshirmaydi. To‘g‘ri parameterized SELECT ham foydalanuvchiga begona yozuvni qaytarsa, authorization xatosi saqlanadi. Shuningdek, parametr qiymatini keyin dynamic SQL ichida yana satr sifatida ishlatadigan stored procedure ikkilamchi injection yaratishi mumkin.
Shell va buyruqlar
Shell escaping ayniqsa murakkab, chunki shell quote, glob, variable expansion, command substitution, redirection va control operatorlarni talqin qiladi. Foydalanuvchi qiymatini bitta command stringga qo‘shib, maxsus belgilarni qo‘lda backslash qilish xavfli. Process API’ga executable va argumentlarni alohida array sifatida berish shell parsingni chetlab o‘tadi.
run(["convert", input_path, output_path])
Argument ajratish ham barcha xavfni tugatmaydi: ayrim dasturlar - bilan boshlangan filename’ni option deb qabul qiladi. -- terminatori, ruxsat etilgan yo‘l, working directory va filesystem permission tekshiriladi. Buyruqning o‘zi foydalanuvchi tomonidan tanlanmaydi.
Regex va string literal
Foydalanuvchi matni regexga literal qidiruv sifatida kiritilsa, ., *, ( kabi metabelgilar libraryning regex escape funksiyasi bilan kodlanadi. Bu ReDoS xavfini to‘liq yo‘q qilmaydi, chunki dastur qo‘shgan patternning o‘zi catastrophic backtrackingga ega bo‘lishi mumkin. Replacement string ham $1 yoki backslash kabi alohida sintaksisga ega va pattern escapingdan boshqa funksiya talab qiladi.
Dasturlash tili source code’i uchun escaping bilan runtime data formatini aralashtirish ham xato. JSON serializator data’ni to‘g‘ri encode qiladi; qo‘lda qo‘shtirnoq qo‘shish double escaping yoki noto‘g‘ri Unicode natija beradi. Parse va serialize uchun standart kutubxona ishlatiladi.
Canonicalization va double escaping
Tekshiruvdan oldin ma’lumotni bir necha marta decode qilish turli talqinlar yaratishi mumkin. %252e bir bosqichda %2e, keyingi bosqichda nuqtaga aylanadi. Gateway, framework va backend qaysi qatlamda canonicalization qilishini kelishishi kerak. Security check bir ko‘rinishda, amaliy foydalanish boshqa ko‘rinishda bajarilsa bypass yuz beradi.
Oldindan escape qilingan qiymatni yana escape qilish &ni &ga aylantirib, foydalanuvchiga entity matnini ko‘rsatishi mumkin. Ko‘p tizimlar data’ni xom semantik shaklda saqlab, chiqish paytida bir marta encode qiladi. “Already safe” belgisi trust boundary bo‘lib, faqat aniq sanitization yoki ishonchli constantdan keyin beriladi.
Bog‘liq tushunchalar
Output encoding, Injection, HTML entity, Prepared statement, Shell injection, URL encoding, Canonicalization