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

89

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

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

if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
    $grant_all_admin_rights = true;
}
Серебряный свет
источник
3
Добавляя к существующим ответам, это всегда будет IP-адрес, который отправил запрос на ваш сервер, но это не означает, что это IP-адрес компьютера, с которого был запущен запрос. Между вами и конечным пользователем может находиться любое количество прокси-серверов, и ближайший к вам - это полученный вами IP-адрес.
Дэн Гроссман
да, это безопасно, потому что не может быть заменено другими уловками или обманом. но убедитесь, что вы добавили дополнительную проверку для переменной $ grant_all_admin_rights.
Юда Правира
Подделать можно любую переменную $ _SERVER - например, curl_setopt ($ ch, CURLOPT_HTTPHEADER, array ("REMOTE_ADDR: $ ip", "HTTP_X_FORWARDED_FOR: $ ip")); Так что это полностью зависит от контекста: если злоумышленник ожидает ответа, он вернется к $ ip. Если их не волнует ответ, они определенно могут подделать заголовок. Если ваш код после проверки заголовка вместо этого сказал: «open_the_door_to_badguys ();» у вас будет проблема.
TMG
3
@TMG Вы не можете подделать $_SERVER['REMOTE_ADDR']переменную, установив заголовок HTTP-запроса. PHP автоматически добавляет префиксы ко всем заголовкам HTTP-запросов HTTP_при создании ключей в $_SERVERсуперглобале.
MrWhite

Ответы:

110

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

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

саги
источник
4
А как насчет подделки IP-адреса?
Абдул
1
@Abdull Люди, которые могут это сделать, обычно те же люди, у которых есть физический доступ к вашему ящику. так что не беспокойтесь об этом сильно.
Behrooz
5
@Abdull IP-спуфинг может отправлять сообщения только в одну сторону, вы не можете подделать свой IP-адрес и получить сообщение взамен.
1
Разве интернет-маршрутизаторы не проверяют исходный и целевой IP-адреса для маршрутизации пакетов? Я сомневаюсь, что поддельный пакет когда-либо достигнет пункта назначения через интернет-узлы.
Виктор Жорас
57

$_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-адрес, если вы можете исключить злоумышленников в своей локальной сети.

Phihag
источник
4
Вы очень осведомлены об Интернет-протоколе.
Брайан Петерсон
@phihag, $_SERVER['REMOTE_ADDR']IP-адрес, на который пришло TCP-соединение, полностью зависит от вашего SAPI.
Pacerier 05
Это далеко не исключено для злоумышленника в WEP / WPA WLAN, чтобы отключить настоящего клиента и подменить этот IP-адрес - и WEP, и WPA имеют слабые места, которые позволяют you have been kicked off the wlanлегко создавать спуфинговые пакеты с помощью правильных инструментов. google WPA downgrade test, например
hanshenrik
IP-адрес соответствует уровню IP, а не TCP.
Виктор Жорас
3

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

Аудио
источник
6
После подделки IP-адреса изменение http-запроса и отправка ложных файлов cookie - это проще простого ... (или кусок cookie)
Ури Горен
1
Пожалуйста, объясните, что вы имеете в виду под «не совсем безопасно»
Джейк