curl发送GET而不是POST

时间:2009-06-05 09:58:45

标签: php forms curl server-side http-post

实际上,它已经变得如此凌乱,以至于我甚至不确定卷曲是罪魁祸首。所以,这是php:

$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。

如果我复制登录网站的表单,将其删除到只包含值的表单元素,并为操作添加完整的URL,它的效果非常好。所以我认为这不是一个安全问题,登录请求必须来自同一台服务器等等(我甚至摆脱了空的隐藏值以及设置其他一些cookie的所有JS)。 / p>

然后,我很快就感到困惑。

为什么它出现在GET上,或为什么它不能正常工作?

4 个答案:

答案 0 :(得分:2)

在对整个PHP-cURL相关问题进行故障排除时,您只需打开CURLOPT_VERBOSE并为CURLOPT_STDERR提供文件句柄。

tail -f您的文件,比较您在Firebug中看到的标题和响应,问题应该变得清晰。

答案 1 :(得分:1)

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

总结:猜得少,发帖更多。链接到pcap转储,我们将能够确切地说出你做错了什么;或者发布php脚本的确切输出,我们可能会。

答案 2 :(得分:1)

显示的代码执行multipart formpost(因为您将哈希数组传递给POSTFIELDS选项),这可能不是目标服务器所期望的。

答案 3 :(得分:0)

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

另外,如果你试图假装你从他们的网站登录,你会想要确保你用你的帖子发送正确的推荐人,以便他们“认为”你在发送它时在网站上。