Можно ли доверять $ _SERVER ?

Можно ли доверять $_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.