Мне нужно отправить запрос на завивание с IP-адресом пользователя, а не на сервер. Я пробовал это без везения:cURL ip address
curl_setopt($ch, CURLOPT_INTERFACE, $ip);
Любые идеи?
Спасибо!
Мне нужно отправить запрос на завивание с IP-адресом пользователя, а не на сервер. Я пробовал это без везения:cURL ip address
curl_setopt($ch, CURLOPT_INTERFACE, $ip);
Любые идеи?
Спасибо!
Итак, нет способа безопасно подделать ip-адрес запроса на завивание, но я нашел небезопасный способ, это зависит от сервера, получающего запрос, но это помогло мне обмануть API I обратился с просьбой:
curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: $ip", "HTTP_X_FORWARDED_FOR: $ip"));
Это не всегда будет работать, но в этом случае это сработало для меня.
Спасибо всем за помощь!
Это не технически подделка IP-адреса, это просто подделка HTTP-заголовка. Это яркий пример того, почему вы не можете полагаться на достоверность HTTP-заголовка. – zombat
Да, я знаю, но иногда это может служить цели. – Flatline
+1 но в основном, поэтому этот тип проблемы набирает видимость. Вероятно, проблема связана с HTTP_X_FORWARDED_FOR, который обычно используется балансировщиками нагрузки для отправки IP-адреса фактическим серверам. Хорошо организованный сервер всегда должен автоматически заполнять REMOTE_ADDR фактическим IP-адресом. Но X_FORWARDED_FOR - это настраиваемое поле, поэтому сервер не может его проверить. Он должен быть проверен балансировщиком нагрузки. – eglasius
Это потому, что вы должны разместить там IP-адрес своего сервера.
Вы не можете подделать IP-пакет с поддельным адресом источника с помощью curl.
Подмена IP-адреса не является чем-то, что может сделать cURL. Это операция более низкого уровня, требующая манипуляции с соединениями сокетов.
Он не работает с загнутым для меня, так что я нашел способ обойти это, я просто должен был сделать это, и до тех пор, как IP назначается на сервер, а затем:
echo http_socket::download('http://something.com', '55.55.44.33');
final class http_socket
{
static public function download($url, $bind_ip = false)
{
$components = parse_url($url);
if(!isset($components['query'])) $components['query'] = false;
if(!$bind_ip)
{
$bind_ip = $_SERVER['SERVER_ADDR'];
}
$header = array();
$header[] = 'GET ' . $components['path'] . ($components['query'] ? '?' . $components['query'] : '');
$header[] = 'Host: ' . $components['host'];
$header[] = 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.7) Gecko/20100106 Ubuntu/9.10 (karmic) Firefox/3.5.7';
$header[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$header[] = 'Accept-Language: en-us,en;q=0.5';
$header[] = 'Accept-Encoding: gzip,deflate';
$header[] = 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7';
$header[] = 'Keep-Alive: 300';
$header[] = 'Connection: keep-alive';
$header = implode("\n", $header) . "\n\n";
$packet = $header;
//----------------------------------------------------------------------
// Connect to server
//----------------------------------------------------------------------
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $bind_ip);
socket_connect($socket, $components['host'], 80);
//----------------------------------------------------------------------
// Send First Packet to Server
//----------------------------------------------------------------------
socket_write($socket, $packet);
//----------------------------------------------------------------------
// Receive First Packet to Server
//----------------------------------------------------------------------
$html = '';
while(1) {
socket_recv($socket, $packet, 4096, MSG_WAITALL);
if(empty($packet)) break;
$html .= $packet;
}
socket_close($socket);
return $html;
}
}
здесь строки PHP-кода, которые могут работать. Вы можете использовать любой другой способ для установки заголовка «X-Forwarded-For».
$httpClient = new Zend_Http_Client($reqUrl);
$httpClient->setHeaders("X-Forwarded-For","127.0.0.1"); //---this sets the desired ip address
Не уверен, если вы спросите об этом, но если вы хотите, чтобы завиток использовал другой IP-адрес с того же сервера, посмотрите на «интерфейс». Значение будет чем-то вроде «eth0: 0» или аналогичным.
Ни одно из верхних решений для меня не работало. Однако сделать запрос через прокси-сервер работает очень хорошо:
$url = 'http://dynupdate.no-ip.com/ip.php';
$proxy = '127.0.0.1:8888'; //put your proxy here
//$proxyauth = 'user:password';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
//curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
Используйте заголовок HTTP_X_REAL_IP в дополнение с HTTP_X_FORWARDED_FOR и REMOTE_ADDR как «HTTP_X_REAL_IP: xxx.xxx.xxx.xx»
Вы хотите подделать IP-адрес? Это не сделано в PHP. Я думаю, вам нужно переосмыслить, в чем проблема, и найти другое решение. – OIS
Вы хотите подделать IP-адрес? Это не сработает. – Greg