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 视图状态值的主要内容,如果未能解决你的问题,请参考以下文章