adresse IP bouclée

je dois envoyer une requête curl avec l'adresse ip de l'utilisateur et non celle du serveur. J'ai essayé cela avec pas de chance:

curl_setopt( $ch, CURLOPT_INTERFACE, $ip );

des idées?

Merci!

21
demandé sur Flatline 2009-08-19 21:08:34

9 réponses

Ok, donc il n'y a aucun moyen de falsifier en toute sécurité l'adresse ip d'une requête curl, mais j'ai trouvé un moyen non sûr, cela dépend du script du serveur qui reçoit la requête, mais ça a marché pour moi de tromper l'API à laquelle je faisais la requête:

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

cela ne marchera pas toujours, mais dans ce cas, ça a marché pour moi.

Merci à tous pour l'aide!

34
répondu Flatline 2009-08-19 17:22:56

Il ne fonctionne pas avec curl pour moi, donc j'ai trouvé un moyen de contourner cela, j'ai juste eu à le faire et aussi longtemps que l'IP est affectée à votre serveur, puis:

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;
    }
}
10
répondu Gorilla3D 2010-01-19 01:16:49

aucune des solutions supérieures n'a fonctionné pour moi. Cependant, en faisant une demande via un proxy fonctionne très bien:

$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
répondu Sergiu Sandrean 2014-02-01 23:45:46

mystifier une adresse IP n'est pas quelque chose que cURL peut faire. Il s'agit d'une opération de niveau inférieur nécessitant une manipulation des connexions de socket brutes.

6
répondu Richard Simões 2009-08-19 17:17:36

voici les lignes de code php qui peuvent travailler. Vous pouvez utiliser n'importe quelle autre méthode pour définir l'en-tête "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
répondu Sameer Girolkar 2012-01-06 18:44:36

c'est parce Que vous êtes censé mettre adresse ip de votre serveur.

vous ne pouvez pas créer un paquet IP avec une fausse adresse source en utilisant curl.

2
répondu Zed 2009-08-19 17:13:48

pas sûr si vous demandez cela, mais si vous voulez que curl utilise une adresse IP différente du même serveur, regardez l'option "interface". La valeur sera quelque chose comme "eth0:0" ou similaire.

0
répondu Nick 2013-02-19 20:41:16

utilisez L'en-tête HTTP_X_REAL_IP en plus de HTTP_X_FORWARDED_FOR et REMOTE_ADDR like "HTTP_X_REAL_IP: xxx.xxx.xxx.xx

0
répondu iamnamrud 2017-01-22 08:04:15

L'utiliser dans l'en-tête ajouter des balises comme REMOTE_ADDR: majbase HTTP_X_FORWARDED_FOR: codix comme "HTTP_X_REAL_IP: xxx.xxx.xxx.xx

0
répondu Codix SA - Ivelin Vasilev 2018-03-16 10:54:53