Skip to content

Commit 88b0d7f

Browse files
bug #62093 [Security] Fix HttpUtils::createRequest() when the context’s base URL isn’t empty (MatTheCat)
This PR was merged into the 6.4 branch. Discussion ---------- [Security] Fix `HttpUtils::createRequest()` when the context’s base URL isn’t empty | Q | A | ------------- | --- | Branch? | 6.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Issues | Fix #61659 (comment) | License | MIT Commits ------- 3210543 [Security] Fix `HttpUtils::createRequest()` when the context’s base URL isn’t empty
2 parents fc41d4f + 3210543 commit 88b0d7f

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

src/Symfony/Component/Security/Http/HttpUtils.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,21 @@ public function createRequest(Request $request, string $path): Request
7373
if ($trustedProxies = Request::getTrustedProxies()) {
7474
Request::setTrustedProxies([], Request::getTrustedHeaderSet());
7575
}
76-
$newRequest = Request::create($this->generateUri($request, $path), 'get', [], $request->cookies->all(), [], $request->server->all());
77-
if ($trustedProxies) {
78-
Request::setTrustedProxies($trustedProxies, Request::getTrustedHeaderSet());
76+
77+
$context = $this->urlGenerator?->getContext();
78+
if ($baseUrl = $context?->getBaseUrl()) {
79+
$context->setBaseUrl('');
80+
}
81+
82+
try {
83+
$newRequest = Request::create($this->generateUri($request, $path), 'get', [], $request->cookies->all(), [], $request->server->all());
84+
} finally {
85+
if ($trustedProxies) {
86+
Request::setTrustedProxies($trustedProxies, Request::getTrustedHeaderSet());
87+
}
88+
if ($baseUrl) {
89+
$context->setBaseUrl($baseUrl);
90+
}
7991
}
8092

8193
static $setSession;

src/Symfony/Component/Security/Http/Tests/HttpUtilsTest.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616
use Symfony\Component\HttpFoundation\Session\SessionInterface;
1717
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
1818
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
19+
use Symfony\Component\Routing\Generator\UrlGenerator;
1920
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
2021
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
2122
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
2223
use Symfony\Component\Routing\RequestContext;
24+
use Symfony\Component\Routing\Route;
25+
use Symfony\Component\Routing\RouteCollection;
2326
use Symfony\Component\Security\Http\HttpUtils;
2427
use Symfony\Component\Security\Http\SecurityRequestAttributes;
2528

@@ -233,7 +236,7 @@ public static function provideSecurityRequestAttributes()
233236
];
234237
}
235238

236-
public function testCreateRequestHandlesTrustedHeaders()
239+
public function testCreateRequestFromPathHandlesTrustedHeaders()
237240
{
238241
Request::setTrustedProxies(['127.0.0.1'], Request::HEADER_X_FORWARDED_PREFIX);
239242

@@ -243,6 +246,24 @@ public function testCreateRequestHandlesTrustedHeaders()
243246
);
244247
}
245248

249+
public function testCreateRequestFromRouteHandlesTrustedHeaders()
250+
{
251+
Request::setTrustedProxies(['127.0.0.1'], Request::HEADER_X_FORWARDED_PREFIX);
252+
253+
$request = Request::create('/', server: ['HTTP_X_FORWARDED_PREFIX' => '/foo']);
254+
255+
$urlGenerator = new UrlGenerator(
256+
$routeCollection = new RouteCollection(),
257+
(new RequestContext())->fromRequest($request),
258+
);
259+
$routeCollection->add('root', new Route('/'));
260+
261+
$this->assertSame(
262+
'http://localhost/foo/',
263+
(new HttpUtils($urlGenerator))->createRequest($request, 'root')->getUri(),
264+
);
265+
}
266+
246267
public function testCheckRequestPath()
247268
{
248269
$utils = new HttpUtils($this->getUrlGenerator());

0 commit comments

Comments
 (0)