web-dev-qa-db-fra.com

Laravel 5.6 Erreur TrustedProxies

J'ai mis à jour de L5.5 vers L5.6 aujourd'hui (mise à jour des composants Symfony vers v4 dans le processus). J'ai également mis à jour le package fideloper/proxy Vers la version 4.0 à partir du guide officiel de mise à niveau Laravel 5.6.

Après cela, je commence à obtenir cette erreur: Type error: Argument 2 passed to Symfony\Component\HttpFoundation\Request::setTrustedProxies() must be of the type integer, array given, called in /var/www/html/vendor/fideloper/proxy/src/TrustProxies.php on line 54

Symfony\Component\HttpFoundation\Request::setTrustedProxies() de Symfony 4 attend en effet un entier (bitmask) comme 2ème argument:

/**
* Sets a list of trusted proxies.
*
* You should only list the reverse proxies that you manage directly.
*
* @param array $proxies          A list of trusted proxies
* @param int   $trustedHeaderSet A bit field of Request::HEADER_*, to set which headers to trust from your proxies
*
* @throws \InvalidArgumentException When $trustedHeaderSet is invalid
*/
public static function setTrustedProxies(array $proxies, int $trustedHeaderSet)
{
    self::$trustedProxies = $proxies;
    self::$trustedHeaderSet = $trustedHeaderSet;
}

et fideloper/proxy 4.0 donne en effet un tableau au lieu d'un entier dans cette fonction:

public function handle(Request $request, Closure $next)
{
    $request::setTrustedProxies([], $this->getTrustedHeaderNames()); // Reset trusted proxies between requests
    $this->setTrustedProxyIpAddresses($request);
    return $next($request);
}

et

/**
 * Retrieve trusted header name(s), falling back to defaults if config not set.
 *
 * @return array
 */
protected function getTrustedHeaderNames()
{
    return $this->headers ?: $this->config->get('trustedproxy.headers');
}

Je ne peux donc pas comprendre s'il s'agit d'un bogue dans fideloper/proxy Ou s'il me manque quelque chose?

19
SkifAlef

Comme indiqué dans le guide de mise à nivea , vous devez définir la propriété $ headers dans App\Http\Middleware\TrustProxies sur un propriété de bit.

Les constantes sont définies dans Symfony\Component\HttpFoundation\Request .

const HEADER_FORWARDED = 0b00001; // When using RFC 7239
const HEADER_X_FORWARDED_FOR = 0b00010;
const HEADER_X_FORWARDED_Host = 0b00100;
const HEADER_X_FORWARDED_PROTO = 0b01000;
const HEADER_X_FORWARDED_PORT = 0b10000;
const HEADER_X_FORWARDED_ALL = 0b11110; // All "X-Forwarded-*" headers
const HEADER_X_FORWARDED_AWS_ELB = 0b11010; // AWS ELB doesn't send X-Forwarded-Host

Dans le guide de mise à niveau, HEADER_X_FORWARDED_ALL est utilisé mais vous pouvez utiliser une combinaison des valeurs de bits.

11
WJDev

Après quelques recherches (comparaison de Winmerge avec une nouvelle installation de Laravel 5.6), cela revient à une différence dans les fichiers app\Http\Middleware\TrustProxies.php:

Laravel 5.5:

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array
     */
    protected $proxies;

    /**
     * The current proxy header mappings.
     *
     * @var array
     */
    protected $headers = [
        Request::HEADER_FORWARDED => 'FORWARDED',
        Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
        Request::HEADER_X_FORWARDED_Host => 'X_FORWARDED_Host',
        Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
        Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
    ];
}

Laravel 5.6:

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array
     */
    protected $proxies;

    /**
     * The headers that should be used to detect proxies.
     *
     * @var string
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

Ergo, définissez protected $headers = Request::HEADER_X_FORWARDED_ALL; selon Laravel version 5.6

23
Inigo

Ouvrir app\Http\Middleware\TrustProxies.php.

Modifiez ce qui suit

protected $headers = [
    Request::HEADER_FORWARDED => 'FORWARDED',
    Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
    Request::HEADER_X_FORWARDED_Host => 'X_FORWARDED_Host',
    Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
    Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
];

à

protected $headers = Request::HEADER_X_FORWARDED_ALL;
13
aphoe

Veuillez également garder à l'esprit que lors de la mise à niveau de Laravel 5.5 vers 5.6 Laravel crée un nouveau fichier appelé TrustProxies.php avec le même espace de noms que TrustedProxies, c'est-à-dire "App\Http\Middleware\TrustProxies". Dans Laravel 5.6, le TrustedProxies.php le fichier est correct comme mentionné ci-dessus.
Le TrustProxies.php n'est pas. Mais s'ils existent tous les deux dans le même espace de noms, alors Laravel utilisera celui qu'il trouve en premier, et c'est le TrustProxies.php fichier.

Si vous disposez des deux, supprimez TrustProxies.php, et assurez-vous que TrustedProxies.php a les changements corrects mentionnés ci-dessus.

Passez une bonne journée. Christian

2