2009-08-19 15 views
20

Ho bisogno di inviare una richiesta di arricciatura con l'indirizzo IP dell'utente non quello del server. Ho provato questo senza fortuna:indirizzo IP cURL

curl_setopt($ch, CURLOPT_INTERFACE, $ip); 

Qualche idea?

Grazie!

+0

Si desidera ottenere un indirizzo IP ? Questo non è fatto in PHP. Penso che sia necessario ripensare al problema e trovare un'altra soluzione. – OIS

+0

Vuoi spoofare l'indirizzo IP? Non funzionerà. – Greg

risposta

32

Ok, quindi non c'è modo di spoofare in sicurezza l'indirizzo IP di una richiesta di ricciolo, ma ho trovato un modo non sicuro, dipende dallo script del server che riceve la richiesta, ma ha funzionato per ingannare l'API I stava facendo la richiesta a:

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

Questo non sempre funziona, ma in questo caso ha funzionato per me.

Grazie a tutti per l'aiuto!

+3

Questo non sta tecnicamente spoofing un indirizzo IP, è solo spoofing un'intestazione HTTP. Questo è un primo esempio del motivo per cui non è possibile fare affidamento sulla validità dell'intestazione HTTP. – zombat

+2

sì, lo so, ma a volte può servire allo scopo. – Flatline

+0

+1 ma principalmente così questo tipo di problema ottiene visibilità. È probabile che il problema fosse con HTTP_X_FORWARDED_FOR, che di solito viene utilizzato dai servizi di bilanciamento del carico per inviare l'IP ai server attuali. Un server ben educato, dovrebbe sempre riempire automaticamente REMOTE_ADDR con l'IP effettivo. Ma X_FORWARDED_FOR è un campo personalizzato, quindi il server non può davvero controllarlo. Dovrebbe essere controllato dal servizio di bilanciamento del carico. – eglasius

2

Questo perché si suppone che inserisca l'indirizzo IP del proprio server lì.

Non è possibile creare un pacchetto IP con un indirizzo di origine falso utilizzando l'arricciatura.

6

Lo spoofing di un indirizzo IP non è qualcosa che CURL può fare. Questa è un'operazione di livello inferiore che richiede la manipolazione delle connessioni socket vuote.

10

Non funziona con l'arricciatura per me, così ho trovato un modo intorno ad esso, ho dovuto fare questo e fino a quando l'IP viene assegnato al server, quindi:

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

qui sono le linee del codice php che potrebbero funzionare. È possibile utilizzare qualsiasi altro metodo per impostare l'intestazione "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

Non sono sicuro se si chiede questo, ma se si desidera utilizzare curl per diverso indirizzo IP dal server stesso, guardi opzione "interfaccia". Il valore sarà qualcosa come "eth0: 0" o simile.

7

Nessuno delle soluzioni superiori ha funzionato per me. Tuttavia fare una richiesta attraverso un proxy funziona molto bene:

$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

Usa intestazione HTTP_X_REAL_IP in più con HTTP_X_FORWARDED_FOR e REMOTE_ADDR come "HTTP_X_REAL_IP: xxx.xxx.xxx.xx"