【发布时间】:2016-02-17 15:08:57
【问题描述】:
我正在尝试使用 PHP (5.6) 和 libcurl 废弃网站。
该站点在 asp.net 中实现,并通过本地代理访问。站点使用 HTTPS,因此不太容易通过网络发送未加密的流量。
我在第一步失败 - 登录。
$curl_options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_PROXY => 'http://localproxy.example.com:8080',
CURLOPT_PROXYUSERPWD => "$proxyUser:$proxyPass",
CURLOPT_PROXYAUTH => CURLAUTH_NTLM,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_WRITEHEADER => false,
CURLOPT_COOKIEJAR => $curl_cookie_jar,
CURLOPT_COOKIEFILE => $curl_cookie_jar
);
...
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $entryurl);
curl_setopt_array($ch, $curl_options);
$reply=curl_exec($ch);
curl_close($ch);
...
$postdata=array(
'username'=>'someuser', 'password'=>'s3cr3t',
'__VIEWSTATE'=>$vstate, '__VIEWSTATEGENERATOR'=>$vsgen
);
$ch=curl_init();
curl_setopt_array($ch, $curl_options);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postdata));
$reply=curl_exec($ch);
在浏览器中,事件顺序如下:
- GET / 导致 302 重定向到 /Login.aspx?ReturnUrl=%2fIndex.aspx
- 重定向位置返回的登录页面
- 用户输入用户名和密码并点击提交类型的输入
- 用户名、密码、提交和 2 个隐藏输入(__VIEWSTATE 和 __VIEWSTATEGENERATOR)被 POST 回相同的 URL (/Login.aspx?ReturnUrl=%2fIndex.aspx)
- 服务器响应 302 重定向到 /Index.asp
- 浏览器检索 Index.asp(作为经过身份验证的用户)
但是,当我使用 PHP 脚本尝试此操作时,在第 4 步之后,响应为第 2 步。
我尝试将脚本指向本地非 SSL 网站,以检查 Curl 是否按照我的预期进行。是的。
分析
- 正在捕获和重放 Cookie
- 所有必需的变量(包括 __VIEWSTATE 和 __VIEWSTATEGENERATOR)正在被填充并在 POST 中发回
- 内容未被缓存 - 在 GET 和 POST 之间插入人为延迟会导致响应的时间戳不同
- 虽然会话似乎正在工作,但服务器响应就像 POST 是没有参数的 GET - 如果在浏览器中提供了无效的用户名或密码,则响应不同,但 GET 和 POST 都来自抓取返回相同的 HTML。
我已尝试添加浏览器中生成的所有额外标头(User-Agent、Accept、Accept-Language),但没有任何影响。
【问题讨论】:
-
遗憾的是,我使用来自mishainthecloud.com/2009/12/… 的代码得到了完全相同的结果,这让我认为它对于我试图抓取的网站(或我正在经历的代理)非常具体