CURL IP-адрес - PullRequest
       21

CURL IP-адрес

22 голосов
/ 19 августа 2009

Мне нужно отправить запрос curl с IP-адресом пользователя, а не с сервера. Я попробовал это без удачи:

curl_setopt( $ch, CURLOPT_INTERFACE, $ip );

Есть идеи?

Спасибо!

Ответы [ 9 ]

38 голосов
/ 19 августа 2009

Хорошо, поэтому нет никакого способа безопасно подделать IP-адрес запроса curl, но я нашел небезопасный способ, это зависит от сценария сервера, получающего запрос, но он помог мне обмануть API, которым я был сделать запрос:

curl_setopt( $ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: $ip", "HTTP_X_FORWARDED_FOR: $ip"));

Это не всегда будет работать, но в этом случае это сработало для меня.

Спасибо всем за помощь!

10 голосов
/ 19 января 2010

Это не работает с 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;
    }
}
7 голосов
/ 02 февраля 2014

Ни одно из верхних решений не сработало для меня. Однако выполнение запроса через прокси работает очень хорошо:

$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;
7 голосов
/ 19 августа 2009

Подделка IP-адреса - это не то, что cURL может сделать. Это операция более низкого уровня, требующая манипулирования необработанными соединениями сокетов.

3 голосов
/ 06 января 2012

вот строки кода 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
3 голосов
/ 19 августа 2009

Это потому, что вы должны поместить туда IP-адрес вашего сервера.

Вы не можете подделать IP-пакет с поддельным адресом источника с помощью curl.

0 голосов
/ 16 марта 2018

Используйте его в заголовке, добавьте теги, такие как REMOTE_ADDR: majbase HTTP_X_FORWARDED_FOR: кодекс, например "HTTP_X_REAL_IP: xxx.xxx.xxx.xx"

0 голосов
/ 22 января 2017

Используйте заголовок HTTP_X_REAL_IP в дополнение к HTTP_X_FORWARDED_FOR и REMOTE_ADDR, как «HTTP_X_REAL_IP: xxx.xxx.xxx.xx»

0 голосов
/ 20 февраля 2013

Не уверен, если вы спросите это, но если вы хотите, чтобы curl использовал разные IP-адреса с одного и того же сервера, посмотрите на опцию «interface». Значение будет что-то вроде «eth0: 0» или аналогичное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...