방문자로부터 실제 IP를 얻는 방법은 무엇입니까? [복제]
이 질문에 이미 답변이 있습니다.
방문자의 IP 주소를 위해 PHP 코드를 사용하고 있습니다.
<?php echo $_SERVER['REMOTE_ADDR']; ?>
그러나 방문자 가 프록시를 사용할 때 실제 IP 주소를 얻을 수 없습니다 . 이 경우 방문자의 IP 주소를 얻을 수있는 방법이 있습니까?
이 PHP 코드를 사용합니다.
<?PHP
function getUserIP()
{
// Get real visitor IP behind CloudFlare network
if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
$_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}
$client = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote = $_SERVER['REMOTE_ADDR'];
if(filter_var($client, FILTER_VALIDATE_IP))
{
$ip = $client;
}
elseif(filter_var($forward, FILTER_VALIDATE_IP))
{
$ip = $forward;
}
else
{
$ip = $remote;
}
return $ip;
}
$user_ip = getUserIP();
echo $user_ip; // Output IP address [Ex: 177.87.193.134]
?>
이것은 내가 본 가장 일반적인 기술입니다.
function getUserIP() {
if( array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',')>0) {
$addr = explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']);
return trim($addr[0]);
} else {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
}
else {
return $_SERVER['REMOTE_ADDR'];
}
}
숨길 방법이 많기 때문에 항상 올바른 사용자 IP를 얻을 수 있는지 보장은 없습니다.
이것이 내 접근 방식입니다.
function getRealUserIp(){
switch(true){
case (!empty($_SERVER['HTTP_X_REAL_IP'])) : return $_SERVER['HTTP_X_REAL_IP'];
case (!empty($_SERVER['HTTP_CLIENT_IP'])) : return $_SERVER['HTTP_CLIENT_IP'];
case (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) : return $_SERVER['HTTP_X_FORWARDED_FOR'];
default : return $_SERVER['REMOTE_ADDR'];
}
}
사용하는 방법 :
$ip = getRealUserIp();
프록시는 HTTP_X_FORWARDED_FOR
보낼 수 있도록 선택할 사항입니다.
또한 방문자는 IP 주소를 공유 할 수 있습니다. 대학 네트워크, 대기업 및 제 3 세계 / 저예산 ISP는 많은 사용자를 통해 IP를 공유하는 경향이 있습니다.
ipaddress를 얻으려면 다음 코드를 적용하십시오.
if (getenv('HTTP_X_FORWARDED_FOR')) { $pipaddress = getenv('HTTP_X_FORWARDED_FOR');
$ipaddress = getenv('REMOTE_ADDR');
echo "Your Proxy IP address is : ".$pipaddress. "(via $ipaddress)" ; }
else { $ipaddress = getenv('REMOTE_ADDR'); echo "Your IP address is : $ipaddress"; }
------------------------------------------------------------------------
이것은 내 기능입니다.
혜택 :
- $ _SERVER를 사용할 수없는 경우 작동합니다.
- 개인 및 / 또는 예약 된 IP를 필터링합니다.
- X_FORWARDED_FOR에서 전달 된 모든 IP 처리
- CloudFlare와 호환
- 유효한 IP가 없으면 기본값을 설정할 수 있습니다!
- 짧고 간단합니다!
/**
* Get real user ip
*
* Usage sample:
* GetRealUserIp();
* GetRealUserIp('ERROR',FILTER_FLAG_NO_RES_RANGE);
*
* @param string $default default return value if no valid ip found
* @param int $filter_options filter options. default is FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
*
* @return string real user ip
*/
function GetRealUserIp($default = NULL, $filter_options = 12582912) {
$HTTP_X_FORWARDED_FOR = isset($_SERVER)? $_SERVER["HTTP_X_FORWARDED_FOR"]:getenv('HTTP_X_FORWARDED_FOR');
$HTTP_CLIENT_IP = isset($_SERVER)?$_SERVER["HTTP_CLIENT_IP"]:getenv('HTTP_CLIENT_IP');
$HTTP_CF_CONNECTING_IP = isset($_SERVER)?$_SERVER["HTTP_CF_CONNECTING_IP"]:getenv('HTTP_CF_CONNECTING_IP');
$REMOTE_ADDR = isset($_SERVER)?$_SERVER["REMOTE_ADDR"]:getenv('REMOTE_ADDR');
$all_ips = explode(",", "$HTTP_X_FORWARDED_FOR,$HTTP_CLIENT_IP,$HTTP_CF_CONNECTING_IP,$REMOTE_ADDR");
foreach ($all_ips as $ip) {
if ($ip = filter_var($ip, FILTER_VALIDATE_IP, $filter_options))
break;
}
return $ip?$ip:$default;
}
신뢰할 수있는 프록시 인 경우 다음을 시도 할 수 있습니다. (프록시 IP가라고 가정 151.101.2.10
)
<?php
$trustProxyIPs = ['151.101.2.10'];
$clientIP = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL;
if (in_array($clientIP, $trustProxyIPs)) {
$headers = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR'];
foreach ($headers as $key => $header) {
if (isset($_SERVER[$header]) && filter_var($_SERVER[$header], FILTER_VALIDATE_IP)) {
$clientIP = $_SERVER[$header];
break;
}
}
}
echo $clientIP;
이것은 직접 요청 된 클라이언트에 의한 위조 된 전달 헤더를 방지하고 신뢰할 수있는 프록시를 통해 실제 IP를 얻습니다.
예, $_SERVER["HTTP_X_FORWARDED_FOR"]
내 nginx 서버의 프록시 아래에서 내 IP를 보는 방법입니다.
그러나 가장 좋은 방법은 phpinfo()
프록시에서 요청한 페이지 에서 실행 하여 모든 availabe 변수를보고 실제 IP를 전달하는 것이 무엇인지 확인할 수 있습니다.
이것은 Windows 및 Linux에서 작동합니다! 로컬 호스트인지 온라인인지는 중요하지 않습니다.
function getIP() {
$ip = $_SERVER['SERVER_ADDR'];
if (PHP_OS == 'WINNT'){
$ip = getHostByName(getHostName());
}
if (PHP_OS == 'Linux'){
$command="/sbin/ifconfig";
exec($command, $output);
// var_dump($output);
$pattern = '/inet addr:?([^ ]+)/';
$ip = array();
foreach ($output as $key => $subject) {
$result = preg_match_all($pattern, $subject, $subpattern);
if ($result == 1) {
if ($subpattern[1][0] != "127.0.0.1")
$ip = $subpattern[1][0];
}
//var_dump($subpattern);
}
}
return $ip;
}
참고 URL : https://stackoverflow.com/questions/13646690/how-to-get-real-ip-from-visitor
'IT' 카테고리의 다른 글
텍스트 파일에서 줄 바꿈을 어떻게 제거합니까? (0) | 2020.09.15 |
---|---|
배치 확장 내에서 배치 확장을 어떻게 실행 가능합니까? (0) | 2020.09.15 |
PHP에서 WSDL 캐시를 어떻게 지울 수 있습니까? (0) | 2020.09.15 |
JavaScript 확장 및 숫자 변환 (0) | 2020.09.15 |
Javascript에 배열 목록이 있습니까? (0) | 2020.09.15 |