2009-08-19 278 views
20

我需要發送一個curl請求與用戶的ip地址不是服務器之一。我試過這個沒有運氣:cURL IP地址

curl_setopt($ch, CURLOPT_INTERFACE, $ip); 

任何想法?

謝謝!

+0

你要欺騙一個IP地址,但是通過做代理的請求工作得很好?這不是在PHP中完成的。我認爲你需要重新思考問題所在,並尋找其他解決方案。 – OIS 2009-08-19 17:14:11

+0

你想欺騙IP地址?這是行不通的。 – Greg 2011-02-17 16:58:22

回答

32

好吧,所以沒有辦法安全地欺騙一個curl請求的IP地址,但我發現一個不安全的方式,它取決於接收請求的服務器腳本,但它對我來說欺騙了API I正在提出要求:

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

這並不總是有效,但在這種情況下它對我有效。

感謝大家的幫助!

+3

這在技術上不是欺騙IP地址,它只是欺騙HTTP頭。這是一個很好的例子,爲什麼你不能依賴HTTP頭的有效性。 – zombat 2009-08-19 17:35:54

+2

是的,我知道,但它有時可以達到目的。 – Flatline 2009-08-19 17:39:07

+0

+1,但主要是這種類型的問題獲得知名度。這很可能是HTTP_X_FORWARDED_FOR問題,負載平衡器通常使用HTTP_X_FORWARDED_FOR將IP發送到實際的服務器。性能良好的服務器應始終自動填充REMOTE_ADDR的實際IP。但是X_FORWARDED_FOR是一個自定義字段,所以服務器不能真正檢查它。它必須由負載均衡器檢查。 – eglasius 2012-02-03 21:13:53

2

這是因爲你應該把你的服務器的IP地址在那裏。

您無法使用curl僞造具有僞源地址的IP數據包。

6

欺騙IP地址不是cURL可以做的事情。這是一個需要處理原始套接字連接的較低級別的操作。

10

它不捲曲爲我工作,所以我找到了一種方法圍繞它,我必須做到這一點,只要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; 
    } 
} 
3

這裏可能工作的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 
0

不確定你是否問這個問題,但如果你想讓curl使用來自同一服務器的不同IP地址,請看「接口」選項。價值將像「eth0:0」或類似的東西。

7

上面的解決方案都沒有爲我工作。除了與HTTP_X_FORWARDED_FOR和REMOTE_ADDR像

$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

使用HTTP_X_REAL_IP頭「HTTP_X_REAL_IP:xxx.xxx.xxx.xx」