URL vyzerá ako jeden reťazec, no pre browser, proxy a server je to štruktúrovaná adresa. Určuje spôsob komunikácie, sieťový cieľ, cestu k zdroju, parametre pohľadu a niekedy pozíciu v dokumente. Keď aplikácia skladá URL obyčajnou konkatenáciou, mieša dáta so syntaxou podobne, ako keby SQL dotaz vytvárala z neescapovaných fragmentov. Spoľahlivý systém preto pracuje s komponentmi a štandardným parserom.

Schéma určuje prvý spôsob interpretácie

https hovorí klientovi, že má vytvoriť zabezpečené HTTP spojenie. Iné schémy môžu otvoriť e-mailového klienta, lokálny súbor alebo aplikáciu. Povolenie ľubovoľnej schémy v odkaze nie je iba formátová otázka; môže spustiť nečakané správanie.

Bezpečnostná politika má povoliť iba schémy potrebné pre konkrétny kontext. Odkaz v komentári obyčajne potrebuje HTTP a HTTPS, nie ľubovoľný protokol dodaný používateľom.

Authority označuje sieťový cieľ

Časť za // môže obsahovať host, port a historicky aj user info. Doména sa číta sprava doľava po labeloch. example.com.attacker.test nepatrí doméne example.com, hoci ju obsahuje ako substring.

Allowlist musí porovnávať normalizovaný host podľa celých labelov a pravidiel IDN. Port je samostatná súčasť; neštandardný port môže smerovať k inej službe.

Cesta je verejná routingová zmluva

Path sa skladá zo segmentov oddelených lomkou. Segment nie je celá cesta a jeho dynamická hodnota sa musí kódovať samostatne. Ak ID obsahuje lomku a aplikácia zakóduje až hotový string, router ho môže rozdeliť na viac častí.

Normalizácia bodkových segmentov, opakovaných lomiek a trailing slash sa medzi vrstvami líši. Proxy a aplikácia musia používať kompatibilnú politiku, inak môžu autorizovať inú cestu než tú, ktorú obslúži backend.

Query opisuje parametre, nie vždy identitu

Časť za otáznikom často nesie filter, sort, stránku alebo vyhľadávanie. Rovnaký názov parametra sa môže opakovať a poradie môže byť významné pre podpis, hoci business logika ho ignoruje. Parser musí mať definované pravidlo pre duplicity.

Form-urlencoded interpretácia mení plus na medzeru, zatiaľ čo všeobecné percent encoding pravidlá nemusia. Ručné dekódovanie po frameworku často vytvorí druhú transformáciu a poškodené hodnoty.

Fragment zostáva väčšinou v klientovi

Text za # označuje sekciu stránky alebo klientský stav a pri bežnom HTTP requeste sa serveru neposiela. Backend preto nemôže očakávať token či parameter uložený vo fragmente, ak ho JavaScript výslovne neprenesie.

Fragment môže byť vhodný pre lokálnu navigáciu, no zdieľateľnosť a analytics treba navrhnúť vedome. Browser ho môže uchovať v histórii a zobraziť používateľovi.

Percent encoding oddeľuje dáta od syntaxe

Znak sa najprv prevedie na bajty, typicky UTF-8, a vybrané bajty sa zapíšu ako percento a dve hex číslice. Pravidlá povolených znakov sa líšia podľa komponentu. Encoder pre query value nie je automaticky správny pre path segment.

Kódovať treba dynamickú hodnotu pred spojením so štrukturálnymi oddeľovačmi. Zakódovať celú URL naraz by zmenilo aj dvojbodku, lomky a otáznik, ktoré majú zostať syntaxou.

Relatívna adresa potrebuje dôveryhodný základ

../login alebo ?page=2 získava úplný význam až voči base URL. Pri server-side fetchi musí aplikácia kontrolovať výsledný absolútny cieľ, nie iba pôvodný relatívny text. Redirect môže základ zmeniť.

Pri ochrane pred SSRF treba po DNS resolution zohľadniť interné rozsahy, redirecty a opätovné rozlíšenie. Samotná syntaktická validácia hostu nestačí.

URL nie je miesto pre tajomstvá

Adresy sa zapisujú do browser history, proxy logov, analytiky, screenshotov a niekedy Referer hlavičky. HTTPS chráni prenos, ale nezabráni týmto legitímnym kópiám. Heslo a dlhodobý bearer token preto do query nepatria.

Jednorazový reset link je kontrolovaná výnimka: potrebuje náhodný token, krátku platnosť, jediný účel a odstránenie citlivej hodnoty z adresy po použití.

Absolútne odkazy závisia od proxy konfigurácie

Aplikácia za load balancerom často číta host a schému z forwarded hlavičiek. Ak dôveruje každej hodnote od klienta, útočník môže ovplyvniť reset link alebo redirect. Zoznam trusted proxies a verejná base URL musia byť explicitné.

Integračný test má prejsť skutočným TLS termination. Interné HTTP spojenie nesmie spôsobiť, že aplikácia vytvorí verejný nezabezpečený odkaz.

Normalizácia je politika, nie kozmetická úprava

Lowercase host, odstránenie default portu a spracovanie bodkových segmentov môže vytvoriť kanonickú adresu. Aplikácia však nesmie normalizovať neobmedzene po každej kontrole. Ak bezpečnostná vrstva overí pôvodný path a router neskôr použije inú podobu, vznikne priestor na obídenie pravidla.

Jedna komponenta má vytvoriť normalizovanú štruktúru a tú používa routing, cache, podpis aj autorizácia. Pôvodný request target možno zachovať pre audit, nie ako druhú konkurenčnú identitu.

Limity chránia parser aj okolité služby

Extrémne dlhá URL alebo tisíce query parametrov zaťažia CDN, web server, aplikačný parser a logovanie ešte pred business validáciou. Všetky vrstvy potrebujú kompatibilné maximá pre dĺžku, počet parametrov a veľkosť jedného segmentu.

Prekročenie má vrátiť predvídateľnú chybu bez kopírovania celého útočného vstupu do logu. Limit je súčasť verejnej zmluvy, najmä pri callback a search endpointoch.

Adresa je súčasť používateľského rozhrania

Čitateľná URL pomáha pri zdieľaní, supporte, logoch aj odhaľovaní podozrivej domény. Stabilná cesta prežije redesign a externé odkazy. URL je preto verejnou architektúrou produktu, nie iba transportným detailom routera.

Parser a builder zachovávajú hranice komponentov lepšie než string operations. Keď sú pravidlá dokumentované a testované cez celú infraštruktúru, jeden textový riadok môže spoľahlivo plniť úlohu adresy pre ľudí aj stroje.