@@ -174,7 +174,7 @@ public function verifyUrl(string $url, bool $allowRedirect = false): array
174
174
// Note: Not parsed by parse_str() to prevent broke URL (repeated arguments like `?same_arg=1&same_arg=2`)
175
175
$ query = $ parsedUrl ['query ' ] ?? '' ;
176
176
if (preg_match (
177
- '/(?<token_key>[?&] ' . self ::URL_QUERY_TOKEN_KEY . '=)(?<token>[^&]+)(?:$|(?<remaining>&.*$))/D ' ,
177
+ '/(?<token_key>(?:^|&|^&) ' . self ::URL_QUERY_TOKEN_KEY . '=)(?<token>[^&]+)(?:$|(?<remaining>&.*$))/D ' ,
178
178
$ query ,
179
179
$ matches ,
180
180
PREG_OFFSET_CAPTURE
@@ -200,7 +200,14 @@ public function verifyUrl(string $url, bool $allowRedirect = false): array
200
200
}
201
201
202
202
$ parsedUrl = $ this ->normalizeUrl ($ parsedUrl );
203
- $ signedUrl = $ this ->buildUrl (['query ' => substr ($ query , 0 , $ tokenOffset )] + $ parsedUrl );
203
+ if ($ tokenOffset > 0 ) {
204
+ $ parsedUrl ['query ' ] = substr ($ query , 0 , $ tokenOffset );
205
+ } else {
206
+ unset($ parsedUrl ['query ' ]);
207
+ /** @var ParsedUrl $parsedUrl (bypass PhpStan bug) */
208
+ }
209
+
210
+ $ signedUrl = $ this ->buildUrl ($ parsedUrl );
204
211
205
212
if ($ signedUrl !== $ allowedUrl ) {
206
213
throw new SignedUrlVerificationException ('URL doesn \'t match signed URL ' );
@@ -283,16 +290,24 @@ protected function urlFromGlobal(): string
283
290
{
284
291
$ urlSegments = [];
285
292
$ urlSegments ['scheme ' ] = !empty ($ _SERVER ['HTTPS ' ]) && strcasecmp ($ _SERVER ['HTTPS ' ], 'off ' ) ? 'https ' : 'http ' ;
286
- $ urlSegments ['host ' ] = strtolower ($ _SERVER ['HTTP_HOST ' ] ?? '' );
293
+ if (isset ($ _SERVER ['HTTP_HOST ' ])) {
294
+ $ urlSegments ['host ' ] = strtolower ($ _SERVER ['HTTP_HOST ' ]);
295
+ }
287
296
288
297
$ requestUrl = $ _SERVER ['REQUEST_URI ' ] ?? '/ ' ;
289
298
$ requestUrl = preg_replace ('#^\w++://[^/]++# ' , '' , $ requestUrl );
290
299
$ tmp = explode ('? ' , $ requestUrl , 2 );
291
300
$ urlSegments ['path ' ] = $ tmp [0 ];
292
- $ urlSegments ['query ' ] = ($ tmp [1 ] ?? '' );
301
+ if (isset ($ tmp [1 ])) {
302
+ $ urlSegments ['query ' ] = $ tmp [1 ];
303
+ }
293
304
294
- $ urlSegments ['user ' ] = ($ _SERVER ['PHP_AUTH_USER ' ] ?? '' );
295
- $ urlSegments ['pass ' ] = ($ _SERVER ['PHP_AUTH_PW ' ] ?? '' );
305
+ if (isset ($ _SERVER ['PHP_AUTH_USER ' ])) {
306
+ $ urlSegments ['user ' ] = $ _SERVER ['PHP_AUTH_USER ' ];
307
+ }
308
+ if (isset ($ _SERVER ['PHP_AUTH_PW ' ])) {
309
+ $ urlSegments ['pass ' ] = $ _SERVER ['PHP_AUTH_PW ' ];
310
+ }
296
311
297
312
return $ this ->buildUrl ($ urlSegments );
298
313
}
0 commit comments