【问题标题】:How do I configure SSL with Laravel 5 behind a load balancer (ssl_termination)?如何在负载均衡器 (ssl_termination) 后面使用 Laravel 5 配置 SSL?
【发布时间】:2015-07-11 14:26:36
【问题描述】:

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

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

根据我的发现,Laravel 使用 X_FORWARDED_PROTO 标头检查这种代理设置。但是我发现这个标头不存在,而是有一个 HTTP_X_FORWARDED_PROTO 标头。在researching this 中,我发现添加“HTTP_”是php 所做的。如果这是真的,那为什么 Laravel 不检查它,因为它是一个纯粹的 php 框架?

我读过文章说要使用 Fideloper's Trusted Proxies 之类的东西,但不清楚为什么 Laravel 默认不检查这些标头。

如何配置 Laravel 以接受 HTTP_X_FORWARDED_* 标头,或者以其他方式配置它以了解我当前的方案是 https?

【问题讨论】:

    标签: php laravel ssl laravel-5 load-balancing


    【解决方案1】:

    默认情况下,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 安全逻辑

    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 docs 中阅读有关此功能的更多信息。

    【讨论】:

    • 是的,看起来就是这样。谢谢!
    猜你喜欢
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2023-03-24
    • 2020-07-03
    • 2020-12-28
    • 1970-01-01
    相关资源
    最近更新 更多