Php 用GET代替POST

Php 用GET代替POST,php,forms,curl,server-side,http-post,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_HEA

事实上,它变得如此混乱以至于我甚至不确定卷发是罪魁祸首。下面是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)

然后,我很快就被弄糊涂了


你知道为什么它会显示为GET,或者为什么它不工作吗?

请求是从服务器发出的,不会显示在Firebug中。(您可能将其与浏览器的另一个请求相混淆)。用于了解实际发生的情况。您没有设置
CURLOPT_FOLLOWLOCATION
;不应遵循重定向


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

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

尝试在最后插入一个
打印(curl\u getinfo($loginpage))
查看它返回的头数据


另外,如果你试图假装你是从他们的网站登录的,你会希望确保你的帖子发送了正确的推荐人,这样他们在你发送时“认为”你在网站上。

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


tail-f
将您的文件的标题和响应与Firebug中看到的标题和响应进行比较,问题就会清楚了。

谢谢您的提醒。当我对另一台服务器执行几乎相同的curl_exec时,我看到一篇帖子(带有我设置的表单值),所以我认为firebug(在Net选项卡中)是准确的。为了确定,我在本地机器上使用wireshark?我猜不会,因为请求是服务器端的。如何为服务器配置它?@Anthony wireshark必须在运行php的机器上运行,或者在向其发送请求的机器上运行。如果未安装wireshark,请查找tcpdump。我对卷发相关的东西很感兴趣,所以如果你有其他不适合这个框的问题,请毫不犹豫地通过IM或电子邮件与我联系(地址见我的个人资料)。