PHP Laravel API - Как ограничить запрос количеством доверенных хостов? - PullRequest
0 голосов
/ 18 сентября 2018

Я видел следующий метод, доступный в моем Laravel Lumen API 5.7

Request::setTrustedHosts($hostPatterns)

Я хотел бы использовать его в промежуточном программном обеспечении, чтобы ограничивать запросы определенным списком клиентов.

Как мне поступить?

Есть ли какой-нибудь эквивалент для существующего $request->isFromTrustedProxy() метода, который, как я считаю, предназначен для совершенно других вещей?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

На основе ответа @eResourcesInc, потому что я хотел ограничить запрос определенными доверенными клиентами (например, некоторыми родственными серверами, использующими API), вот что я придумал:

Создал новую запись в файле .env с моимтребуемые имена хостов доверенных клиентов

TRUSTED_CLIENTS=specific.example.com|*.whatever.net|8-8-8-8.static.example.org

Затем создал TrustedAccess промежуточное ПО в App\Http\Middleware\TrustedAccess.php

namespace App\Http\Middleware;

use Illuminate\Http\Response;
use Closure;

class TrustedAccess
{
    private $trustedClients;

    public function __construct()
    {
        $this->trustedClients = [];
        if (env('TRUSTED_CLIENTS')) {
            $list = explode('|', env('TRUSTED_CLIENTS'));
            if ($list !== false && !empty($list)) {
                $this->trustedClients = $list;
            }
        }
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(env('APP_ENV')=='production') {
            $clientHostname = gethostbyaddr($request->getClientIp());
            $isTrusted = false;
            foreach ($this->trustedClients as $trustedClientHostname) {
                if (self::isHostnameMatch($clientHostname, $trustedClientHostname)) {
                    $isTrusted = true;
                    break;
                }
            }
            if ($isTrusted) {
                return $next($request);
            } else {
                return response()->json(['error'=>'Unauthorised'], Response::HTTP_UNAUTHORIZED);
            }
        } else {
            return $next($request);
        }
    }

    private static function isHostnameMatch($hostname, $trustedHostname)
    {
        if ($trustedHostname == '*' || $hostname == $trustedHostname) {
            return true;
        }
        // check if wildcard subdomain
        $subdomainDelimiterPosition = strpos($hostname, '.');
        if(strlen($trustedHostname) < 2 || $subdomainDelimiterPosition === false) {
            return false;
        }
        if (substr($trustedHostname, 0, 2) == '*.') {
            if (substr($trustedHostname, 1) == substr($hostname, $subdomainDelimiterPosition)) {
                return true;
            }
        }
        return false;
    }
}

Для Lumen я зарегистрировал промежуточное ПО с помощью клавиши быстрого доступа вфайл bootstrap/app.php:

$app->routeMiddleware([
    'trusted' => App\Http\Middleware\TrustedAccess::class,
]);

Затем я применил его к маршрутам следующим образом:

$router->get('url/I/want/to/limit', ['middleware' => 'trusted', function () {
    //
}]);

Вот и все.Пожалуйста, прокомментируйте, если есть предложения!

0 голосов
/ 18 сентября 2018

Предполагая, что вы ограничиваете гостей IP-адресом или чем-то подобным, вы можете создать промежуточное ПО, например:

namespace App\Http\Middleware;

use Closure;

class LimitAccess {

    public function handle($request, Closure $next)
    {
        if(env('APP_ENV')=='production') {
            $ipArray = ['127.0.0.1',...]; //Add trusted IP addresses here
            if (in_array(\Request::ip(), $ipArray)) {
                return $next($request);
            } else {
                return response("You are not allowed here!", 503);
            }
        } else {
            return $next($request);
        }
    }
}

Для Laravel вы должны зарегистрировать это промежуточное ПО в Http \ Kernel.php.в массиве $ middlewareGroups, например:

protected $middlewareGroups = [
    'api' => [
        \App\Http\Middleware\LimitAccess::class
    ]
];

Для Lumen вы можете зарегистрироваться, указав промежуточное ПО с помощью клавиши быстрого доступа в файле bootstrap / app.php:

$app->routeMiddleware([
    'limit' => App\Http\Middleware\LimitAccess::class,
]);

Затем вы примените его к нужным маршрутам следующим образом:

$router->get('url/you/want/to/limit', ['middleware' => 'limit', function () {
    //
}]);

Это должно сделать именно то, что вы хотите.Очевидно, вы можете изменить массив IP-адресов на любой другой.

...