푸른 웹 응용 프로그램에서 호스팅 심포니 4 응용 프로그램을 사용하여 클라이언트 IP를 얻는 방법

시드 :

나는 푸른에서 호스팅되는 웹 응용 프로그램의 모든 로그인 시도 (심포니 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 . 나는 differents의 연결에서 로그인을 시도,하지만 난 항상 IP 것을 얻고있다 172.16.1.1. 어디에서이 IP에서 온 않고 어떻게 클라이언트의 실제 공용 IP를 얻으려면?

시드 :

즉, 사설 IP는 부하 분산 또는 역방향 프록시가 될 수 있습니다.

에서 문서 :

응용 프로그램을 배포 할 때, 당신은 부하 분산 장치 (예 : AWS 탄성 부하 분산) 또는 (캐싱 예 니스) 리버스 프록시 뒤에있을 수 있습니다.

대부분의 경우,이 심포니에 문제가 발생하지 않습니다. 요청이 프록시를 통과 할 때, 특정 요청 정보는 표준 중 하나를 사용하여 전송되는 Forwarded헤더 나 X-Forwarded-*헤더를. 예를 들어, 대신 읽는 REMOTE_ADDR(현재 역방향 프록시의 IP 주소가됩니다) 헤더를 사용자의 실제 IP 표준에 저장됩니다 Forwarded: for="..."헤더 또는 X-Forwarded-For헤더 .

당신이 이러한 헤더를 찾기 위해 심포니을 구성하지 않으면 클라이언트가 HTTPS를 통해 연결되어 있는지 여부, 클라이언트의 IP 주소에 대한 잘못된 정보를 얻을 수 있습니다, 클라이언트의 포트와 호스트 이름이 요청된다.

이 문제를 해결하려면, 하나는 응용 프로그램의 신뢰 프록시에 IP 것을 추가 할 수 있습니다.

심포니 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일 13시 9분 6초] login_attempt.INFO : 사용자 이름 '성공적으로'IP에서 로그인 공용 IP 주소 '[] []

추천

출처http://43.154.161.224:23101/article/api/json?id=343089&siteId=1