2015-05-01 13 views
8

Tôi có dự án laravel 5 được triển khai cho các cá thể web AWS EC2, sau một ELB có chấm dứt ssl.Làm cách nào để định cấu hình SSL với Laravel 5 sau bộ cân bằng tải (ssl_termination)?

Đối với những thứ như nội dung, Laravel theo mặc định sử dụng bất kỳ lược đồ nào hiện đang được sử dụng. Tuy nhiên, tôi đã nhận thấy kể từ khi lưu lượng truy cập https được giải mã bởi ELB và được chuyển tiếp đến các nút EC2 qua http, Laravel không nghĩ rằng nó hiện đang sử dụng https và do đó sử dụng http cho nội dung. Điều này rõ ràng là gây ra vấn đề.

Từ những gì tôi đã tìm thấy, Laravel kiểm tra loại thiết lập proxy này bằng tiêu đề X_FORWARDED_PROTO. Tuy nhiên tôi đã tìm thấy tiêu đề này không tồn tại và thay vào đó có một tiêu đề HTTP_X_FORWARDED_PROTO. Trong researching this, tôi đã thấy rằng việc thêm "HTTP_" là một cái gì đó php. Nếu đó là sự thật, thì tại sao Laravel không kiểm tra nó, vì nó là một khuôn khổ thuần túy php?

Tôi đã đọc các bài viết nói rằng để sử dụng một cái gì đó như Fideloper's Trusted Proxies, nhưng vẫn chưa rõ tại sao Laravel không kiểm tra các tiêu đề này theo mặc định.

Làm cách nào tôi có thể định cấu hình Laravel để chấp nhận tiêu đề HTTP_X_FORWARDED_ * hoặc định cấu hình để biết sơ đồ hiện tại của tôi là https?

Trả lời

6

Laravel không kiểm tra những điều này theo mặc định vì các tiêu đề này có thể được đưa vào một yêu cầu (ví dụ: giả) và tạo ra một vector tấn công lý thuyết vào ứng dụng của bạn. Một người dùng độc hại có thể khiến Laravel nghĩ rằng yêu cầu là hoặc không an toàn, do đó, có thể dẫn đến điều gì đó đang bị xâm phạm.

Khi tôi chạy vào vấn đề này cùng một vài tháng trở lại sử dụng Laravel 4.2, giải pháp của tôi là tạo ra một lớp yêu cầu tùy chỉnh và nói với Laravel để sử dụng nó cô

#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'); 

và sau đó trong MyCustomReuqestClass, tôi mở rộng cơ sở yêu cầu lớp và bổ sung thêm là/là-không an toàn Logic

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(); 
    } 
} 

tôi sẽ không làm điều này ngay bây giờ. Sau khi làm việc với khung công tác trong vài tháng, tôi nhận ra rằng lớp yêu cầu của Laravel có lớp yêu cầu Symfony làm cha mẹ, nghĩa là yêu cầu Laravel thừa hưởng hành vi của đối tượng yêu cầu của Symfony.

Điều đó có nghĩa bạn có thể nói với Laravel mà máy chủ proxy nó nên tin tưởng với một cái gì đó như thế này

Request::setTrustedProxies(array(
    '192.168.1.52' // IP address of your proxy server 
)); 

Mã này nói với Laravel mà máy chủ proxy nó nên tin tưởng. Sau đó, nó sẽ lấy tiêu đề "được chuyển tiếp cho" tiêu chuẩn. Bạn có thể đọc thêm về chức năng này trong Symfony docs.

+0

Có vẻ như điều đó đã xảy ra. Cảm ơn! – maherio

Các vấn đề liên quan