Skip to content

Instantly share code, notes, and snippets.

@jellis
Created June 7, 2017 04:21
Show Gist options
  • Save jellis/d3ede966dfab44513a8feff680469508 to your computer and use it in GitHub Desktop.
Save jellis/d3ede966dfab44513a8feff680469508 to your computer and use it in GitHub Desktop.
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Config\Repository;
use Illuminate\Http\Request;
class ValidProxies
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
*
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
// Set trusted header names
foreach ($this->getTrustedHeaders() as $headerKey => $headerName) {
$request->setTrustedHeaderName($headerKey, $headerName);
}
$request->setTrustedProxies($this->getTrustedProxies($request->getClientIps()));
// Ensure only secure URLs are used
// Outcome of using ELB in front of application
if (!app()->environment('local') && !$request->secure()) {
return redirect()->secure($request->getRequestUri());
}
return $next($request);
}
/**
* Return an array of trusted proxy IP addresses.
*
* @param array $clientIpAddresses Array of client IP addresses retrieved
* *prior* to setting trusted proxy
*
* @return array
*/
protected function getTrustedProxies(array $clientIpAddresses = [])
{
$trustedProxies = config('trustedproxy.proxies');
// To trust all proxies, we set trusted proxies to all IP addresses.
if ($trustedProxies === '*') {
return $clientIpAddresses;
}
return (array) $trustedProxies;
}
/**
* Get trusted header names.
*
* @return array
*/
protected function getTrustedHeaders()
{
$trustedHeaderNames = config('trustedproxy.headers');
/*
* In case the user does not pass an array of header names we
* will default to an empty array. This will force defaults from
* class \Symfony\Component\HttpFoundation\Request::$trustedHeaders
*/
$trustedHeaderNames = is_array($trustedHeaderNames) ? $trustedHeaderNames : [];
return $trustedHeaderNames;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment