|
|
|
| я использую такой код
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_CLIENT_IP']) && (preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['HTTP_CLIENT_IP']) == 0 || preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['REMOTE_ADDR']) != 0)){
if (strtok($_SERVER['HTTP_X_FORWARDED_FOR'], '.') != strtok($_SERVER['HTTP_CLIENT_IP'], '.') && '.' . strtok($_SERVER['HTTP_X_FORWARDED_FOR'], '.') == strrchr($_SERVER['HTTP_CLIENT_IP'], '.') && (preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['HTTP_X_FORWARDED_FOR']) == 0 || preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['REMOTE_ADDR']) != 0)) {
$_SERVER['REMOTE_ADDR'] = implode('.', array_reverse(explode('.', $_SERVER['HTTP_CLIENT_IP'])));
} else {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CLIENT_IP'];
}
}
if (!empty($_SERVER['HTTP_CLIENT_IP']) && (preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['HTTP_CLIENT_IP']) == 0 || preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['REMOTE_ADDR']) != 0)){
if (strtok($_SERVER['REMOTE_ADDR'], '.') != strtok($_SERVER['HTTP_CLIENT_IP'], '.')){
$_SERVER['REMOTE_ADDR'] = implode('.', array_reverse(explode('.', $_SERVER['HTTP_CLIENT_IP'])));
} else {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CLIENT_IP'];
}
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false){
$ips = array_reverse(explode(', ', $_SERVER['HTTP_X_FORWARDED_FOR']));
foreach ($ips as $i => $ip){
if (preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $ip) != 0 && preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['REMOTE_ADDR']) == 0) continue;
$_SERVER['REMOTE_ADDR'] = trim($ip);
break;
}
} elseif (preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['HTTP_X_FORWARDED_FOR']) == 0 || preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['REMOTE_ADDR']) != 0) $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (!isset($_SERVER['REMOTE_ADDR'])) $_SERVER['REMOTE_ADDR'] = $_SERVER['GEOIP_ADDR'];
|
проблема состоит в том, что по статистике li.ru ip отличаються на 20% | |
|
|
|
|
|
|
|
для: tester
(31.07.2008 в 14:17)
| | Проверяйте переменную REMOTE_ADDR - адрес клиента, HTTP_X_FORWARDED_FOR - если эта переменная установлена, клиент использует "прозрачный прокси", тогда
REMOTE_ADDR - адрес прокси, а HTTP_X_FORWARDED_FOR - истинный адрес клиента | |
|
|
|
|
|
|
|
для: levsha
(31.07.2008 в 19:16)
| | Лучше это все не менять местами...
Хранить 2 IP.
1) Откуда пришел запрос REMOTE_ADDR
2) ВОЗМОЖНО истинный адрес, HTTP_X_FORWARDED_FOR , если он есть.
т.к. 2IP можно очень легко изменить. Лучше не верить им. просто показывать. | |
|
|
|
|
|
|
|
для: tester
(31.07.2008 в 14:17)
| | HTTP_X_FORWARDED_FOR и HTTP_CLIENT_IP указаны в http заголовках. Чаще всего их наличие указывает на то, что пользователь использует прокси. Но если вам нужно ограничить доступ или что-то подобное, то на них полагаться не стоит, так как их легко подделать просто добавив строку в http заголовок. | |
|
|
|