如何在负载均衡器(ssl_termination)后面使用Laravel 5配置SSL?

mah*_*rio 11 php ssl load-balancing laravel laravel-5

我有一个部署到AWS EC2 Web实例的laravel 5项目,位于带有ssl终止的ELB后面.

对于像资产这样的东西,Laravel默认使用当前使用的任何方案.但是,我注意到,因为https流量由ELB解密并通过http转发到EC2节点,所以Laravel认为它当前不使用https,因此使用http作为资产.这显然会造成问题.

根据我的发现,Laravel使用X_FORWARDED_PROTO标头检查这种代理设置.但是我发现这个头不存在,而是有一个HTTP_X_FORWARDED_PROTO头.在研究这个时,我发现在PHP之前预先设置"HTTP_".如果这是真的,那么Laravel为什么不检查它,因为它是一个纯粹的PHP框架?

我读过文章说要使用像Fideloper的Trusted Proxies这样东西,但目前还不清楚为什么Laravel默认不检查这些标题.

如何配置Laravel接受HTTP_X_FORWARDED_*标头,或者将其配置为知道我当前的方案是https?

Ala*_*orm 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');
Run Code Online (Sandbox Code Playgroud)

然后在MyCustomReuqestClass,我扩展了基本请求类并添加了额外的is/is-not安全逻辑

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在不会这样做.在使用该框架几个月之后,我意识到Laravel的请求类将Symfony请求类作为父级,这意味着Laravel请求继承了Symfony请求对象的行为.

这意味着你可以告诉Laravel它应该信任哪些代理服务器

Request::setTrustedProxies(array(
    '192.168.1.52' // IP address of your proxy server
));
Run Code Online (Sandbox Code Playgroud)

此代码告诉Laravel它应该信任哪些代理服务器.之后,它应该拾取标准的"转发"标题.您可以在Symfony文档中阅读有关此功能的更多信息.