Возможно ли, что REMOTE_ADDR может быть пустым?

Насколько мне известно, веб-сервер (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-адрес. Однако, как сказал Писквор, сценарий может взаимодействовать с переменной и изменять ее значение во время выполнения.