Korištenje znaka kosa crta u proljetnim URL-ovima

1. Uvod

Kada razvijamo web usluge, možda ćemo se morati nositi sa složenim ili neočekivanim URL stazama koje mogu sadržavati kose crte. Kao posljedica toga, možemo naići na probleme s web poslužiteljima ili okvirima koje koristimo.

Proljeće u tom pogledu može biti malo nezgodno zbog zadanih konfiguracija koje pruža.

U ovom vodiču, na proljeće ćemo pokazati neka uobičajena rješenja i preporuke za rukovanje URL-ovima s kosim crtama. Također ćemo vidjeti zašto ne bismo trebali koristiti neke uobičajene hakove da bismo zaobišli ove probleme. Nastavite čitati da biste saznali više o tome!

2. Ručno raščlanite zahtjev

U našim web uslugama ponekad moramo mapirati sve zahtjeve pod određenim putem na istu krajnju točku. Da stvar bude gora, možda nećemo znati kako će izgledati ostatak puta. Mogli bismo također morati nekako primiti ovu putanju kao parametar da bismo je poslije mogli koristiti.

Recimo da možemo primati zahtjeve s bilo kojim putem ispod / mypaths:

// localhost: 8080 / mypaths / any / custom / path

I pretpostavimo da želimo pohraniti sve te različite staze u bazu podataka kako bismo znali koje zahtjeve primamo.

Prvo rješenje koje će nam vjerojatno pasti na pamet je hvatanje dinamičnog dijela puta u Promjenjiva putanja:

@GetMapping ("mypaths / {anything}") javni String pathVariable (@PathVariable ("anything") String anything) {return anything; }

Nažalost, uskoro to saznajemo ovo vraća a 404 ako je Promjenjiva putanja sadrži kosu crtu. Kosa crta je URI standardni graničnik puta, a sve što ide nakon njega računa se kao nova razina u hijerarhiji staze. Kao što se i očekivalo, Spring slijedi ovaj standard.

Možemo lako riješite ovo stvaranjem rezervne kopije za sve zahtjeve na određenom putu pomoću ** zamjenski znak:

@GetMapping ("all / **") public String allDirectories (HttpServletRequest zahtjev) {return request.getRequestURI () .split (request.getContextPath () + "/ all /") [1]; }

Zatim moramo sami raščlaniti URI kako bismo dobili dio puta koji nas zanima.

Ovo je rješenje vrlo prikladno za rad s parametrima sličnim URL-u, ali kao što ćemo vidjeti u sljedećem odjeljku, to nije dovoljno za neke druge slučajeve.

3. Upotrijebite parametre upita

Za razliku od našeg prethodnog primjera, postoje i drugi slučajevi u kojima ne mapiramo samo različite putove, već ih primamo Niz kao parametar u URL-u.

Zamislimo da u našem prethodnom primjeru pravimo zahtjev s parametrom puta koji sadrži uzastopne kose crte:

//localhost:8080/all///myurl.com

U početku bismo mogli pomisliti da bi to trebalo funkcionirati, ali ubrzo shvatimo da se naš kontroler vraća http: /myurl.com. To se događa jer Spring Security normalizira URL-ove i zamjenjuje svaku dvostruku kosu crtu jednom.

Proljeće također normalizira ostale sekvence u URL-ovima, kao što su obilaznice staza. Poduzima ove mjere predostrožnosti kako bi spriječio zlonamjerne URL-ove da zaobiđu definirana sigurnosna ograničenja, kako je objašnjeno u službenoj dokumentaciji Spring Security.

U tim se slučajevima preporučuje korištenje parametara upita:

@GetMapping ("all") javni niz queryParameter (@RequestParam ("param") Parametar niza) {return param; }

Na ovaj način možemo primiti bilo koji Niz parametar bez ovih sigurnosnih ograničenja, a naša će web usluga biti robusnija i sigurnija.

4. Izbjegavajte zaobilaznice

Rješenja koja smo predstavili mogu podrazumijevati neke promjene u našem dizajnu preslikavanja. To bi nas moglo dovesti u iskušenje da koristimo neke uobičajene zaobilazne načine kako bi naše izvorne krajnje točke funkcionirale prilikom primanja kosih crta u URL-ovima.

Najčešće rješenje je vjerojatno kodiranje kose crte u parametrima puta. Međutim, neke sigurnosne ranjivosti prijavljivane su u prošlosti, a većina web i poslužitelja aplikacija reagirala je na njih onemogućavajući kodirane kose crte prema zadanim postavkama. Još uvijek je moguće promijeniti ovo ponašanje samo promjenom odgovarajuće postavke, kao u Tomcat-u.

Drugi poput Apache poslužitelja otišli su malo dalje i uveli opciju koja dopušta kodirane kose crte bez njihovog dekodiranja tako da se ne tumače kao graničnici puta. U svakom slučaju, to se ne preporučuje i može uvesti potencijalne sigurnosne rizike.

S druge strane, mrežni okviri također poduzimaju neke mjere predostrožnosti. Kao što smo već vidjeli, Proljeće dodaje neke mehanizme kao zaštitu od manje strogih spremnika za servlet. Dakle, u slučaju da na našem poslužitelju dopustimo kodirane kose crte, ipak ih moramo dopustiti u proljeće.

Konačno, postoje i druge vrste zaobilaženja poput promjene normalizacije URI-ja koju Spring pruža prema zadanim postavkama. Kao i prije, trebali bismo biti vrlo oprezni ako promijenimo te zadane postavke.

5. Zaključak

U ovom smo kratkom članku prikazali neka rješenja za rješavanje kose crte u URL-ovima u proljeće. Također smo uveli neke sigurnosne probleme koji se mogu pojaviti ako promijenimo zadane konfiguracije poslužitelja ili okvira poput Springa.

U pravilu su parametri upita obično najbolje rješenje za rješavanje kose crte u URL-ovima.

Kao i uvijek, puni izvorni kod za primjere dostupan je na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found