努力用PHP抓住asp.net

时间:2016-02-17 15:08:57

标签: php asp.net curl

我正在尝试使用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);

在浏览器中,事件序列如下:

  1. GET /结果302重定向到/Login.aspx?ReturnUrl=%2fIndex.aspx
  2. 重定向位置返回的登录页面
  3. 用户输入用户名和密码,然后点击提交类型
  4. 的输入
  5. 用户名,密码,提交和2个隐藏输入(__VIEWSTATE和__VIEWSTATEGENERATOR)将POST回到相同的网址(/Login.aspx?ReturnUrl=%2fIndex.aspx)
  6. 服务器响应302重定向到/Index.asp
  7. 浏览器检索Index.asp(作为经过身份验证的用户)
  8. 但是,当我使用PHP脚本尝试此操作时,在步骤4之后,响应是第2步。

    我已尝试将脚本指向本地非SSL网站,以检查Curl是否正在按照我的预期进行操作。它是。

    分析

    1. 正在捕获并重播Cookie
    2. 正在填充所有必需的变量(包括__VIEWSTATE和__VIEWSTATEGENERATOR)并在POST中发回
    3. 内容未被缓存 - 在GET和POST之间插入人为延迟导致响应的时间戳不同
    4. 虽然会话似乎正在运行,但是服务器响应就像POST是没有参数的GET一样 - 如果浏览器中提供了无效的用户名或密码,响应也不同,但GET和POST都来自抓取返回相同的HTML。
    5. 我尝试添加浏览器中生成的所有额外标头(User-Agent,Accept,Accept-Language),但没有任何影响。

1 个答案:

答案 0 :(得分:0)

我的问题是,我不明白curl只有 Cookie写入COOKIEJAR而从COOKIEFILE读取。事实上,如果它们不是来自服务器的最后一个响应,它似乎从COOKIEJAR中删除了cookie(仍然没有完全描述它)。