Php 卷曲ip地址

Php 卷曲ip地址,php,curl,Php,Curl,我需要发送一个带有用户ip地址而不是服务器ip地址的curl请求。我尝试了这个,但没有成功: curl_setopt( $ch, CURLOPT_INTERFACE, $ip ); 有什么想法吗?那是因为你应该把服务器的ip地址放在那里 您无法使用curl伪造具有假源地址的IP数据包。欺骗IP地址不是curl所能做到的。这是一个较低级别的操作,需要操纵原始套接字连接。好的,所以没有办法安全地欺骗curl请求的ip地址,但我找到了一种不安全的方法,它取决于接收请求的服务器脚本,但它对我来说是一种

我需要发送一个带有用户ip地址而不是服务器ip地址的curl请求。我尝试了这个,但没有成功:

curl_setopt( $ch, CURLOPT_INTERFACE, $ip );

有什么想法吗?

那是因为你应该把服务器的ip地址放在那里


您无法使用curl伪造具有假源地址的IP数据包。

欺骗IP地址不是curl所能做到的。这是一个较低级别的操作,需要操纵原始套接字连接。

好的,所以没有办法安全地欺骗curl请求的ip地址,但我找到了一种不安全的方法,它取决于接收请求的服务器脚本,但它对我来说是一种欺骗API的方法,我正在请求:

curl_setopt( $ch, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: $ip", "HTTP_X_FORWARDED_FOR: $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”标题


上面的解决方案都不适合我。但是,通过代理发出请求非常有效:

$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_FORWARDED_FOR和REMOTE_ADDR之类的
“HTTP\u X\u REAL\u IP:xxx.xxx.xxx.xx”

使用它在标题中添加标记,如REMOTE\u ADDR:majbase HTTP\u X\u FORWARDED\u FOR:codix,如“HTTP\u REAL\u IP:xxx.xxx.xxx.xx”

要伪造IP地址吗?这不是用PHP实现的。我认为你需要重新思考问题所在,并找到另一个解决方案。你想欺骗IP地址吗?这是行不通的。从技术上讲,这不是欺骗IP地址,只是欺骗HTTP头。这是一个很好的例子,说明了为什么不能依赖HTTP头有效性。是的,我知道,但有时它可能会达到这个目的。+1,但主要是这样,这类问题会变得明显。问题可能是HTTP_X_FORWARDED_FOR,负载平衡器通常使用它将IP发送到实际服务器。一个性能良好的服务器,应该总是通过实际的IP自动填充远程地址。但是X_FORWARDED_FOR是一个自定义字段,因此服务器无法真正检查它。它必须由负载平衡器进行检查。这对我来说非常有效,只是我使用了$proxy='http://'。$\u SERVER['REMOTE\u ADDR']。:2222';而且它每次都有效。
$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;