代码之家  ›  专栏  ›  技术社区  ›  Flatline

卷曲IP地址

  •  22
  • Flatline  · 技术社区  · 15 年前

    我需要用用户的IP地址而不是服务器地址发送curl请求。我没有运气就尝试过:

    curl_setopt( $ch, CURLOPT_INTERFACE, $ip );
    

    有什么想法吗?

    谢谢!

    9 回复  |  直到 6 年前
        1
  •  36
  •   Flatline    15 年前

    好吧,所以没有办法安全地欺骗curl请求的IP地址,但是我找到了一种不安全的方法,这取决于接收请求的服务器脚本,但是它对我起到了欺骗我发出请求的API的作用:

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

    这并不总是有效的,但在这种情况下,它对我有效。

    谢谢大家的帮助!

        2
  •  10
  •   Joseph Montanez    15 年前

    它对我来说不适用于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;
        }
    }
    
        3
  •  7
  •   Richard Simões    15 年前

    欺骗IP地址不是curl能做的。这是一个低级操作,需要对原始套接字连接进行操作。

        4
  •  7
  •   Sergiu Sandrean    10 年前

    上面的解决方案对我来说都不管用。但是,通过代理发出请求非常有效:

    $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;
    
        5
  •  3
  •   Zed    15 年前

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

    不能使用curl伪造具有假源地址的IP包。

        6
  •  3
  •   Sameer Girolkar    13 年前

    下面是可以使用的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
    
        7
  •  0
  •   Nick    11 年前

    不确定您是否要求这样做,但是如果您希望curl使用来自同一服务器的不同IP地址,请查看“interface”选项。值将类似于“eth0:0”或类似的值。

        8
  •  0
  •   iamnamrud    7 年前

    除了http_x_forwarded_for和remote_addr like之外,还使用http_x_real_ip头 “http_x_real_ip:x x x.x x x.x x x.x x”

        9
  •  0
  •   Codix SA - Ivelin Vasilev    6 年前

    使用它在头中添加标签,如remote_addr:majbase http_x_forwarded_for:codix,如“http_x_real_ip:x x x.x x x.x x x.x x”