AzureのWebアプリケーションでホストされているsymfonyの4アプリケーションを使用して、クライアントのIPを取得する方法

シド:

私は、Azureの上でホストされているWebアプリケーション(symfonyの4.1)上のすべてのログイン試行をログに記録します。

基づいて、この質問クライアントのIPを取得するには、私が使用しています:

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

しかし、ログは言います:

[2020年3月10日午前10時55分56秒] login_attempt.INFO:成功したIPからのログインユーザー 'ユーザー名' '172.16.1.1' [] []は、

あなたが気づくことができるように、これはあるプライベートIP私は貴様の接続からのログインを試みたが、私はいつも、そのIPを取得しています172.16.1.1このIPはどこから来るのか、クライアントの真のパブリックIPを取得する方法?

シド:

プライベートIPは、ロードバランサまたはリバースプロキシすることができます。

以下からのドキュメント

アプリケーションをデプロイするときは、ロードバランサ(例えばAWS弾性負荷分散)または(キャッシュ用などワニス)リバースプロキシの背後かもしれません。

ほとんどの部分については、これはsymfonyで問題が発生することはありません。要求がプロキシを通過するときには、特定の要求情報は、標準のいずれかで使用して送信されるForwardedヘッダまたはX-Forwarded-*ヘッダを。たとえば、代わりに読んでREMOTE_ADDR(今、あなたのリバースプロキシのIPアドレスになります)ヘッダを、ユーザーの本当のIPを標準に格納されるForwarded: for="..."ヘッダやX-Forwarded-Forヘッダ

あなたはこれらのヘッダを探すためにsymfonyのを設定しない場合、あなたは、クライアントがHTTPS経由で接続されているかどうか、クライアントのIPアドレスに関する誤った情報を得るでしょう、クライアントのポートとホスト名が要求されています。

これを修正するためには、アプリケーションの信頼されたプロキシで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年3月10日夜01時09分06秒] login_attempt.INFO:ユーザーズ名'が正常のIPからログインしてパブリックIPアドレス ' [] []

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=343091&siteId=1