2009-06-05 149 views
2

事实上,它变得非常混乱,我甚至不确定卷曲是否是罪魁祸首。所以,这里的PHP:curl发送GET而不是POST

$creds = array(
    'pw' => "xxxx", 
    'login' => "user" 
    ); 

$login_url = "https://www.example.net/login-form"; //action value in real form. 
$loginpage = curl_init(); 

curl_setopt($loginpage, CURLOPT_HEADER, 1); 
curl_setopt($loginpage, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($loginpage, CURLOPT_URL, $login_url); 
curl_setopt($loginpage, CURLOPT_POST, 1); 
curl_setopt($loginpage, CURLOPT_POSTFIELDS, $creds); 

$response = curl_exec($loginpage); 
echo $response; 

我得到的报头(符合正常的,成功的请求的头标),其次是登录页面(我猜卷曲捕获在这个由于重定向),其中有对“不良联系类型”的影响存在错误。

我认为问题是请求主机设置为请求服务器,而不是远程服务器,但后来我注意到(在Firebug中),请求发送为GET,而不是POST。

如果我复制登录网站的表单,将它剥离为只包含带有值的表单元素,并放置完整的网址,它的工作原理非常棒。所以我认为这不是一个安全问题,登录请求必须在同一台服务器上发起,等等(我甚至摆脱了空的隐藏值和所有设置其他一些cookie的JS)。

再次,我很快就感到困惑。

任何想法,为什么它显示为GET,或为什么它不起作用?

回答

1

当对整个类的PHP-cURL相关问题进行故障诊断时,您只需打开CURLOPT_VERBOSE并给CURLOPT_STDERR一个文件句柄。

tail -f您的文件,标题和响应比较您在Firebug中看到的,这个问题应该很清楚。

1

该请求是从服务器发出的,并不会显示在Firebug中。 (您可能会将其与浏览器的其他请求混淆)。使用wireshark找出真正发生的事情。你没有设置CURLOPT_FOLLOWLOCATION;不应该遵循重定向。

总结:少猜,多发。链接到pcap转储,我们将能够准确地知道您做错了什么;或张贴PHP脚本的确切输出,我们可以。

+0

谢谢你的抬头。当我做了一个几乎相同的curl_exec到另一台服务器,我看到一个帖子(与表单值我设置),所以我想萤火(在Net标签)是准确的。可以肯定的是,我在本地机器上使用wireshark?我猜不是,因为请求是服务器端的。如何为服务器配置它? – Anthony 2009-06-05 15:22:43

+0

@Anthony Wireshark的,必须运行在任何机器上的PHP正在运行或一个你发送请求。如果wireshark没有安装,请查找tcpdump。我在卷曲相关的东西很感兴趣,所以如果你有不适合在此框中进一步的问题,不要犹豫,通过IM或电子邮件联系我(见我的地址配置文件)。 – phihag 2009-06-05 18:36:20

1

显示的代码会执行多部分formpost(因为您将一个散列数组传递给POSTFIELDS选项),这可能不是目标服务器的期望。

0

尝试在最后抛出一个print_r(curl_getinfo($loginpage)),看看它发回的标题数据是什么。

此外,如果您试图伪造您从他们的网站登录,您要确保您的邮件发送正确的推荐链接,以便他们在发送邮件时“认为”您在网站上。