我需要发送一个curl请求与用户的ip地址不是服务器之一。我试过这个没有运气:cURL IP地址
curl_setopt($ch, CURLOPT_INTERFACE, $ip);
任何想法?
谢谢!
我需要发送一个curl请求与用户的ip地址不是服务器之一。我试过这个没有运气:cURL IP地址
curl_setopt($ch, CURLOPT_INTERFACE, $ip);
任何想法?
谢谢!
好吧,所以没有办法安全地欺骗一个curl请求的IP地址,但我发现一个不安全的方式,它取决于接收请求的服务器脚本,但它对我来说欺骗了API I正在提出要求:
curl_setopt($ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: $ip", "HTTP_X_FORWARDED_FOR: $ip"));
这并不总是有效,但在这种情况下它对我有效。
感谢大家的帮助!
这在技术上不是欺骗IP地址,它只是欺骗HTTP头。这是一个很好的例子,为什么你不能依赖HTTP头的有效性。 – zombat 2009-08-19 17:35:54
是的,我知道,但它有时可以达到目的。 – Flatline 2009-08-19 17:39:07
+1,但主要是这种类型的问题获得知名度。这很可能是HTTP_X_FORWARDED_FOR问题,负载平衡器通常使用HTTP_X_FORWARDED_FOR将IP发送到实际的服务器。性能良好的服务器应始终自动填充REMOTE_ADDR的实际IP。但是X_FORWARDED_FOR是一个自定义字段,所以服务器不能真正检查它。它必须由负载均衡器检查。 – eglasius 2012-02-03 21:13:53
这是因为你应该把你的服务器的IP地址在那里。
您无法使用curl伪造具有伪源地址的IP数据包。
欺骗IP地址不是cURL可以做的事情。这是一个需要处理原始套接字连接的较低级别的操作。
它不卷曲为我工作,所以我找到了一种方法围绕它,我必须做到这一点,只要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;
}
}
这里可能工作的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
不确定你是否问这个问题,但如果你想让curl使用来自同一服务器的不同IP地址,请看“接口”选项。价值将像“eth0:0”或类似的东西。
上面的解决方案都没有为我工作。除了与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;
使用HTTP_X_REAL_IP头“HTTP_X_REAL_IP:xxx.xxx.xxx.xx”
你要欺骗一个IP地址,但是通过做代理的请求工作得很好?这不是在PHP中完成的。我认为你需要重新思考问题所在,并寻找其他解决方案。 – OIS 2009-08-19 17:14:11
你想欺骗IP地址?这是行不通的。 – Greg 2011-02-17 16:58:22