我有一个laravel 5项目部署到AWS EC2 Web实例,位于带有ssl终止的ELB后面。
对于资产之类的东西,Laravel默认使用当前使用的任何方案。但是,我已经注意到,由于ELB解密https流量并通过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?
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它应该信任哪些代理服务器。此后,它应该提取标准的“ forwarded for”标题。您可以在Symfony文档中阅读有关此功能的更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句