web-dev-qa-db-ja.com

cURLで必要なプロキシ認証

CURL関数を使用したいのですが、プロキシの背後にいるため、HTTP/1.1 407 Proxy Authentication Requiredエラー...

これは私が使用するphpコードです:

$proxy_user = 'Michiel';
$proxy_pass = 'mypassword';
$proxy_url = 'myproxyurl:port';
$proxy = true;

$service_url = "https://www.myapiurltocall.com";
$service_user = 'user:password:FO';
$service_pass = 'password';

$ch = curl_init($service_url);

// Set proxy if necessary
if ($proxy) {
    curl_setopt($ch, CURLOPT_PROXY, $proxy_url);
    curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_user.':'.$proxy_pass);
    curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
    curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
}

// Set service authentication
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_USERPWD, "{$service_user}:{$service_pass}");

// HTTP headers
$headers['Authorization'] = 'Basic ' . base64_encode("$proxy_user:$proxy_pass");

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);    
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_TIMEOUT, 15);

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);

$data = curl_exec($ch);

そして、私は何が間違っているのかわかりません...このエラーを回避するにはどうすればよいですか?

16
Michiel

これは私が主に使用しているものです:

function curlFile($url,$proxy_ip,$proxy_port,$loginpassw)
{
    //$loginpassw = 'username:password';
    //$proxy_ip = '192.168.1.1';
    //$proxy_port = '12345';
    //$url = 'http://www.domain.com';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_PROXYPORT, $proxy_port);
    curl_setopt($ch, CURLOPT_PROXYTYPE, 'HTTP');
    curl_setopt($ch, CURLOPT_PROXY, $proxy_ip);
    curl_setopt($ch, CURLOPT_PROXYUSERPWD, $loginpassw);
    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}
26
Dr.Kameleon

これを関数に実装してみてください

   function send_string($data) {
//       pr($data);exit;

     $equi_input="Your values";
//  echo $equi_input; exit;
        $agent = ""//Agent Setting for Netscape  
        $url = ""; // URL to POST FORM. (Action of Form)
        //xml format
         $efx_request=strtoupper($equi_input);
      //echo  $efx_request;exit;
        $post_fields = "site_id=""&service_name=""&efx_request=$efx_request";
        $credentials = ;
        $headers = array("HTTP/1.1",
            "Content-Type: application/x-www-form-urlencoded",
            "Authorization: Basic " . $credentials
        );
        $fh = fopen('/tmp/test.txt', 'w') or die("can't open file"); //File to write the header information of the curl request.
        $ch = curl_init();    // Initialize a CURL session.
        curl_setopt($ch, CURLOPT_USERAGENT, $agent);
        curl_setopt($ch, CURLOPT_URL, $url);  // Pass URL as parameter.
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_STDERR, $fh);
        curl_setopt($ch, CURLOPT_POST, 1); // use this option to Post a form  
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); // Pass form Fields.  
        curl_setopt($ch, CURLOPT_VERBOSE, '1');
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec($ch);  // grab URL and pass it to the variable.
        curl_close($ch);  // close curl resource, and free system resources.  
        fclose($fh);


   //echo '<pre>';print_r($array);echo '</pre>';exit;
        if (!empty($result)) {
            return $result;
        } else {
            echo "Curl Error" . curl_error($ch);
        }
    }

チェック要求は200okを送信します...

使用している場合は、安全な証明書を確認してください。

ありがとう。

2

これは私が使用するものであり、完全に機能します。

$proxy = "1.1.1.1:12121";
$useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1";
$url = "http://www.google.pt/search?q=anonymous";
$credentials = "user:pass"

$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,15);
curl_setopt($ch, CURLOPT_HTTP_VERSION,'CURL_HTTP_VERSION_1_1' );
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYUSERPWD,$credentials);
curl_setopt($ch, CURLOPT_USERAGENT,$useragent);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
$result=curl_exec ($ch);
curl_close ($ch);
2
Pedro Lobito

$proxy_user:$proxy_passは正しい値です。オフィスのファイアウォールの内側にいる場合、使用される認証資格情報はネットワーク管理者のものであり、自分のものではありません...私の職場環境で非常に似たような問題が発生しました通常の資格情報には必要な特権がなかったので、私にとっては。これが事実であることを確認するための最良の方法は、プロキシ設定がコメント化されたオープンネットワークでコードが機能することを確認することです。お役に立てれば!

1
optimusprime619