【问题标题】:cURL ip address卷曲 IP 地址
【发布时间】:2010-11-21 00:58:55
【问题描述】:

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

curl_setopt( $ch, CURLOPT_INTERFACE, $ip );

有什么想法吗?

【问题讨论】:

  • 您想欺骗 IP 地址?这不是在 PHP 中完成的。我认为您需要重新考虑问题所在,并找到其他解决方案。
  • 你想欺骗IP地址?那是行不通的。

标签: php curl


【解决方案1】:

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

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

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

感谢大家的帮助!

【讨论】:

  • 这在技术上并不是在欺骗 IP 地址,它只是在欺骗 HTTP 标头。这是一个很好的例子,说明为什么不能依赖 HTTP 标头有效性。
  • 是的,我知道,但它有时可能会达到目的。
  • +1 但主要是为了让这类问题获得可见性。问题可能出在 HTTP_X_FORWARDED_FOR 上,负载均衡器通常使用它来将 IP 发送到实际服务器。一个表现良好的服务器,应该总是用实际 IP 自动填充 REMOTE_ADDR。但是 X_FORWARDED_FOR 是自定义字段,所以服务器无法真正检查。它必须由负载平衡器检查。
【解决方案2】:

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】:

    上面的解决方案都不适合我。但是通过代理发出请求效果很好:

    $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;
    

    【讨论】:

    • 这对我很有用,除了我使用了 $proxy = 'http://'.$_SERVER['REMOTE_ADDR'].':22222';并且每次都有效。
    【解决方案4】:

    欺骗 IP 地址不是 cURL 可以做的事情。这是一个较低级别的操作,需要处理原始套接字连接。

    【讨论】:

      【解决方案5】:

      这里是可以工作的 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
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          使用 HTTP_X_REAL_IP 标头以及 HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR 等 "HTTP_X_REAL_IP: xxx.xxx.xxx.xx"

          【讨论】:

            【解决方案8】:

            在标题中使用它添加标签,如 REMOTE_ADDR: majbase HTTP_X_FORWARDED_FOR: codix like "HTTP_X_REAL_IP: xxx.xxx.xxx.xx"

            【讨论】:

              猜你喜欢
              • 2011-09-17
              • 2023-03-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-01-13
              • 1970-01-01
              • 1970-01-01
              • 2013-03-03
              相关资源
              最近更新 更多