繁体   English   中英

如何使用托管在 Azure Web App 上的 Symfony 4 应用程序获取客户端 IP

[英]How to get the client IP using a Symfony 4 application hosted on Azure Web App

我想记录 Azure 上托管的 Web 应用程序(Symfony 4.1)上的每次登录尝试。

基于这个问题,为了获取客户端 IP,我正在使用:

// $requestStack being Symfony\Component\HttpFoundation\RequestStack
$ip = $this->requestStack->getMasterRequest()->getClientIp();

但是,日志告诉:

[2020-03-10 10:55:56] login_attempt.INFO: 用户 'username' 从 ip '172.16.1.1' [] [] 成功登录

如您所见,这是一个私有 IP 我试图从不同的连接登录,但我总是得到那个 IP, 172.16.1.1 这个IP从哪里来,如何获取客户端的真实公网IP?

该私有 IP 可以是负载均衡器或反向代理。

文档

当您部署应用程序时,您可能会使用负载均衡器(例如 AWS Elastic Load Balancing)或反向代理(例如用于缓存的 Varnish)。

大多数情况下,这不会对 Symfony 造成任何问题。 但是,当请求通过代理时,某些请求信息将使用标准Forwarded标头或X-Forwarded-*标头发送。 例如,用户的真实 IP 将存储在标准的Forwarded: for="..."标头或X-Forwarded-For ,而不是读取REMOTE_ADDR标头(现在将是您的反向代理的 IP 地址)标题

如果您不配置 Symfony 来查找这些标头,您将获得有关客户端 IP 地址的错误信息,无论客户端是否通过 HTTPS 连接,客户端的端口和所请求的主机名。

为了解决这个问题,可以在应用程序的受信任代理中添加该 IP。

在 Symfony 4 中,这可以通过以下方式完成:

// index.php

// creates the $_SERVER['TRUSTED_PROXIES'] entry if it doesn't exist/is empty with the IP of the proxy to trust as value
// or append ',the ip' to the existing entry
$_SERVER['TRUSTED_PROXIES'] = (empty($_SERVER['TRUSTED_PROXIES']) ? '' : ($_SERVER['TRUSTED_PROXIES'] . ',')) . '172.16.1.1';

// This is already in index.php, just let it doing its job
if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) {
    Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
}

现在,在日志中:

[2020-03-10 13:09:06] login_attempt.INFO:用户'username'从ip'公共ip地址'成功登录[][]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM