Как подделать переменную $ SERVER['REMOTE ADDR']?
можно ли подделать или захватить содержимое $_SERVER['REMOTE_ADDR']
переменной?
Я хотел бы, чтобы подделать запрос:
$_SERVER['REMOTE_ADDR']='127.0.0.1';
Как я могу это сделать с PHP? Может ли керл как-то это сделать?
7 ответов
Я предполагаю, что вы имеете в виду притворяется удаленно. Короткий ответ: да, можете. Длинный ответ о том, насколько это легко, зависит от того, как вы хотите его подделать.
если вы не заботитесь о получении ответа, это так же тривиально, как открытие необработанного сокета к месту назначения и подделка исходного IP-адреса. Я не уверен, что это действительно легко сделать в PHP, так как все реализации сокетов PHP находятся на уровне TCP или выше. Но я уверен, что это возможно. Так как тебя нет дома управление сетью, ответ не будет возвращаться к вам. Таким образом, это означает, что вы не можете (надежно в любом случае) создать TCP-соединение через тривиальный поддельный заголовок TCP (поскольку syn-ack предотвращает это, требуя двусторонней связи).
однако, если вы можете скомпрометировать шлюз, IP выключен, вы можете делать все, что хотите. Поэтому, если вы компрометируете wifi-маршрутизатор, к которому подключен компьютер, вы можете притвориться этим компьютером, и сервер не заметит разницы. Если вы компрометируете исходящий маршрутизатор ISP, вы можете (по крайней мере теоретически) притвориться компьютером, и сервер не заметит разницы.
для получения дополнительной информации, см. следующие ссылки:
тем не менее, вы сможете только подделать 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
и теперь они кажутся местными! Это один из случаев, когда использование фреймворка без понимания того, как он работает в бэкэнде, может быть действительно плохим...
Edit: Соответствующий
недавно я написал сообщение в блоге о том, как я наткнулся на уязвимость в приложении StackOverflow. Это очень актуально здесь, так как он использует очень похожий механизм на то, что ищет этот вопрос (хотя обстоятельства вокруг него несколько узкий):
удаленный адрес не является чем-то добавленным из вежливости, он используется в протоколе IP для маршрутизации пакетов, поэтому, если вы отправка пакета с поддельным адресом!--2-->, вы не получите ответ, и так как вы говорите о HTTP-запросе, который доставляется через TCP-соединение, для настройки которого требуется несколько IP-пакетов (и соответствующие ответы):
нет, это невозможно (за исключением, конечно, отправки запроса с того же хоста через петлю взаимодействие.)
Apache заполняет $_SERVER['REMOTE_ADDR']
из сокета TCP, который он использует для связи с вашим браузером. Это невозможно влиять на эту переменную через интернет из-за три-рукопожатие. Если клиент и сервер находятся в широковещательной сети, например wifi, вы можете понюхать провод и завершить рукопожатие.
вы можете заменить любой элемент $_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-адрес, с которого пользователь просматривает текущую страницу.
вы можете запросить скрипт через прокси и т. д. чтобы изменить IP-адрес, но вы не можете установить там любой текст, который вы хотите.
это переменная, установленная apache или любым сервером, который вы используете. Вы не можете его подделать.
Вы можете бежать $_SERVER['REMOTE_ADDR']='127.0.0.1';
в начале скриптов, но я сомневаюсь, что это то, что ты пытаешься сделать