PHP
클라이언트 IP 주소를 찾는 방법
수색…
HTTP_X_FORWARDED_FOR의 올바른 사용
최신 httpoxy 취약점에 비추어 볼 때 널리 사용되는 또 다른 변수가 있습니다.
HTTP_X_FORWARDED_FOR
은 종종 클라이언트 IP 주소를 검색하는 데 사용되지만 추가 검사없이 보안 IP 주소가 사후 화없이 SQL 쿼리 나 인증에 사용될 때 특히 보안 문제가 발생할 수 있습니다.
사용 가능한 대부분의 코드 샘플은 HTTP_X_FORWARDED_FOR
이 실제로 클라이언트 자체에서 제공하는 정보로 간주 될 수 있으므로 클라이언트 IP 주소를 감지 할 수있는 신뢰할 수있는 소스 가 아니라는 사실을 무시합니다. 일부 샘플은 가능한 오용에 대한 경고를 추가하지만 코드 자체에 추가 검사가 부족합니다.
따라서 여기에 PHP로 작성된 함수의 예가 있습니다. 클라이언트가 프록시 뒤에있을 수 있고이 프록시를 신뢰할 수 있음을 알고있는 경우 클라이언트 IP 주소를 검색하는 방법입니다. 신뢰할 수있는 프록시를 모르는 경우 REMOTE_ADDR
사용할 수 있습니다.
function get_client_ip()
{
// Nothing to do without any reliable information
if (!isset($_SERVER['REMOTE_ADDR'])) {
return NULL;
}
// Header that is used by the trusted proxy to refer to
// the original IP
$proxy_header = "HTTP_X_FORWARDED_FOR";
// List of all the proxies that are known to handle 'proxy_header'
// in known, safe manner
$trusted_proxies = array("2001:db8::1", "192.168.50.1");
if (in_array($_SERVER['REMOTE_ADDR'], $trusted_proxies)) {
// Get IP of the client behind trusted proxy
if (array_key_exists($proxy_header, $_SERVER)) {
// Header can contain multiple IP-s of proxies that are passed through.
// Only the IP added by the last proxy (last IP in the list) can be trusted.
$client_ip = trim(end(explode(",", $_SERVER[$proxy_header])));
// Validate just in case
if (filter_var($client_ip, FILTER_VALIDATE_IP)) {
return $client_ip;
} else {
// Validation failed - beat the guy who configured the proxy or
// the guy who created the trusted proxy list?
// TODO: some error handling to notify about the need of punishment
}
}
}
// In all other cases, REMOTE_ADDR is the ONLY IP we can trust.
return $_SERVER['REMOTE_ADDR'];
}
print get_client_ip();
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow