php curl - 发布asp.net viewstate值

Mar*_*nes 8 php asp.net authentication viewstate curl

我有以下代码从本地站点登录表单(用PHP编写)登录到外部站点应用程序(asp.net app):

<?php
$curl_connection = curl_init('www.external.com/login.aspx');

curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);

// Post data array
$post_data['LoginControl$UserName'] = 'ExampleUName';
$post_data['LoginControl$Password'] = 'ExamplePWord';

// Add form fields into an array to get ready to post
foreach ($post_data as $key => $value) 
  {
$post_items[] = $key . '=' . $value;
  }
$post_string = implode ('&', $post_items);

// Tell cURL which string to post
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);

// Execute and post
$result = curl_exec($curl_connection);
?>
Run Code Online (Sandbox Code Playgroud)

我被定向到外部站点的登录表单,而不是被定向到登录的应用程序.我认为问题是我需要传递viewstate值,但我不知道该怎么做呢?

我无法控制外部应用程序.但我们希望用户能够通过我们的网站登录该应用程序,以维护品牌等.

我最近发布了一些关于php cURL使用的其他线程,但我现在处于阶段,我认为viewstate是问题...

谢谢,马克.

小智 5

当试图抓取 asp.net 页面时,这似乎是一个真正的问题。

这些页面包含一个名为“__VIEWSTATE”的隐藏字段,其中包含一组 base64 编码的 va;ues,其中包含页面发送时的部分或全部页面状态。它通常还包含视图状态的 SHA1。

这意味着您的帖子必须包含 _VIEWSTATE 中的所有内容,否则它将失败。

我已经能够发布一个只有 2 个字段的简单登录页面,但不能发布一个更复杂的页面,其中作者选择将整个页面状态放在视图状态中。

到目前为止,我还没有想出一个解决方案。


Rob*_*itt 3

改变:

curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
Run Code Online (Sandbox Code Playgroud)

到:

curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, false);
Run Code Online (Sandbox Code Playgroud)

你还需要设置一个cookie文件,看看CURLOPT_COOKIEFILE

CURLOPT_COOKIEFILE:

包含 cookie 数据的文件的名称。cookie 文件可以是 Netscape 格式,也可以只是转储到文件中的普通 HTTP 样式标头。

CURLOPT_COOKIE:

HTTP 请求中使用的“Cookie:”标头的内容。请注意,多个 cookie 用分号后跟空格分隔(例如,“fruit=apple;color=red”)

CURLOPT_COOKIEJAR:

连接关闭时保存所有内部 cookie 的文件名。

@参见http://www.php.net/manual/en/function.curl-setopt.php

curl_setopt($curl_connection, CURLOPT_COOKIEFILE, 'cookiefile.txt'); 
curl_setopt($curl_connection, CURLOPT_COOKIEJAR, 'cookiefile.txt'); 
Run Code Online (Sandbox Code Playgroud)