【问题标题】:PHP curl - posting asp.net viewstate valuePHP curl - 发布 asp.net 视图状态值
【发布时间】: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 的其他线程,但我现在处于认为视图状态是问题的阶段......

谢谢,马克。

【问题讨论】:

    标签: php asp.net authentication curl viewstate


    【解决方案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 数据。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-21
        • 2012-04-19
        • 2013-11-05
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2018-10-15
        • 1970-01-01
        相关资源
        最近更新 更多