设置CURLOPT_USERPWD时,用户名或传递冒号的问题

时间:2011-01-20 23:00:44

标签: php curl

我们正在尝试使用PHP5中的curl使用基本身份验证登录网站。

部分代码是这样的:

<?
...
$uname = "username";
$pass = "p:assword";

curl_setopt($ch,CURLOPT_USERPWD,"$uname:$pass"); 
...
?>

但是我们的密码中的冒号似乎造成了麻烦。

我们无法更改生产网站的密码,但我们确认该代码在使用字母数字用户名和密码的其他网站上正常工作。

有没有办法在密码中逃避冒号,所以卷曲仍然有效?我们尝试了“p \:assword”没有运气。

感谢。

3 个答案:

答案 0 :(得分:6)

所以事实证明这不是结肠的问题.... 这是验证方案的问题。

起初我们正在使用:

curl_setopt($curl_conn, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 

并改为:

curl_setopt($curl_conn, CURLOPT_HTTPAUTH, CURLAUTH_ANY);

修复了问题。

我们对另一台服务器的测试存在缺陷 - 工作的服务器在Windows上运行IIS,我们遇到问题的生产服务器在linux上运行apache。

所以我再说一遍:使用包含冒号的冒号的用户名或密码显然没有问题。这就解释了为什么没有这个问题的文档。

抱歉得出结论,谢谢你的帮助。

答案 1 :(得分:1)

我在curl代码中查找了CURLOPT_USERPWD的提取实现, 这就是它的完成方式 在username-passwd字符串上有一个前向搜索,查找“:”字符。 然后提取用户名和密码(之前的字符串:是用户名和后面的字符串:是passwd)

因此,正如您所猜测的那样,如果用户名字符串包含:字符,则所有这些都将失败。 但是,由于:字符作为用户名的一部分的可能性要小得多,因此不会将其报告为错误。

谢谢

答案 2 :(得分:0)

看起来没有文档解决方案,但您可以尝试这种解决方法:

curl_setopt($ch, CURLOPT_URL, "http://{$uname}:{$pass}@www.test.com/login.php");

但我没有测试过它..