2009-08-19 26 views
20

Necesito enviar una solicitud curl con la dirección IP del usuario y no la del servidor. Intenté esto sin suerte:cURL dirección IP

curl_setopt($ch, CURLOPT_INTERFACE, $ip); 

¿Alguna idea?

Gracias!

+0

¿Quieres simular una dirección IP ? Eso no se hace en PHP. Creo que debes reconsiderar cuál es el problema y encontrar otra solución. – OIS

+0

¿Quieres falsificar la dirección IP? Eso no va a funcionar. – Greg

Respuesta

32

Ok, así que no hay forma de falsificar la dirección IP de una solicitud curl, pero encontré una manera no segura, depende del script del servidor que recibe la solicitud, pero funcionó para engañar a la API. estaba haciendo la solicitud a:

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

Esto no siempre funcionará, pero en este caso funcionó para mí.

¡Gracias a todos por la ayuda!

+3

Eso no es falsificar técnicamente una dirección IP, solo está falsificando un encabezado HTTP. Este es un excelente ejemplo de por qué no puede confiar en la validez del encabezado HTTP. – zombat

+2

sí, lo sé, pero a veces puede servir para el propósito. – Flatline

+0

+1 pero principalmente por lo que este tipo de problema gana visibilidad. Es probable que el problema haya sido con HTTP_X_FORWARDED_FOR, que generalmente utilizan los equilibradores de carga para enviar la IP a los servidores reales. Un servidor con buen comportamiento, siempre debe llenar automáticamente el REMOTE_ADDR por la IP real. Pero X_FORWARDED_FOR es un campo personalizado, por lo que el servidor no puede verificarlo realmente. Tendría que ser verificado por el balanceador de carga. – eglasius

2

Esto se debe a que se supone que debe colocar allí la dirección IP de su servidor.

No se puede falsificar un paquete de IP con una dirección de origen falsa utilizando curl.

6

Spoofing una dirección IP no es algo que cURL puede hacer. Esa es una operación de nivel inferior que requiere la manipulación de conexiones de socket sin formato.

10

No funciona con rizo para mí, así que encontró una manera de evitarlo, sólo tenía que hacer esto y siempre que la IP se asigna a su servidor, entonces:

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; 
    } 
} 
3

aquí están las líneas de código php que pueden funcionar. Puede usar cualquier otro método para configurar el encabezado "X-Forwarded-For".

$httpClient = new Zend_Http_Client($reqUrl); 
$httpClient->setHeaders("X-Forwarded-For","127.0.0.1"); //---this sets the desired ip address 
0

No estoy seguro de si le preguntas esto, pero si quieres que curl use una dirección IP diferente del mismo servidor, mira la opción "interfaz". El valor será algo así como "eth0: 0" o similar.

7

Ninguna de las soluciones superiores me ha funcionado. Sin embargo hacer una solicitud a través de un proxy funciona muy 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; 
0

Uso cabecera HTTP_X_REAL_IP además con HTTP_X_FORWARDED_FOR y REMOTE_ADDR como "HTTP_X_REAL_IP: xxx.xxx.xxx.xx"

Cuestiones relacionadas