Безопасно ли доверять $_SERVER['REMOTE_ADDR']?
Насколько безопасно доверять $_SERVER['REMOTE_ADDR']
? Его можно заменить, изменив заголовок запроса или что-то в этом роде?
Безопасно ли писать что-то подобное?
if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address
$grant_all_admin_rights = true;
}
3 ответа
Да, это безопасно. Это исходный IP-адрес TCP-соединения, и его нельзя заменить, изменив заголовок HTTP.
Один из случаев, о котором вы можете беспокоиться, - это если вы находитесь за обратным прокси-сервером. В этом случае REMOTE_ADDR всегда будет IP-адресом прокси-сервера, а IP-адрес пользователя будет предоставлен в заголовке HTTP (например, X-Forwarded-For).). Но для нормального варианта использования чтение REMOTE_ADDR вполне подойдет.
$_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-адрес, если вы можете исключить злоумышленников в своей локальной сети.
Как уже упоминалось выше, это не совсем безопасно. Но это не значит, что вы не должны его использовать. Попробуйте объединить это с некоторыми другими методами аутентификации, например, проверкой значений COOKIE.