Бывает, что нужно отсеивать пользователей от некоторого функционала сайта, которые заходят на него через PROXY сервера. Есть несколько методов решения этого вопроса. Можно настроить сам сервер для этого функционала, а можно воспользоваться самим PHP для этого.
<?php
// Script php : Detection Proxy
@set_time_limit(0);
@error_reporting(E_ALL | E_NOTICE);
function get_ip() {
if($_SERVER) {
if($_SERVER['HTTP_X_FORWARDED_FOR'])
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
elseif($_SERVER['HTTP_CLIENT_IP'])
$ip = $_SERVER['HTTP_CLIENT_IP'];
else
$ip = $_SERVER['REMOTE_ADDR'];
}
else {
if(getenv('HTTP_X_FORWARDED_FOR'))
$ip = getenv('HTTP_X_FORWARDED_FOR');
elseif(getenv('HTTP_CLIENT_IP'))
$ip = getenv('HTTP_CLIENT_IP');
else
$ip = getenv('REMOTE_ADDR');
}
return $ip;
}
function detect_proxy($myIP) {
$scan_headers = array(
'HTTP_VIA',
'HTTP_X_FORWARDED_FOR',
'HTTP_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_FORWARDED',
'HTTP_CLIENT_IP',
'HTTP_FORWARDED_FOR_IP',
'VIA',
'X_FORWARDED_FOR',
'FORWARDED_FOR',
'X_FORWARDED',
'FORWARDED',
'CLIENT_IP',
'FORWARDED_FOR_IP',
'HTTP_PROXY_CONNECTION'
);
$flagProxy = false;
$libProxy = 'No';
foreach($scan_headers as $i)
if($_SERVER[$i]) $flagProxy = true;
if ( in_array($_SERVER['REMOTE_PORT'], array(8080,80,6588,8000,3128,553,554))
|| @fsockopen($_SERVER['REMOTE_ADDR'], 80, $errno, $errstr, 30))
$flagProxy = true;
// Proxy LookUp
if ( $flagProxy == true &&
isset($_SERVER['REMOTE_ADDR']) &&
!empty($_SERVER['REMOTE_ADDR']) )
// Transparent Proxy
// REMOTE_ADDR = proxy IP
// HTTP_X_FORWARDED_FOR = your IP
if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) &&
!empty($_SERVER['HTTP_X_FORWARDED_FOR']) &&
$_SERVER['HTTP_X_FORWARDED_FOR'] == $myIP
)
$libProxy = 'Transparent Proxy';
// Simple Anonymous Proxy
// REMOTE_ADDR = proxy IP
// HTTP_X_FORWARDED_FOR = proxy IP
else if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) &&
!empty($_SERVER['HTTP_X_FORWARDED_FOR']) &&
$_SERVER['HTTP_X_FORWARDED_FOR'] == $_SERVER['REMOTE_ADDR']
)
$libProxy = 'Simple Anonymous (Transparent) Proxy';
// Distorting Anonymous Proxy
// REMOTE_ADDR = proxy IP
// HTTP_X_FORWARDED_FOR = random IP address
else if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) &&
!empty($_SERVER['HTTP_X_FORWARDED_FOR']) &&
$_SERVER['HTTP_X_FORWARDED_FOR'] != $_SERVER['REMOTE_ADDR']
)
$libProxy = 'Distorting Anonymous (Transparent) Proxy';
// Anonymous Proxy
// HTTP_X_FORWARDED_FOR = not determined
// HTTP_CLIENT_IP = not determined
// HTTP_VIA = determined
else if ( $_SERVER['HTTP_X_FORWARDED_FOR'] == '' &&
$_SERVER['HTTP_CLIENT_IP'] == '' &&
!empty($_SERVER['HTTP_VIA'])
)
$libProxy = 'Anonymous Proxy';
// High Anonymous Proxy
// REMOTE_ADDR = proxy IP
// HTTP_X_FORWARDED_FOR = not determined
else
$libProxy = 'High Anonymous Proxy';
return $libProxy;
}
$ip = get_ip();
echo 'Proxy Server Detection<br>';
echo '=================<br><br>';
$typeProxy = detect_proxy($ip);
echo 'Use Proxy Server : '.$typeProxy.'<br>';
echo '<br>';
echo 'Brief IP Information'.'<br>';
echo '--------------------'.'<br>';
echo 'Your IP : '.$ip.'<br>';
echo 'Language : '.$_SERVER['HTTP_ACCEPT_LANGUAGE'].'<br>';
echo '<br>';
echo 'Detail IP Information'.'<br>';
echo '---------------------'.'<br>';
echo 'HTTP_ACCEPT : '.$_SERVER['HTTP_ACCEPT'].'<br>';
echo 'HTTP_ACCEPT_ENCODING : '.$_SERVER['HTTP_ACCEPT_ENCODING'].'<br>';
echo 'HTTP_ACCEPT_LANGUAGE : '.$_SERVER['HTTP_ACCEPT_LANGUAGE'].'<br>';
echo 'HTTP_ACCEPT_CHARSET : '.$_SERVER['HTTP_ACCEPT_CHARSET'].'<br>';
echo 'HTTP_CONNECTION : '.$_SERVER['HTTP_CONNECTION'].'<br>';
echo 'HTTP_HOST : '.$_SERVER['HTTP_HOST'].'<br>';
echo 'HTTP_KEEP_ALIVE : '.$_SERVER['HTTP_KEEP_ALIVE'].'<br>';
echo 'HTTP_USER_AGENT : '.$_SERVER['HTTP_USER_AGENT'].'<br>';
echo 'REMOTE_HOST : '.@gethostbyaddr($_SERVER['REMOTE_ADDR']).'<br>';
echo 'REMOTE_PORT : '.$_SERVER['REMOTE_PORT'].'<br>';
echo '<br>';
echo 'REMOTE_ADDR : '.$_SERVER['REMOTE_ADDR'].'<br>';
echo 'HTTP_VIA : '.$_SERVER['HTTP_VIA'].'<br>';
echo 'HTTP_X_FORWARDED_FOR : '.$_SERVER['HTTP_X_FORWARDED_FOR'].'<br>';
echo 'HTTP_PROXY_CONNECTION : '.$_SERVER['HTTP_PROXY_CONNECTION'].'<br>';
echo 'HTTP_CLIENT_IP : '.$_SERVER['HTTP_CLIENT_IP'].'<br>';
?>