PHP curl - 发布 asp.net 视图状态值

Posted

技术标签:

【中文标题】PHP curl - 发布 asp.net 视图状态值【英文标题】:PHP curl - posting asp.net viewstate value 【发布时间】:2011-03-16 20:41:09 【问题描述】:

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

<?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);
?>

我被定向到外部站点的登录表单,而不是被定向到登录的应用程序。我认为问题是我需要传递视图状态值,但我不知道该怎么做那个?

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

我最近发布了几个关于使用 php cURL 的其他线程,但我现在处于认为视图状态是问题的阶段......

谢谢,马克。

【问题讨论】:

【参考方案1】:

变化:

curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);

收件人:

curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, false);

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

CURLOPT_COOKIEFILE:

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

CURLOPT_COOKIE:

HTTP 请求中使用的“Cookie:”标头的内容。请注意,多个 cookie 用分号后跟空格分隔(例如,“fruit=apple; colour=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'); 

【讨论】:

谢谢 - 添加了这些,但仍然只是被定向到外部站点上的登录表单..【参考方案2】:

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

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

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

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

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

【讨论】:

感谢 Ed 的回复。我还得出结论,这是由于 VIEWSTATE 值。【参考方案3】:

不要指望它在不使用 php 编码 __VIEWSTATE 字符串的情况下工作

rawurlencode($viewstate);

【讨论】:

【参考方案4】:

我最近也遇到了同样的问题,所以我就在这里解决一下,以防其他人也偶然发现这个帖子寻找答案。

我通过在每个 POST 请求之前对相同的 url 发送一个 GET 请求来解决这个问题,并将所有输入字段从该 GET 的响应中提取到一个键值对数组中。然后我替换了该数组中的一些值(例如登录字段值),并在随后的 POST 中将整个内容发回。这样,我的 POST 请求也包含为该特定 url 生成的所有有效 __VIEWSTATE、__EVENTVALIDATOR 和 yada-yada 数据。

这样网站就可以让我正常登录和访问子域了。

【讨论】:

以上是关于PHP curl - 发布 asp.net 视图状态值的主要内容,如果未能解决你的问题,请参考以下文章

使用 curl 从 asp.net 页面获取数据

Thingsboard - REST API 上的身份验证错误(来自 Curl 命令和 ASP.NET)

来自 asp.net/vb 的卷发

如何永久关闭视图状态?

ASP.NET 网格视图与列表视图

ASP.NET 设计视图 - 移动控件