Przekazcie bajtów zapytania dzwonijącego zamiast kodowania ich dwa razy

FixAPIService
Szycy
7 sierpnia 2026 04:07 UTC
Autor
Kamo
Pochęt się
3c24d32

Każdy adres URL, który buduje brama, jest montowany z getRequestURI() i getQueryString() - oba już zakodowane w procentach - a następnie zostało przekazane do RestTemplate jako strun. Przeciążenia smyczy RestTemplate nie biorą adresu URL; one Zbierz URI TEMPLATE, rozszerzone o DefaultUriBuilderFactory, który RestTemplate Konfiguruje się w EncodingMode.URI_COMPONENT. Ten tryb koduje każdy komponent, a "%" nie jest pchar, więc istniejąca ucieczka została ponownie uniknięta:% 2C pozostawiono jako%252C. Usługa upstream zdekodowana raz i otrzymała dosłowny token A%2CB — jeden wartość, w której dzwoniący wysłał dwa. forward() jest pojedynczym lejem dla każdego /api/?x>? trasa, więc /api/docs, /api/security, /api/kb, /api/media i reszta wszystkie zostały dotknięte naraz; wartości bez zastrzeżonego charakteru są stałym punktem, Co sprawiło, że był przerywany i łatwy do pominięcia. toUpstreamUri() analizuje adres URL, a przeciążenie URI wymiany () omija Całkowicie uchwyt na szablon, więc bajty przechodzą przez chmiel nietknięty. To celowo NIE jest prostą zamianą na URI.create. Ta metoda THROWS na Postać, która jest nielegalna w URI – surowa przestrzeń, „|”, „-”, okrojona ucieczka — i takie żądanie działa teraz właśnie dlatego, że drugi kod go naprawia. Na IllegalArgumentException pomocnik zwraca null, a dzwoniący przekazuje ręce String to RestTemplate dokładnie tak, jak wcześniej, z WARN nazywającym adres URL, więc sprawa Jest widoczny zamiast milczenia. Prawidłowy ruch zatrzymuje się zniekształcając; zniekształcony Ruch zachowuje się dokładnie tak, jak to się stało. Wszystkie pięć witryn wymiany w tej klasie — Do przodu, naprzódał, naprzódCallback i dwa pomocnicy webhook POST — idź Za pośrednictwem jednego exchangeUpstream, więc dwa kodowania nie mogą dryfować na stronie połączenia. Testy potwierdzają URI, który faktycznie opuszcza RestTemplate, za pośrednictwem MockRestServiceServer Zamiast samej wartości zwrotu pomocnika, ponieważ kodowanie odbywa się w środku RestTemplate: status-PENDING%2CIN_PROGRESS osiąga dokładnie jeden poziom Kodowanie i brak%25 gdziekolwiek; przeciążenie struny jest przypięte jako rzecz, która Podwójnie zakodowany; surowa przestrzeń, okrojone %2 i orteza ?id każdy upadek Zamiast rzucać; a zwykłe wielokrotne param kwerendy jest niezmienione w żaden sposób. Test mvn -o: 29 testów, 0 awarii.

Wszystkie zmiany

Jak to, co widzisz żeglugę?

Każda z tych aktualizacji automatycznie ląduje w miejscu pracy. Zacznij za darmo i obserwuj, jak rośnie tydzień po tygodniu.

Start Free ForeverZobacz ceny