使用 curl 登录到 WS1
Posted
技术标签:
【中文标题】使用 curl 登录到 WS1【英文标题】:Login to WS1 using curl 【发布时间】:2016-02-29 20:02:15 【问题描述】:我正在尝试使用 curl 登录 ws1.com,但是每当我将 POST 设置为 true 时,我都会收到错误:错误请求,这是我尝试过的代码:
<?php
$LOGINURL = "https://secure2.ws1.com/login";
$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$LOGINURL);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "_csrf=QTRvNkJKaUoWBFYDBHkLDHFkP0MdMhAPOUZCASR9Xh4ZRDx7BC8LGA%3D%3D&LoginForm%5Bemail%5D=naczzalid%40hotmail.com&LoginForm%5Bpassword%5D=csc1233&LoginForm%5BrememberMe%5D=0&login-button=");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt");
echo $result = curl_exec ($ch);
curl_close ($ch);
?>
任何人都可以向我解释这是什么问题,以便我可以学习如何去做?
【问题讨论】:
如果您在没有数据的情况下发布到该页面,可能会发出错误的请求。也许如果缺少 csrf 令牌,他们也会发出错误的请求。确保您提交了所有正确的表单字段以及他们登录页面所需的任何其他内容。 是的,我确定我提交了所有内容,但是当我输入 post = 1 时出现此错误 您不会将任何帖子字段与示例数据一起放置,因此很难分辨。这是发布到的正确 URL。也许它也需要一个推荐人。并且您发送正确的_csrf
后字段值?
我是这么认为的,我刚刚更新了代码看看。
【参考方案1】:
我用这个表单测试了一些东西,如果csrf
代码不正确,那么它给出了一个错误的请求。
每个请求的 csrf 值都会发生变化,并且与您的 cookie 相关联。所以需要先获取登录页面,并提取正确的csrf代码,然后再提交。
工作代码:
<?php
$LOGINURL = "https://secure2.ws1.com/login";
$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$LOGINURL);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt");
$result = curl_exec ($ch);
// extract csrf token
preg_match('/<input type="hidden" name="_csrf" value="([^"]+)">/i', $result, $csrf);
$csrf = $csrf[1];
$csrf = urlencode($csrf);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "_csrf=$csrf&LoginForm%5Bemail%5D=naczzalid%40hotmail.com&LoginForm%5Bpassword%5D=csc1233&LoginForm%5BrememberMe%5D=0&login-button=");
$result = curl_exec($ch);
curl_close ($ch);
var_dump($result);
【讨论】:
非常感谢,为什么有时你会发送header和refere而有时没有?当我们需要它们时以上是关于使用 curl 登录到 WS1的主要内容,如果未能解决你的问题,请参考以下文章