Насколько мне известно, веб-сервер (Apache / Nginx) предоставляет ( $_SERVER['REMOTE_ADDR']
) на основе заявленного местоположения запрашивающего агента пользователя. Поэтому я понимаю, что они могут лгать, но возможно ли, что это значение может быть пустым? Будет ли сетевой интерфейс или веб-сервер даже принимать запрос без правильно сформированного IP-адреса?
http://php.net/manual/en/reserved.variables.server.php
Теоретически это возможно, поскольку дело касается сервера http или, по крайней мере, соответствующего PHP SAPI.
На практике я не сталкивался с такой ситуацией, за исключением CLI SAPI.
EDIT: для Apache кажется, что это всегда задано, поскольку ap_add_common_vars
всегда добавляет его в таблицу, которая заканчивается чтением модулем Apache PHP SAPI (отказ от ответственности: у меня очень ограниченное знание внутренних компонентов Apache).
Если использовать PHP в среде CGI, спецификация в RFC 3875, по-видимому, гарантирует существование этой переменной:
4.1.8. REMOTE_ADDR Переменная REMOTE_ADDR ДОЛЖНА быть установлена на сетевой адрес клиент, отправляющий запрос на сервер.
Да. В настоящее время я вижу значения «неизвестных» в моих журналах Apache-behind-Nginx, что похоже на обычную последовательность запросов / ответов в журналах. Я считаю, что это возможно, потому что mod_extract_forwarded
запрос на сброс REMOTE_ADDR на основе данных в заголовке X-Forwarded-For
. Таким образом, исходное значение REMOTE_ADDR
было, скорее всего, действительным, но, как часть прохождения через обратный прокси-сервер и Apache, REMOTE_ADDR
становится недействительным к моменту поступления приложения.
Если вы установили libwww-perl
, вы можете проверить эту ситуацию следующим образом (изменение example.com будет вашим собственным доменом или приложением):
HEAD -H 'X-Forwarded-For: ' -sSe http://www.example.com/ HEAD -H 'X-Forwarded-For: HIMOM' -sSe http://www.example.com/ HEAD -H 'X-Forwarded-For: <iframe src=http://example.com>' -sSe http://www.example.com/
(Вы также можете использовать любой другой инструмент, который позволяет обрабатывать HTTP-запросы с пользовательскими заголовками запросов.)
Теперь перейдите в журналы доступа, чтобы узнать, какие значения они зарегистрировали, и проверьте свои приложения, чтобы увидеть, как они обрабатывают плохой ввод. `
Ну, он зарезервирован, но доступен для записи. Я видел плохо написанные приложения, которые писали поверх суперглобалов, – может ли сценарий перезаписывать его, например, с помощью $_SERVER['REMOTE_ADDR'] = '';
?
Помимо этого, даже если запрос был проксирован, должен быть адрес прокси-сервера – может ли это быть какой-то модуль внутреннего переписывания с ним ( mod_rewrite
разрешает внутренние переадресации, не уверен, влияет ли это на это)?
Он не должен быть пустым, и ничто не может подключиться к вашему веб-сервису. Независимо от того, что соединение должно иметь IP-адрес для отправки и получения данных. Можно ли доверять этому IP-адресу, это другое дело.
Насколько мне известно, значение $_SERVER['REMOTE_ADDR']
должно быть заполнено и действительным. Если запрос поступит с недействительным удаленным адресом, я почти уверен, что сервер не справится с этим – и даже если это произойдет, выход никогда не достигнет пользователя, потому что сервер будет отправлять его на недействительный IP-адрес. Однако, как сказал Писквор, сценарий может взаимодействовать с переменной и изменять ее значение во время выполнения.