Можно ли доверять $_SERVER['REMOTE_ADDR']
? Можно ли его заменить, изменив заголовок запроса или что-то в этом роде?
Можно ли написать что-то подобное?
if ($_SERVER['REMOTE_ADDR'] == '222.222.222.222') { // my ip address $grant_all_admin_rights = true; }
Да, это безопасно. Это 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.