У меня есть проект 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?
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 документы.
Других решений пока нет …