2011-01-23 2 views
72

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

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

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

Добавляя к существующим ответам, всегда будет IP-адрес, который сделал запрос на ваш сервер, но это не значит, что это IP-адрес компьютера, который начал запрос. Любое количество прокси-серверов может находиться между вами и конечным пользователем, а ближайший к вам - это IP-адрес, который вы получаете. –

+0

Да, это безопасно, потому что не может быть заменено другими трюками или некоторым обманом. но убедитесь, что вы добавили дополнительную проверку для переменной $ grant_all_admin_rights. –

+0

Любая переменная $ _SERVER может быть подделана - например. curl_setopt ($ ch, CURLOPT_HTTPHEADER, массив ("REMOTE_ADDR: $ ip", "HTTP_X_FORWARDED_FOR: $ ip")); Так что это полностью зависит от контекста: если злоумышленник ожидает ответа, он вернется к $ ip. Если они не заботятся об ответе, они могут наверняка подделать заголовок. Если ваш код после проверки заголовка вместо этого сказал: «open_the_door_to_badguys();» у вас возникнет проблема. – TMG

ответ

88

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

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

+3

Что касается спуфинга IP-адресов? – Abdull

+0

@Abdull Люди, которые могут это сделать, обычно - это те же люди, у которых есть физический доступ к вашей коробке. так что не беспокойтесь об этом так много. – Behrooz

+3

@Abdull IP spoofing может отправлять сообщения только в одну сторону, вы не можете обманывать свой IP-адрес и получать сообщение взамен. – Matth3w

52

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

+4

Вы очень хорошо осведомлены о протоколе Интернета. –

+0

@phihag, является ли '$ _SERVER ['REMOTE_ADDR']' IP-адресом, в которое вступил TCP-соединение, полностью зависит от вашего SAPI. – Pacerier

+0

его далеко не задуманный для злоумышленника на WEP/WPA WLAN, чтобы оттолкнуть реального клиента и подделать этот IP-адрес - как WEP, так и WPA имеют слабые места, которые делают спуфинг «вы были выбиты из пакетов wlan», которые легко создать с помощью правильные инструменты. google 'WPA downgrade test', например – hanshenrik

3

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

+5

После подмены IP-адреса изменение http-запроса и отправка ложных файлов cookie - это кусок торта ..... (или кусок файла cookie) –

+0

Пожалуйста, объясните, что вы подразумеваете под« not абсолютно безопасный " – Jake

Смежные вопросы