努力用PHP抓住asp.net

sym*_*ean 8 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);
Run Code Online (Sandbox Code Playgroud)

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

  1. GET /结果302重定向到/Login.aspx?ReturnUrl=%2fIndex.aspx
  2. 重定向位置返回的登录页面
  3. 用户输入用户名和密码,然后点击提交类型的输入
  4. 用户名,密码,提交和2个隐藏输入(__VIEWSTATE和__VIEWSTATEGENERATOR)被POST回到相同的URL(/Login.aspx?ReturnUrl=%2fIndex.aspx)
  5. 服务器响应302重定向到/Index.asp
  6. 浏览器检索Index.asp(作为经过身份验证的用户)

但是,当我使用PHP脚本尝试此操作时,在步骤4之后,响应是步骤2.

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

分析

  1. 正在捕获和重放Cookie
  2. 正在填充所有必需的变量(包括__VIEWSTATE和__VIEWSTATEGENERATOR)并在POST中发回
  3. 内容未被缓存 - 在GET和POST之间插入一个人为延迟导致响应的时间戳不同
  4. 虽然会议似乎是工作,服务器响应仿佛POST是不带参数的GET - 如果一个无效的用户名或密码在浏览器中提供,该反应是不同的,但无论是GET和刮返回相同的POST HTML.

我尝试添加浏览器中生成的所有额外标头(User-Agent,Accept,Accept-Language),没有任何影响.

sym*_*ean 0

我的问题是我不明白curlcookie写入COOKIEJAR并且从COOKIEFILE读取。事实上,如果cookies不在服务器的最后一个响应中(仍然没有完全分析这一点),它似乎会从COOKIEJAR中删除cookies。