Symfony2使用Amazon负载均衡器和SSL:isSecure()检查错误

时间:2013-09-03 15:27:29

标签: symfony ssl

您好我遇到了Symfony2无法识别来自Amazon AWS的负载均衡器标头的问题,需要使用 requires_channel:https 安全性确定请求是否为SSL配置。

默认情况下,Symfony2 $ request-> isSecure()会查找“X_FORWARDED_PROTO”,但显然没有标准,Amazon AWS负载均衡器使用“HTTP_X_FORWARDED_PROTO”。

我看到有关在配置中设置受信任代理的菜谱文章,但这是针对将特定IP地址列入白名单的,并且不适用于生成动态IP的AWS。另一个功能是,不建议将框架配置设置为包含 trust_proxy_headers:true 。这会通过在仅需要SSL的页面上强制无限重定向来打破我的应用程序。

2 个答案:

答案 0 :(得分:2)

您现在可以使用setTrustedHeaderName()更改标题。此方法允许您更改整个文件中使用的四个标题。

const HEADER_CLIENT_IP    = 'client_ip'; // defaults 'X_FORWARDED_FOR'
const HEADER_CLIENT_HOST  = 'client_host'; // defaults 'X_FORWARDED_HOST'
const HEADER_CLIENT_PROTO = 'client_proto'; // defaults 'X_FORWARDED_PROTO'
const HEADER_CLIENT_PORT  = 'client_port'; // defaults 'X_FORWARDED_PORT'

以上摘自Request类,表示可用于上述方法的密钥。

// $request is instance of HttpFoundation\Request;

$request->setTrustedHeaderName('client_proto', 'HTTP_X_FORWARDED_PROTO');

也就是说,在撰写本文时,使用"symfony/http-foundation": "2.5.*"以下代码正确地确定请求在AWS Load Balancer后面是否安全。

// All IPs (*)
// $proxies = [$request->getClientIp()];

// Array of CIDR pools from load balancer
// EC2 -> Network & Security -> Load Balancers
//  -> X -> Instances (tab) -> Availability Zones
//  -> Subnet (column)

$proxies = ['172.x.x.0/20'];

$request->setTrustedProxies($proxies);

var_dump($request->isSecure()); // bool(true)

答案 1 :(得分:1)

你是对的X_FORWARDED_PROTO标题被硬编码到HttpFoundation\Request而 - 据我所知 - 目前无法覆盖symfony中的请求类。

此处有关于此主题的discussion/RFC,并且有一个开放式pull-request可使用RequestFactory解决此问题。