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

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

Можно ли написать что-то подобное?

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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