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

4 回答 4

2

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

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

于 2009-08-09T01:00:56.543 回答
1

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

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

于 2009-06-05T12:01:49.417 回答
1

所示代码执行多部分表单发布(因为您将哈希数组传递给 POSTFIELDS 选项),这可能不是目标服务器所期望的。

于 2009-06-06T21:29:47.337 回答
0

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

此外,如果您试图伪造您从他们的网站登录,您将需要确保您在您的帖子中发送正确的推荐人,以便他们“认为”您在发送时在网站上。

于 2009-08-09T00:30:17.330 回答