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

Als*_*ian 9 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);
Run Code Online (Sandbox Code Playgroud)

它返回:

无法连接到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)
Run Code Online (Sandbox Code Playgroud)

使用"DefaultCredentials"(= Windows Credentials)并将它们发送到代理允许我访问Web.但我现在不知道它是如何工作的.

如果我使用Firefox导航,Firefox总是会添加一个Proxy-Authorization标头,其值为: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);
Run Code Online (Sandbox Code Playgroud)

没有成功

Dan*_*erg 2

如果curl 是在启用“ SSPI ”支持的情况下构建的,则可以执行此操作。您通常可以curl -V根据提示运行来检查这一点。或从 PHP 本身内部php -i调用。phpinfo();

带SSPI

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

curl_setopt($ch, CURLOPT_PROXYUSERPWD, ":" );
Run Code Online (Sandbox Code Playgroud)

完整的代码如下所示。另请注意,这CURLOPT_HTTPAUTH是针对远程服务器而不是代理的身份验证。我认为你不太可能真的想要通过谷歌进行 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);
Run Code Online (Sandbox Code Playgroud)

不带 SSPI

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

curl_setopt($ch, CURLOPT_PROXYUSERPWD, "clark%20kent:superman");
Run Code Online (Sandbox Code Playgroud)