У меня есть проект laravel 5, развернутый в веб-экземплярах AWS EC2, за ELB с завершением ssl.
Для таких вещей, как активы, Laravel по умолчанию использует любую используемую схему. Тем не менее, я заметил, что, поскольку трафик https расшифровывается ELB и перенаправляется в узлы EC2 через http, Laravel не считает, что в настоящее время он использует https и, таким образом, использует http для активов. Это, очевидно, вызывает проблемы.
Из того, что я нашел, Laravel проверяет эту настройку прокси-сервера, используя заголовок X_FORWARDED_PROTO. Однако я нашел, что этот заголовок не существует, и вместо него есть заголовок HTTP_X_FORWARDED_PROTO. Изучая это , я обнаружил, что добавление «HTTP_» – это что-то, что делает php. Если это правда, то почему Laravel не проверяет это, поскольку это чисто php-структура?
Я читал статьи, говорящие, чтобы использовать что-то вроде доверенных прокси Fideloper , но неясно, почему Laravel не проверяет эти заголовки по умолчанию.
Как настроить Laravel для приема заголовков HTTP_X_FORWARDED_ * или настроить его, чтобы узнать, что моя текущая схема – https?
Laravel не проверяет их по умолчанию, потому что эти заголовки могут быть тривиально введены в запрос (т. Е. Поддельные), и это создает теоретический вектор атаки в ваше приложение. Злоумышленник может заставить Laravel думать, что запрос является или не является безопасным, что, в свою очередь, может привести к компрометации.
Когда я столкнулся с этой проблемой еще несколько месяцев назад, используя Laravel 4.2, я решил создать собственный класс запросов и сообщить Laravel о его использовании
#File: bootstrap/start.php //for custom secure behavior -- laravel autoloader doesn't seem here yet? require_once realpath(__DIR__) . 'path/to/my/MyCustomRequest.php'; Illuminate\Foundation\Application::requestClass('MyCustomRequest');
а затем в MyCustomReuqestClass
, я расширил класс базового запроса и добавил дополнительную / не-безопасную логику
class Request extends \Illuminate\Http\Request { /** * Determine if the request is over HTTPS, or was sent over HTTPS * via the load balancer * * @return bool */ public function secure() { $secure = parent::secure(); //extra custom logic to determine if something is, or is not, secure //... return $secure; } public function isSecure() { return $this->secure(); } }
Я бы этого не сделал . После работы с каркасом в течение нескольких месяцев я понял, что класс запроса Laravel имеет класс запроса Symfony в качестве родителя, то есть запрос Laravel наследует поведение объекта запроса Symfony.
Это означает, что вы можете сказать Laravel, какие прокси-серверы ему должны доверять, например,
Request::setTrustedProxies(array( '192.168.1.52' // IP address of your proxy server ));
Этот код сообщает Laravel, какие доверенные серверы ему следует доверять. После этого он должен забрать стандартные «переадресованные» заголовки. Вы можете узнать больше об этой функциональности в документах Symfony .