Как настроить SSL с Laravel 5 за балансировщиком нагрузки (ssl_termination)?

У меня есть проект 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 framework?

Я читал статьи, в которых говорится, что нужно использовать что-то вроде Надежные прокси Фиделопера, пока неясно, почему Laravel по умолчанию не проверяет эти заголовки.

Как я могу настроить Laravel для приема заголовков HTTP_X_FORWARDED_ * или настроить его так, чтобы моя текущая схема была https?

9

Решение

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Я расширил базовый класс запросов и добавил дополнительную логику is / is-not secure

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, каким прокси-серверам он должен доверять. После этого он должен забрать стандартные заголовки «forwarded for». Вы можете прочитать больше об этой функции в Symfony документы.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]