curl发送GET而不是POST请求

4

实际上,事情变得如此混乱,以至于我甚至不确定curl是否是罪魁祸首。因此,这里是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;

我得到了标题(与正常的成功请求的标题匹配),接着是登录页面(我猜测curl捕获了这个页面由于重定向),显示出一个"错误联系类型"的错误。
我原本认为问题是请求的主机设置为请求服务器而不是远程服务器,但后来我注意到(在Firebug中),请求被发送为GET,而不是POST。
如果我复制登录网站的表格,将其剥离成仅具有值的表单元素,并将完整的URL放到操作中,它就可以完美地工作。所以我认为这不是一个安全问题,登录请求必须在同一台服务器上发起等等。(我甚至摆脱了空的隐藏值和所有设置其他cookie的JS)。
然而,我很快就感到困惑了。
有任何想法为什么它显示为GET,或者为什么它不起作用?
4个回答

2

当排除所有与PHP-cURL相关的问题时,您只需打开CURLOPT_VERBOSE并为CURLOPT_STDERR提供文件句柄。

tail -f 您的文件,将标头和响应与Firebug中看到的进行比较,问题应该变得清晰明了。


1

该请求是从服务器发出的,不会在Firebug中显示。(您可能将其与浏览器的其他请求混淆了)。使用wireshark查找实际发生的情况。您没有设置CURLOPT_FOLLOWLOCATION;不应跟随重定向。

总结:少猜测,多发布。链接到一个pcap转储文件,我们就能够准确地告诉您哪里出了问题;或者发布php脚本的精确输出,我们也可以帮忙。


谢谢提醒。当我执行了一个几乎相同的curl_exec到另一台服务器时,我看到了一个POST请求(带有我设置的表单值),所以我认为firebug(在Net选项卡中)是准确的。为了确保,我可以在我的本地机器上使用wireshark吗?我猜不行,因为请求是在服务器端进行的。我该如何为服务器配置它? - Anthony
@Anthony,wireshark必须在运行PHP的机器上或您发送请求的机器上运行。如果那里没有安装wireshark,请寻找tcpdump。我对与curl相关的内容非常感兴趣,因此如果您有进一步的问题无法适应此框,请通过即时消息或电子邮件与我联系(请参阅我的个人资料以获取地址)。 - phihag

1

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


0

尝试在末尾加入print_r(curl_getinfo($loginpage)),看看它发送回来的头部数据。

此外,如果您试图伪造登录来源于他们的网站,您需要确保在发送POST请求时附带正确的引用页,这样他们就会“认为”您在发送请求时正在该网站上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接