Возможно ли подделка или захват содержимого переменной $_SERVER['REMOTE_ADDR']
?
Я хотел бы подделать запрос с помощью:
$_SERVER['REMOTE_ADDR']='127.0.0.1';
Как мне это сделать с PHP? Может ли CURL это сделать?
Возможно ли подделка или захват содержимого переменной $_SERVER['REMOTE_ADDR']
?
Я хотел бы подделать запрос с помощью:
$_SERVER['REMOTE_ADDR']='127.0.0.1';
Как мне это сделать с PHP? Может ли CURL это сделать?
Я предполагаю, что вы имеете в виду подделку его дистанционно. Короткий ответ - да, вы можете. Длительный ответ о том, насколько легко это зависит, зависит от того, как вы хотите подделать его.
Если вы не хотите получать ответ, это так же просто, как открытие сырого сокета для адресата и подделка исходного IP-адреса. Я не уверен, действительно ли это очень легко сделать в PHP, поскольку все реализации PHP-сокетов находятся на уровне TCP или выше. Но я уверен, что это возможно. Теперь, поскольку вы не контролируете сеть, ответ не вернется к вам. Это означает, что вы не можете (надежно, в любом случае) создать TCP-соединение через тривиальный поддельный TCP-заголовок (поскольку syn-ack предотвращает это, требуя двусторонней связи).
Однако, если вы можете скомпрометировать шлюз, на котором отключен IP-адрес, вы можете делать все, что хотите. Поэтому, если вы нарушаете Wi-Fi-маршрутизатор, к которому подключен компьютер, вы можете притворяться, что этот компьютер, и сервер не скажет разницы. Если вы нарушаете исходящий маршрутизатор ISP, вы можете (теоретически, по крайней мере) претендовать на то, чтобы быть компьютером, и сервер не скажет разницу.
Для получения дополнительной информации см. следующие ссылки:
Тем не менее, вы сможете только создать loopback-адрес 127.0.0.1
в TCP, если вы фактически нарушите локальный компьютер/сервер. И в этот момент это действительно имеет значение?
Если вы используете фреймворк для доступа к этой информации, будьте абсолютно уверены, что он не проверяет заголовок X-HTTP-FORWARDED-FOR
! В противном случае это тривиально для подделки IP-адреса. Например, если вы используете метод Zend Framework Zend_Controller_Request_Http::getClientIp
, будьте уверены, что вы передадите false
в качестве параметра! В противном случае кому-то просто нужно отправить HTTP-заголовок: X-Http-Forwarded-For: 127.0.0.1
, и теперь они кажутся локальными! Это один случай, когда использование фреймворка без понимания того, как он работает в бэкэнд, может быть действительно плохим...
Недавно я написал сообщение в блоге о том, как я наткнулся на уязвимость в приложении StackOverflow. Это очень актуально здесь, поскольку оно использует очень похожий механизм для того, что ищет этот вопрос (хотя обстоятельства вокруг него несколько узкие):
Удаленный адрес не является чем-то лишним из вежливости, он используется в протоколе IP для маршрутизации пакетов, поэтому, если вы отправите пакет с поддельным адресом, вы не получите ответ, и поскольку вы говорите об HTTP-запросе, который доставляется по TCP-соединению, для которого требуется несколько IP-пакетов (и соответствующих ответов):
Нет, это невозможно (за исключением, конечно, фактически отправки запроса от того же хоста через интерфейс loopback).
Apache заполняет $_SERVER['REMOTE_ADDR']
из сокета TCP, который он использует для связи с вашим браузером. НЕВОЗМОЖНО влиять на эту переменную через открытый интернет из-за трехстороннего рукопожатия. Если клиент и сервер находятся в широковещательной сети, например Wi-Fi, вы можете обнюхать провод и завершить рукопожатие.
Вы можете перезаписать любой элемент в массиве $_SERVER
, включая тот, который вы упомянули, на вашем сервере; конечно, не в чужом.
Однако он не изменит IP-адрес вашего компьютера.
Если вы просматриваете через прокси-сервер, $_SERVER['REMOTE_ADDR']
может быть настроен на IP-адрес прокси, а не на конечный пользователь.
Существуют и другие заголовки, которые вы можете использовать в этом случае: Эта страница предоставляет функцию, которая проверяет все возможности и предоставляет адрес, который, скорее всего, будет конечным пользователем:
http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html
Однако, если пользователь использует прокси-сервер с плохо настроенным прокси-сервером или вредоносный, или один, предназначенный для анонимности конечного пользователя, то вы не сможете гарантировать какие-либо из заголовков, кроме REMOTE_ADDR
(что приведет только вас к прокси).
Если ваш конечный пользователь просматривает HTTPS, тогда REMOTE_ADDR
всегда будет его IP-адресом; вы не можете использовать перенаправление прокси через HTTPS. Поэтому единственный способ быть абсолютно уверенным в его адресе - заставить его открыть свой сайт в HTTPS.
REMOTE_ADDR
IP-адрес, с которого пользователь просматривает текущую страницу.
Вы можете запросить script с помощью прокси и т.д., чтобы изменить IP-адрес, но вы не можете указать там какой-либо текст.
Это переменная, установленная apache или любым другим сервером, который вы используете. Вы не можете подделать это.
Вы можете запустить $_SERVER['REMOTE_ADDR']='127.0.0.1';
в начале скриптов, но я сомневаюсь, что вы пытаетесь сделать