卷曲选项相当于Net.Webclient的“useDefaultCredentials”

时间:2017-08-09 09:49:20

标签: curl webclient php-curl

我尝试使用php脚本中的curl访问web:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://www.google.fr");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}

curl_close ($ch);

它返回:

  

无法连接到www.google.fr端口443:拒绝连接

这是正常的,我在代理后面,需要我的Windows凭据(NTLM)来允许互联网流量。

在MS Powershell中,这有效:

$request = New-Object System.Net.WebCLient
$request.UseDefaultCredentials = $true
$request.Proxy.Credentials = $request.Credentials
$request.DownloadFile($url, $path)

使用“DefaultCredentials”(= Windows Credentials)并将其发送到代理允许我访问网络。但我现在不知道它是如何运作的。

如果我使用Firefox导航,Firefox总是添加代理授权标头,其值为: Negociate blablablablababalazdlad ...

我想将.NET useDefaultCredentials解决方案转换为cURL,我试过了:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://www.google.fr");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM );
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_NTLM );

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}

curl_close ($ch);

没有成功

2 个答案:

答案 0 :(得分:2)

curl可以使用" SSPI "支持已启用。您可以在提示符上正常运行curl -V来检查。或者来自PHP本身的php -i或调用phpinfo();

使用SSPI

您将CURLOPT_PROXYUSERPWD选项设置为空白用户/密码(除了其他选项外)只是为了触发身份验证,但它会为您获取默认凭据:

curl_setopt($ch, CURLOPT_PROXYUSERPWD, ":" );

完整的代码看起来如下所示。另请注意,CURLOPT_HTTPAUTH用于对远程服务器进行身份验证,而不是代理。而且我认为你不太可能真的想要google的HTTP身份验证......

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://www.google.fr");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, "http://proxyhost.example.com:8080/");
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_NTLM );
curl_setopt($ch, CURLOPT_PROXYUSERPWD, ":" );

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}

curl_close ($ch);

没有SSPI

然后curl无法找出默认凭据,而是必须使用CURLOPT_PROXYUSERPWD选项设置用户名和密码,如下所示:

curl_setopt($ch, CURLOPT_PROXYUSERPWD, "clark%20kent:superman");

答案 1 :(得分:2)

  

我尝试在php脚本中使用curl访问web:    https://www.google.fr

问题是google内容是通过ssl提供的,即https:我修改了你的代码以允许https连接:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://www.google.fr");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt( $ch, CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}

curl_close ($ch);

print_r( $result );

使用HTTP NTLM身份验证| CURLAUTH_NTLM

HTTP NTLM身份验证。 Microsoft发明并使用的专有协议。它使用类似于Digest的质询 - 响应和散列概念,以防止密码被窃听。

您需要使用 OpenSSL GnuTLS NSS 支持此选项来构建libcurl,或者构建libcurl支持SSPI的Windows。

让我们把它放到一个简单的函数中。

function Auth($username, $password, $endpoint)
{
    $username = ( isset( $username ) && !empty($username) ) ? trim( $username ) : '';
    $password = ( isset( $password ) && !empty($password) ) ? trim( $password ) : '';
    $proxy_address = "local.domain.com:1024";


    $ch = curl_init();

    if($ch)
        {
            curl_setopt($ch, CURLOPT_URL, $endpoint );  
            /* make use of proxy */
            curl_setopt(curl, CURLOPT_PROXY, $proxy_address );
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

            /* Allow ANY Auth */
            curl_setopt(curl,CURLOPT_PROXYAUTH, CURLAUTH_ANY );

            /* Set credentials or leave empty to prompt */
            curl_setopt(curl,CURLOPT_PROXYUSERPWD, "$username:$password" );

            $result = curl_exec($ch);

            if (curl_errno($ch)) {
                echo 'Error:' . curl_error($ch);
            }   

            curl_close($ch);
        }
}

用法:验证(“用户名”,“yourPassWord”,“http://local.domain.com:1080/”);

让其他人知道这是否有助于您