Proxy Authentication Required con cURL

Vorrei utilizzare una funzione cURL, ma io sono dietro un proxy, in modo da ottenere un HTTP/1.1 407 Proxy Authentication Required errore…

Questo è il codice php che uso:

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

E non so cosa ho fatto di sbagliato… Come posso risolvere questo errore?

  • supponendo che il $proxy_user:$proxy_pass sono i valori corretti, se sei dietro a un ufficio firewall e credenziali di autenticazione dovrebbe essere quella di un amministratore e non il proprio…ho incontrato qualcosa di molto simile nel mio ambiente di lavoro e che era il caso per me, come il mio normale credenziali non ha i privilegi necessari.
  • Sì, dietro un ufficio firewall. Il $proxy_user e $proxy pass sono corrette al 100% (posso usare la mia webmail e comunicatore, con queste credenziali, quindi…) L’amministratore del mio PC o della rete che si intende?
  • la rete è il mio migliore..
  • Ok, grande! Si prega di aggiungere una risposta, quindi posso accettare 🙂
  • fatto, spero che ti ha aiutato.
InformationsquelleAutor Michiel | 2012-03-22



4 Replies
  1. 23

    Questo è quello che sto usando soprattutto :

    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;
    }
    • Ok, grazie! Come sarebbe una password di autenticazione (per $url stesso), rientrano in questa configurazione?
    • Ok, grazie! Ho capito me stesso!!! Grazie!
    • Vi ringrazio tanto per questo. Questo è esattamente quello che stavo cercando di costruire. Mi hai risparmiato un bel mal di testa.
    • Vi ringrazio Molto, È sfuggito a me da loop infinito di googling
    • che nome utente password dobbiamo passare?
  2. 2

    Tenta di implementare questo in funzione

       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);
            }
        }

    controllare richiesta di inviare 200ok …

    E controllare il certificato di sicurezza se si utilizza….

    Grazie.

    • Grazie per la risposta, ma io non sono sicuro di come implementare nel mio codice attuale. Potresti darmi una mano qui?
    • io sono anche il passaggio delle variabili di valore come credenziali , Url ,Autorizzazione .. sto passando autorizzazione $credenziali variabile .. sto passando nome utente , la password è postfield..,, leggere il codice , penso che vi aiuterà.
    • cosa principale prima di controllare le credenziali di autenticazione , può essere che sta creando problema… controlla ..
    • Le credenziali sono corrette al 100%. Che, ne sono sicuro.
    • Siete pregati di notare un bug nel codice di cui sopra: CURLOPT_SSL_VERIFYHOST dovrebbe essere un parametro intero, e deve essere impostato a 2 (impostazione predefinita). Vedere php.net/manual/en/function.curl-setopt.php per maggiori dettagli. Se si imposta il valore di true, si sta effettivamente disabilitando il controllo dell’host, e quindi permette attacchi MITM!
  3. 2

    Questo è quello che io uso e funziona perfettamente:

    $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);
  4. 1

    Supponendo che il $proxy_user:$proxy_pass sono i valori corretti, se sei dietro a un ufficio firewall e credenziali di autenticazione dovrebbe essere quella di un amministratore di rete e non il proprio…ho incontrato qualcosa di molto simile nel mio ambiente di lavoro e che era il caso per me, come il mio normale credenziali non ha i privilegi necessari. Il modo migliore per garantire che questo è il caso, tuttavia, sarebbe quello di garantire che il codice funziona in una rete aperta con le impostazioni del proxy, ha commentato. Spero che questo aiuta!

Lascia un commento