Безопасно ли доверять $ _SERVER ['REMOTE_ADDR']?

Насколько безопасно доверять $_SERVER['REMOTE_ADDR']? Можно ли его заменить, изменив заголовок запроса или что-то в этом роде?

Безопасно ли писать что-то подобное?

if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
    $grant_all_admin_rights = true;
}

person Silver Light    schedule 23.01.2011    source источник
comment
Добавляя к существующим ответам, это всегда будет IP-адрес, с которого был сделан запрос на ваш сервер, но это не означает, что это IP-адрес компьютера, с которого был запущен запрос. Между вами и конечным пользователем может находиться любое количество прокси-серверов, и ближайший к вам - это полученный вами IP-адрес.   -  person Dan Grossman    schedule 23.01.2011
comment
да, это безопасно, потому что не может быть заменено другими уловками или обманом. но убедитесь, что вы добавили дополнительную проверку для переменной $ grant_all_admin_rights.   -  person Yuda Prawira    schedule 12.05.2011
comment
Любая переменная $ _SERVER может быть подделана - например, curl_setopt ($ ch, CURLOPT_HTTPHEADER, массив (REMOTE_ADDR: $ ip, HTTP_X_FORWARDED_FOR: $ ip)); Так что это полностью зависит от контекста: если злоумышленник ожидает ответа, он вернется к $ ip. Если их не волнует ответ, они определенно могут подделать заголовок. Если ваш код после проверки заголовка вместо этого сказал: open_the_door_to_badguys (); у вас будет проблема.   -  person TMG    schedule 23.05.2013
comment
@TMG Вы не можете подделать переменную $_SERVER['REMOTE_ADDR'], установив заголовок HTTP-запроса. PHP автоматически префикс всех заголовков HTTP-запросов с HTTP_ при создании ключей в $_SERVER суперглобале.   -  person MrWhite    schedule 08.12.2015


Ответы (3)


Да, это безопасно. Это исходный IP-адрес TCP-соединения, и его нельзя заменить путем изменения заголовка HTTP.

Один случай, о котором вы можете захотеть побеспокоиться, - это если вы находитесь за обратным прокси-сервером, и в этом случае REMOTE_ADDR всегда будет IP-адресом прокси-сервера, а IP-адрес пользователя будет предоставлен в заголовке HTTP (например, X-Forwarded-For). Но для обычного варианта использования чтение REMOTE_ADDR подойдет.

person sagi    schedule 23.01.2011
comment
А как насчет подделки IP-адреса? - person Abdull; 10.03.2015
comment
@Abdull Люди, которые могут это сделать, обычно те же люди, у которых есть физический доступ к вашему ящику. так что не беспокойтесь об этом сильно. - person Behrooz; 15.08.2015
comment
@Abdull IP-спуфинг может отправлять сообщения только в одну сторону, вы не можете подделать свой IP-адрес и получить сообщение взамен. - person ; 21.08.2016
comment
Разве интернет-маршрутизаторы не проверяют IP-адрес источника и назначения для маршрутизации пакетов? Я сомневаюсь, что поддельный пакет когда-либо достигнет пункта назначения через интернет-узлы. - person Viktor Joras; 13.10.2018

$_SERVER['REMOTE_ADDR'] - это IP-адрес, на который пришло TCP-соединение. Хотя технически возможно двунаправленное подделывание IP-адресов в Интернете (путем объявления нечестных маршрутов через BGP), такие атаки, скорее всего, будут обнаружены и недоступны для типичного злоумышленника - в основном ваш злоумышленник должен иметь контроль над интернет-провайдером или оператором связи. На данный момент не существует возможных однонаправленных атак спуфинга на TCP. Тем не менее, двунаправленная подмена IP-адреса в локальной сети является тривиальной задачей.

Также имейте в виду, что это может быть не IPv4, а IPv6-адрес. В этом отношении ваша текущая проверка подходит, но если вы проверите, что 1.2.3.4 происходит только где-нибудь в пределах $_SERVER['REMOTE_ADDR'], злоумышленник может просто подключиться с 2001:1234:5678::1.2.3.4.

В целом, для любых других приложений, кроме критических (банковские / военные / потенциальный ущерб> 50 000 евро), вы можете использовать удаленный IP-адрес, если вы можете исключить злоумышленников в своей локальной сети.

person phihag    schedule 23.01.2011
comment
Похоже, вы очень осведомлены об Интернет-протоколе. - person Brian Peterson; 02.11.2013
comment
@phihag, Является ли $_SERVER['REMOTE_ADDR'] IP-адресом, с которого пришло TCP-соединение, полностью зависит от вашего SAPI. - person Pacerier; 06.03.2015
comment
для злоумышленника в WEP / WPA WLAN отнюдь не исключено, что злоумышленник отключит настоящего клиента и подменит IP-адрес - и WEP, и WPA имеют слабые места, которые упрощают создание спуфинговых you have been kicked off the wlan пакетов с помощью правильных инструментов. google WPA downgrade test, например - person hanshenrik; 22.11.2017
comment
IP-адрес соответствует уровню IP, а не TCP. - person Viktor Joras; 13.10.2018

Как уже говорилось выше, это не совсем безопасно. Но это не значит, что вам не стоит его использовать. Попробуйте совместить это с некоторыми другими методами аутентификации, например, с проверкой значений COOKIE.

person Audio    schedule 23.01.2011
comment
После подмены IP-адреса изменение HTTP-запроса и отправка ложных файлов cookie - это просто ... (или кусок cookie) - person Uri Goren; 15.02.2016
comment
Пожалуйста, объясните, что вы имеете в виду под словом «не абсолютно безопасно» - person Jake; 11.10.2017