Безопасно ли доверять $ _SERVER ['REMOTE_ADDR']? - PullRequest
81 голосов
/ 23 января 2011

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

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

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

Ответы [ 3 ]

99 голосов
/ 23 января 2011

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

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

56 голосов
/ 23 января 2011

$_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 голосов
/ 23 января 2011

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

...