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!
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!
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;
}
}
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;
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.
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
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.
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.
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
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