我有一个laravel 5项目部署到AWS实例中,在EC2终止的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接受https报头,或者如何配置它使其知道我当前的方案是HTTP_X_FORWARDED_*?
发布于 2015-05-02 02:49:06
默认情况下,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的request类将Symfony请求类作为父请求,这意味着Laravel请求继承Symfony请求对象的行为。
这意味着你可以告诉Laravel它应该信任哪个代理服务器,如下所示
Request::setTrustedProxies(array(
'192.168.1.52' // IP address of your proxy server
));这段代码告诉Laravel它应该信任哪个代理服务器。在此之后,它应该拾取标准的"forwarded for“报头。您可以在Symfony docs中阅读有关此功能的更多信息。
https://stackoverflow.com/questions/29992233
复制相似问题