登录从HTTPS提交表单使用curl
问题描述:
我需要使用POST(asp.net),我读到有关从这里这个话题,外部网站提交登录表单和几个例子我不能使它工作。登录从HTTPS提交表单使用curl
我知道我发出正确的参数,因为使用邮递员进行测试,当我回到家HTML的响应,所以它一定是坏了,我的代码做的,这就是我想要的此刻:
// Create temp file to store cookies
$ckfile = tempnam ("/tmp", "CURLCOOKIE");
// URL to login page
$url = "https://site/Login.aspx";
// Get Login page and its cookies and save cookies in the temp file
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // Accepts all CAs
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
$fields = array(
'ctl00$ContentPlaceHolder1$txtUser' => 'user',
'ctl00$ContentPlaceHolder1$txtPassword' => '******',
'__VIEWSTATEGENERATOR'=> '716EFC3E',
'__EVENTVALIDATION'=> 'dfsgsdf5463456',
'__LASTFOCUS'=> '',
'__EVENTTARGET'=> '',
'__EVENTARGUMENT'=> '',
'__VIEWSTATE'=> 'wEPDwUKLTM1Mjk0NzM0Mw9kFgJmD2QWAgIDD2QWAgID',
'ctl00$ContentPlaceHolder1$btnLogin'=> 'In',
);
$fields_string = '';
foreach($fields as $key=>$value) {
$fields_string .= $key . '=' . $value . '&';
}
rtrim($fields_string, '&');
// Post login form and follow redirects
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // I also try it with false
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$output = curl_exec($ch);
echo $output;
curl_close($ch);
这是一个通用的服务器运行时错误。
我在做什么错了?
答
许多/大多数登录页面使用您需要登录表单刮一次性使用的安全令牌值。
工作流程是这样的:
- 抓取登录页面
- 刮(解析,提取物)从寻呼响应一次性令牌
- 使用令牌
提交表单你的代码看起来像是使用陈旧的硬编码的令牌。
如果这是真的,如何使用时,邮递员来与相同参数的实际工作?这就是为什么我很迷惑 – elunap
您的代码可能没有发送一模一样的饼干和/或参数,但我们需要看到真正的网站才能够告诉你更多。你可以使用一个数据包嗅探器工具(在PC上是一个很好的Fiddler2)捕获邮递员流量和你的php流量? –