이 문서에서는 PHP를 통해 클라이언트 IP를 얻는 방법을 설명합니다
IP를 얻는 기능은 다음과 같습니다.
function getIP() { $realip = ''; //设置默认值 if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $realip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $realip = $_SERVER['HTTP_CLIENT_IP']; } else { $realip = $_SERVER['REMOTE_ADDR']; } preg_match('/^((?:\d{1,3}\.){3}\d{1,3})/',$realip,$match); if($match && ipType($match[0]) == 'InterNet网地址'){ return $match[0]; }else{ return false; } }
//인터넷에서는 IP 주소 사용을 허용합니다
function ipType($ip) { $iplist = explode(".", $ip); if ($iplist[0] >= 224 && $iplist[0] <= 239) return '多播'; if ($iplist[0] >= 240 && $iplist[0] <= 255) return '保留'; if (preg_match('/^198\.51\.100/', $ip)) return 'TEST-NET-2,文档和示例'; if (preg_match('/^203\.0\.113/', $ip)) return 'TEST-NET-3,文档和示例'; if (preg_match('/^192\.(18|19)\./', $ip)) return '网络基准测试'; if (preg_match('/^192\.168/', $ip)) return '专用网络[内部网]'; if (preg_match('/^192\.88\.99/', $ip)) return 'ipv6to4中继'; if (preg_match('/^192\.0\.2\./', $ip)) return 'TEST-NET-1,文档和示例'; if (preg_match('/^192\.0\.0\./', $ip)) return '保留(IANA)'; if (preg_match('/^192\.0\.0\./', $ip)) return '保留(IANA)'; if ($iplist[0] == 172 && $iplist[1] <= 31 && $iplist[1] >= 16) return '专用网络[内部网]'; if ($iplist[0] == 169 && $iplist[1] == 254) return '链路本地'; if ($iplist[0] == 127) return '环回地址'; if ($iplist[0] == 10) return '专用网络[内部网]'; if ($iplist[0] == 0) return '本网络(仅作为源地址时合法)'; return 'InterNet网地址'; }
The 인터넷에서 IP를 얻는 일반적인 함수는 다음과 같습니다.
public function get_real_ip() { static $realip; if (isset($_SERVER)) { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $realip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else if (isset($_SERVER['HTTP_CLIENT_IP'])) { $realip = $_SERVER['HTTP_CLIENT_IP']; } else { $realip = $_SERVER['REMOTE_ADDR']; } } else { if (getenv('HTTP_X_FORWARDED_FOR')) { $realip = getenv('HTTP_X_FORWARDED_FOR'); } else if (getenv('HTTP_CLIENT_IP')) { $realip = getenv('HTTP_CLIENT_IP'); } else { $realip = getenv('REMOTE_ADDR'); } } return $realip; }
'REMOTE_ADDR', 'HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP'의 차이점은 무엇인가요?
1.'REMOTE_ADDR'은 원격 IP이며, 기본값은 클라이언트 IP인 tcp 연결입니다. 클라이언트 IP만 서버에 직접 연결해 주는 것이 가장 정확하고 확실하다고 할 수 있습니다. 상대방이 프록시 서버를 통해 인터넷에 접속하면 발견됩니다. 얻은 것은 프록시 서버 IP입니다.
예: a->b(proxy)->c, c가 'REMOTE_ADDR'을 전달하면 b의 IP만 가져올 수 있고 a의 IP는 가져올 수 없습니다.
2. 대규모 네트워크에서 원래 사용자 IP 또는 프록시 IP 주소를 얻기 위해 'HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP'. HTTP 프로토콜을 확장합니다. 엔터티 헤더가 정의됩니다.
HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 모든 IP는 ","로 구분됩니다. HTTP_CLIENT_IP 고급 익명 프록시에서는 프록시 서버 IP를 나타냅니다. http 프로토콜은 엔터티 헤더를 확장하고 이 값을 수신 측에서 신뢰하므로 수신 측에서 규칙 형식에 따라 이를 입력한다고 신뢰합니다. 다음은 x_forword_for의 예를 사용하여 일반적인 상황에서 이 값이 프로세스를 변경합니다.
위험 지점:
이러한 변수는 http 요청에서 나옵니다: x-forword-for 필드 및 client-ip 필드. 물론 일반 프록시 서버는 rfc 사양에 따라 이러한 값을 전달합니다. 그런데 x-forword-for 값을 사용자가 직접 구성해서 사용자에게 보내면 어떤 값이든 쓸 수 있는 필드가 있는 것과 같습니다. 그리고 서버는 데이터베이스를 직접 읽거나 쓰거나 표시합니다. 이는 입력에 대한 필터링 및 테스트 없이 데이터 소스를 작동한 일반적인 결과와 마찬가지로 위험을 가져올 것입니다.
위 getip 기능의 경우:
클라이언트가 마음대로 IP를 위조할 수 있고 어떤 형식으로든 IP를 전달할 수 있다는 점은 제외합니다. 첫째, 특정 페이지를 설정하고 IP 제한을 적용하는 경우 두 가지 주요 문제가 발생합니다. 상대방은 쉽게 IP를 변경하고 지속적으로 페이지를 요청할 수 있습니다. 둘째, 이러한 데이터를 직접적으로 활용하게 되면 SQL 등록, 크로스 사이트 공격 등의 취약점이 발생하게 됩니다. 첫 번째는 해당 업무에 대한 제한을 설정할 수 있으며, IP 제한은 사용하지 않는 것이 가장 좋습니다. 두 번째로 이러한 유형은 엄청난 사이버 위험을 가져올 수 있습니다. 우리는 그것을 바로잡아야 합니다.
이 글에서는 PHP를 통해 클라이언트 IP를 얻는 방법에 대해 설명합니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트를 참고하세요.
관련 추천:
php에서 die(),exit(), return의 차이점 소개
위 내용은 PHP에서 클라이언트 IP를 얻는 방법 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!