Как определить IP с которого поступил POST запрос?

Здравствуйте. В процессе написания php-вубхука появилась необходимость точно определять IP-адрес с которого был получен запрос POST, и в случае несовпадения отклонять его. Для этого в коде хука использую следующее:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

        $inputJSON = file_get_contents('php://input');
        $input = json_decode($inputJSON, TRUE);
        if (!empty($_SERVER['HTTP_X_REAL_IP']))
        {
            $host=$_SERVER['HTTP_X_REAL_IP'];
        }
        elseif (!empty($_SERVER['HTTP_CLIENT_IP']))
        {
            $host=$_SERVER['HTTP_CLIENT_IP'];
        }
        elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
        {
            $host=$_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        else
        {
            $host=$_SERVER['REMOTE_ADDR'];
        }
if($host !== "138.68.83.116"){http_response_code(200);die();}else{

Суть вопроса, с такой логикой определения IP есть ли вероятность получить неверный IP (прокси), или вообще не получить его, т.е. определить неверно.

Заранее спасибо.
  • Вопрос задан
  • 5008 просмотров
Пригласить эксперта
Ответы на вопрос 2
ZnicH
@ZnicH
Программист
Тут интересно описано о проксировании https://habr.com/ru/post/177113/
У нас в проекте получаем так:

function fn_get_ip($return_int = false)
{
    $forwarded_ip = '';
    $fields = array(
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_FORWARDED_FOR',
        'HTTP_FORWARDED',
        'HTTP_forwarded_ip',
        'HTTP_X_COMING_FROM',
        'HTTP_COMING_FROM',
        'HTTP_CLIENT_IP',
        'HTTP_VIA',
        'HTTP_XROXY_CONNECTION',
        'HTTP_PROXY_CONNECTION');

    $matches = array();
    foreach ($fields as $f) {
        if (!empty($_SERVER[$f])) {
            preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/", $_SERVER[$f], $matches);
            if (!empty($matches) && !empty($matches[0]) && $matches[0] != $_SERVER['REMOTE_ADDR']) {
                $forwarded_ip = $matches[0];
                break;
            }
        }
    }

    $ip = array('host' => $forwarded_ip, 'proxy' => $_SERVER['REMOTE_ADDR']);

    if ($return_int) {
        foreach ($ip as $k => $_ip) {
            $ip[$k] = empty($_ip) ? 0 : sprintf("%u", ip2long($_ip));
        }
    }

    if (empty($ip['host']) || !fn_is_inet_ip($ip['host'], $return_int)) {
        $ip['host'] = $ip['proxy'];
        $ip['proxy'] = $return_int ? 0 : '';
    }

    return $ip;
}


function fn_is_inet_ip($ip, $is_int = false)
{
    if ($is_int) {
        $ip = long2ip($ip);
    }
    $_ip = explode('.', $ip);

    return
        ($_ip[0] == 10 ||
        ($_ip[0] == 172 && $_ip[1] >= 16 && $_ip[1] <= 31) ||
        ($_ip[0] == 192 && $_ip[1] == 168) ||
        ($_ip[0] == 127 && $_ip[1] == 0 && $_ip[2] == 0 && $_ip[3] == 1) ||
        ($_ip[0] == 255 && $_ip[1] == 255 && $_ip[2] == 255 && $_ip[3] == 255))
        ? false : true;
}
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Есть такая вероятность. Прокси не обязан отдавать IP исходного клиента. Так работают, например, прокси-анонимизаторы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы