簡體   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