vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpCache/SubRequestHandler.php line 102

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\HttpKernel\HttpCache;
  11. use Symfony\Component\HttpFoundation\IpUtils;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpKernel\HttpKernelInterface;
  15. /**
  16.  * @author Nicolas Grekas <p@tchwork.com>
  17.  *
  18.  * @internal
  19.  */
  20. class SubRequestHandler
  21. {
  22.     /**
  23.      * @return Response
  24.      */
  25.     public static function handle(HttpKernelInterface $kernelRequest $request$type$catch)
  26.     {
  27.         // save global state related to trusted headers and proxies
  28.         $trustedProxies Request::getTrustedProxies();
  29.         $trustedHeaderSet Request::getTrustedHeaderSet();
  30.         if (method_exists(Request::class, 'getTrustedHeaderName')) {
  31.             Request::setTrustedProxies($trustedProxies, -1);
  32.             $trustedHeaders = [
  33.                 Request::HEADER_FORWARDED => Request::getTrustedHeaderName(Request::HEADER_FORWARDEDfalse),
  34.                 Request::HEADER_X_FORWARDED_FOR => Request::getTrustedHeaderName(Request::HEADER_X_FORWARDED_FORfalse),
  35.                 Request::HEADER_X_FORWARDED_HOST => Request::getTrustedHeaderName(Request::HEADER_X_FORWARDED_HOSTfalse),
  36.                 Request::HEADER_X_FORWARDED_PROTO => Request::getTrustedHeaderName(Request::HEADER_X_FORWARDED_PROTOfalse),
  37.                 Request::HEADER_X_FORWARDED_PORT => Request::getTrustedHeaderName(Request::HEADER_X_FORWARDED_PORTfalse),
  38.             ];
  39.             Request::setTrustedProxies($trustedProxies$trustedHeaderSet);
  40.         } else {
  41.             $trustedHeaders = [
  42.                 Request::HEADER_FORWARDED => 'FORWARDED',
  43.                 Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
  44.                 Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
  45.                 Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
  46.                 Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
  47.             ];
  48.         }
  49.         // remove untrusted values
  50.         $remoteAddr $request->server->get('REMOTE_ADDR');
  51.         if (!IpUtils::checkIp($remoteAddr$trustedProxies)) {
  52.             foreach ($trustedHeaders as $key => $name) {
  53.                 if ($trustedHeaderSet $key) {
  54.                     $request->headers->remove($name);
  55.                     $request->server->remove('HTTP_'.strtoupper(str_replace('-''_'$name)));
  56.                 }
  57.             }
  58.         }
  59.         // compute trusted values, taking any trusted proxies into account
  60.         $trustedIps = [];
  61.         $trustedValues = [];
  62.         foreach (array_reverse($request->getClientIps()) as $ip) {
  63.             $trustedIps[] = $ip;
  64.             $trustedValues[] = sprintf('for="%s"'$ip);
  65.         }
  66.         if ($ip !== $remoteAddr) {
  67.             $trustedIps[] = $remoteAddr;
  68.             $trustedValues[] = sprintf('for="%s"'$remoteAddr);
  69.         }
  70.         // set trusted values, reusing as much as possible the global trusted settings
  71.         if (Request::HEADER_FORWARDED $trustedHeaderSet) {
  72.             $trustedValues[0] .= sprintf(';host="%s";proto=%s'$request->getHttpHost(), $request->getScheme());
  73.             $request->headers->set($name $trustedHeaders[Request::HEADER_FORWARDED], $v implode(', '$trustedValues));
  74.             $request->server->set('HTTP_'.strtoupper(str_replace('-''_'$name)), $v);
  75.         }
  76.         if (Request::HEADER_X_FORWARDED_FOR $trustedHeaderSet) {
  77.             $request->headers->set($name $trustedHeaders[Request::HEADER_X_FORWARDED_FOR], $v implode(', '$trustedIps));
  78.             $request->server->set('HTTP_'.strtoupper(str_replace('-''_'$name)), $v);
  79.         } elseif (!(Request::HEADER_FORWARDED $trustedHeaderSet)) {
  80.             Request::setTrustedProxies($trustedProxies$trustedHeaderSet Request::HEADER_X_FORWARDED_FOR);
  81.             $request->headers->set($name $trustedHeaders[Request::HEADER_X_FORWARDED_FOR], $v implode(', '$trustedIps));
  82.             $request->server->set('HTTP_'.strtoupper(str_replace('-''_'$name)), $v);
  83.         }
  84.         // fix the client IP address by setting it to 127.0.0.1,
  85.         // which is the core responsibility of this method
  86.         $request->server->set('REMOTE_ADDR''127.0.0.1');
  87.         // ensure 127.0.0.1 is set as trusted proxy
  88.         if (!IpUtils::checkIp('127.0.0.1'$trustedProxies)) {
  89.             Request::setTrustedProxies(array_merge($trustedProxies, ['127.0.0.1']), Request::getTrustedHeaderSet());
  90.         }
  91.         try {
  92.             return $kernel->handle($request$type$catch);
  93.         } finally {
  94.             // restore global state
  95.             Request::setTrustedProxies($trustedProxies$trustedHeaderSet);
  96.         }
  97.     }
  98. }