Querystring — URI yoki URL ichida ? belgisidan keyin joylashadigan va server yoki client applicationga qo‘shimcha parameterlar uzatadigan matnli qism. U odatda filter, qidiruv, pagination, sorting va tracking qiymatlarini ifodalaydi.
Misol:
https://example.com/search?q=django&page=2
Bu yerda q=django&page=2 querystring hisoblanadi.
Parameter
Querystring ko‘pincha key-value juftliklardan tashkil topadi:
q=django
page=2
sort=date
Juftliklar & bilan ajratiladi:
q=django&page=2&sort=date
Aniq parsing qoidasi framework yoki applicationga bog‘liq.
Kalit va qiymat
name=value
ko‘rinishida bo‘ladi.
Qiymat bo‘sh bo‘lishi mumkin:
filter=
Tenglik belgisisiz parameter ham uchrashi mumkin:
debug
Application bunday holatning semantikasini o‘zi belgilaydi.
Percent-encoding
Reserved yoki oddiy URLda yozib bo‘lmaydigan byte’lar %HH ko‘rinishida encoded qilinadi:
q=web%20dasturlash
Bu web dasturlash qiymatini ifodalashi mumkin.
Encode va decode aynan parameter value darajasida bajariladi.
Plus belgisi
HTML form encodingda space ba’zan + bilan ifodalanadi:
q=web+dasturlash
Oddiy URI syntax’da + har doim space degani emas.
Parser application/x-www-form-urlencoded qoidalarini ishlatadimi, aniq bo‘lishi kerak.
Bir kalitning takrorlanishi
Bir key bir nechta qiymatga ega bo‘lishi mumkin:
tag=python&tag=django
Framework natijani:
- birinchi qiymat;
- oxirgi qiymat;
- list;
- multi-dict
sifatida qaytarishi mumkin.
Security check va business logic ayni semanticsdan foydalanishi kerak.
Array ifodasi
Array uchun yagona universal syntax yo‘q.
Variantlar:
tag=python&tag=django
tag[]=python&tag[]=django
tag=python,django
Client va server contractda bitta usulni kelishadi.
Comma qiymatning o‘zida bo‘lsa escaping muammosi yuzaga kelishi mumkin.
Nested object
Querystring nested data uchun turli framework-specific ko‘rinishlarga ega:
filter[status]=active
filter[role]=editor
Yoki dotted notation:
filter.status=active
Juda chuqur object parser resource’ini oshirishi mumkin.
Depth va parameter soni cheklanadi.
Form encoding
HTML GET form fieldlari querystringga aylantiriladi.
Masalan:
<form method="get">
submit qilinganda input nomlari va qiymatlari URLga qo‘shiladi.
Disabled yoki nomsiz fieldlar yuborilmasligi mumkin.
Search
Qidiruv so‘zi query parameterda saqlansa URLni share va bookmark qilish mumkin:
/search?q=linux
Browser history va analytics search holatini ko‘radi.
Sensitive qidiruv qiymatlari log va referer orqali tarqalishi mumkin.
Pagination
Pagination parameterlari:
?page=3
?limit=20&offset=40
?cursor=abc123
Server maksimal limitni cheklaydi.
User juda katta limit bilan barcha data’ni bir requestda olishga majbur qila olmaydi.
Sorting
Sorting:
?sort=created_at
?order=desc
User yuborgan field SQL yoki query expressionga bevosita qo‘shilmaydi.
Allowed field va direction allowlistdan tanlanadi.
Filter
Filter querystringda ifodalanishi mumkin:
?status=active®ion=tashkent
Har parameter type, allowed value va permission bo‘yicha tekshiriladi.
Frontendda filter mavjudligi backend authorizationni almashtirmaydi.
URL uzunligi
URI va serverlar amaliy maksimal uzunlikka ega.
Limit browser, proxy, web server va frameworkga qarab farq qiladi.
Katta structured payload querystringga emas, request body yoki boshqa usulga joylashtiriladi.
Cache
CDN va browser querystringni cache keyning bir qismi sifatida ko‘rishi mumkin.
Parameter tartibi yoki keraksiz tracking qiymatlari bir content uchun ko‘p cache entry yaratadi.
Canonicalization va parameter allowlist cache samaradorligini oshiradi.
Canonical URL
Filter va tracking parameterlari duplicate content yaratishi mumkin.
Canonical URL asosiy sahifani ko‘rsatadi.
Masalan, utm_* parameterlar contentni o‘zgartirmasa canonical ularsiz bo‘lishi mumkin.
Sensitive data
Querystring quyidagi joylarda ko‘rinishi mumkin:
Parol, access token, karta yoki maxfiy personal data querystringga yozilmaydi.
Query pollution
Bir parameter bir necha marta yuborilganda frontend, proxy va backend uni turlicha talqin qilishi mumkin.
Masalan:
role=user&role=admin
Bir qatlam birinchisini, boshqasi oxirgisini olsa validation bypass yuz beradi.
Barcha qatlam bir xil parsing semanticsga ega bo‘ladi.
Validation
- parameter soni;
- key uzunligi;
- value uzunligi;
- encoding;
- duplicate;
- type;
- diapazon;
- unknown parameter
ni tekshiradi.
Noto‘g‘ri parameterga aniq xato yoki e’tiborsiz qoldirish policy’si belgilanadi.
Query va Fragment
Query serverga HTTP request bilan yuboriladi.
Fragment #dan keyin bo‘lib, odatda serverga yuborilmaydi.
Shu sababli client-side state fragmentda, server filteri queryda bo‘lishi mumkin.
Parameter tartibi
Ko‘p application uchun:
?a=1&b=2
va:
?b=2&a=1
bir xil ma’noga ega. Ammo digital signature, cache yoki analytics raw stringga tayanishi mumkin. Canonical query parameterlarni nom bo‘yicha tartiblaydi, takroriy key va encoding qoidalarini aniq belgilaydi.
Boolean parameter
?active=true, ?active=1 va faqat ?active turli tizimda boshqa talqin qilinadi. API contract bitta formatni qabul qiladi va noaniq qiymatni rad etadi.
Query qurish
Client parameterlarni qo‘lda stringga qo‘shish o‘rniga URLSearchParamsga o‘xshash API ishlatadi. Bu encoding va takroriy qiymatlarni to‘g‘ri boshqaradi.
Bog‘liq tushunchalar
Query string, URL parameter, Percent-encoding, application/x-www-form-urlencoded, Pagination, Filtering, Sorting, URI, Fragment, HTTP request