深入理解ASP.NET WebForm ViewState

2021-01-12 IT168

  【IT168技術】上周完成了一個從ASP.NET WebForm 開發的站點抓包的功能。該功能要求使用該網點內的帳號通過我們自己的程序獲取網站內的數據。其間使用了HttpWebRequest 進行抓包。具體的抓包過程就不重點討論了。旨在和大家分享一下我在抓包過程中對ViewState 在 ASP.NET WebForm 中的作用有了進一步的了解。如果存在不足之處,希望您能指出。

  為了模擬Http POST/GET 我們用VS建立兩個工程,截圖如下:

  注:第一個工程是一個簡單的ASP.NET Web Form 程序,第二個是模擬Web Form 的 WinForm 程序。

  WebApplication1 執行如下:

  兩個伺服器端控制項 DropDownList 和 Button 伺服器端相應事件如下:

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {  
        }
   protected void Button1_Click(object sender, EventArgs e)
        {
            if (DropDownList1.SelectedValue == "Two")
            {
                lblInfor.Text = "Two";
            }
            else
            {
                lblInfor.Text = "One";
            }
        }

   功能代碼非常簡單,Button1被單擊後顯示dropdownlist 的文本值:

  Webform介紹完,剩下就是用WinForm 通過HTTP POST/GET來模擬Web Form 程序,程序運行界面如下:

  這裡的OnePost 與TwoPost 分別模擬WebForm中 Post 按鈕Click功能。

  貼出模擬的核心代碼:PostByWebRequest 函數:

1 private void PostByWebRequest(string strPostValue)
2    {
3        try
4        {
5            string URI = "http://localhost:2026/webform1.aspx/";
6            HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;
7            request.Method = "GET";
8            request.KeepAlive = true;
9            request.CookieContainer = cookieContainer;
10            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
11            System.IO.Stream responseStream = response.GetResponseStream();
12            System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
13            //返回的頁面html文本
14            string srcString = reader.ReadToEnd();
15            //VeiwState                
16            string viewStateFlag = "id=\"__VIEWSTATE\" value=\"";
17            int len1 = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;
18            int len2 = srcString.IndexOf("\"", len1);
19            string viewState = srcString.Substring(len1, len2 - len1);
20            //EventValidation                
21            string eventValidationFlag = "id=\"__EVENTVALIDATION\" value=\"";
22            len1 = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length;
23            len2 = srcString.IndexOf("\"", len1);
24            string eventValidation = srcString.Substring(len1, len2 - len1);
25
26            //編碼
27            viewState = System.Web.HttpUtility.UrlEncode(viewState);
28            eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation);
29
30            //這裡可以通過抓包工具獲得poststring.記得中文需要UrlEncode編碼。
31            string formatString = "DropDownList1={0}&Button1={1}&__VIEWSTATE={2}&__EVENTVALIDATION={3}";
32            string postString = string.Format(formatString, strPostValue,
33                "Do PostBack", viewState, eventValidation);
34
35            byte[] postData = Encoding.UTF8.GetBytes(postString);
36
37            URI = "http://localhost:2026/webform1.aspx/";
38            //POST
39            request = WebRequest.Create(URI) as HttpWebRequest;
40            request.Method = "POST";
41            request.KeepAlive = false;
42            request.ContentType = "application/x-www-form-urlencoded";
43            request.CookieContainer = cookieContainer;
44            request.ContentLength = postData.Length;
45
46            System.IO.Stream outputStream = request.GetRequestStream();
47            outputStream.Write(postData, 0, postData.Length);
48            outputStream.Close();
49
50            response = request.GetResponse() as HttpWebResponse;
51            responseStream = response.GetResponseStream();
52            reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
53            srcString = reader.ReadToEnd();
54        }
55        catch (Exception ex)
56        {
57            string msg = ex.Message;
58            MessageBox.Show(ex.Message);
59        }
60    }

   PostByWebRequest函數調用如下:

  OnePost 按鈕單擊執行: PostByWebRequest("One");

  TwoPost 按鈕單擊執行: PostByWebRequest("Two");

  註:如果在PostByWebRequest函數的第31行,不傳入ViewState或EVENTVALIDATION,WinForm內的兩個按鈕均不能成功模擬WebForm。最終模擬的正確效果是:預先在WebForm 的 Button_Click內設置斷點,接著點擊WinForm內的兩個按鈕,VS會自動截獲到該斷點設置。說明我們順利模擬了WebForm的POST的機制。如果點擊TwoPost 按鈕時,WebForm 伺服器端不但會執行Post按鈕事件還會執行DropDownlist 的SelectedIndexChanged事件。為什麼會執行到DropDownlist 的SelectedIndexChanged事件呢?這一切都歸功於ViewState。它記錄了WebForm的表單內容從而做出了相應的處理。所以WebForm 的 ViewState 機制還是很強大的。讓我們用事件機制去開發Web程序。同時ViewState機制讓我們的web form 程序更難被「爬蟲」獲取程序內容,想用程序Post WebForm 就必須傳入傳入ViewState 。否則POST不會返回正確的頁面內容。

  原文地址:http://www.cnblogs.com/ryanding/archive/2011/01/17/1936392.html

相關焦點

  • NET開發-ASP.NET WebForm應用程式中,使用C#操作TextBox的屬性
    ID屬性ID屬性是每個asp.net每個伺服器控制項必須具備的屬性,用來指定控制項的唯一ID值。TextBox控制項的ID值最好以「txt+有意義的單詞」組成,便於後臺C#代碼中識別並賦值和獲取值。1.2.2. Text屬性TextBox控制項的Text屬性用於給文本框賦值或取值,以及獲取用戶輸入的值。
  • NET開發-在ASP.NET WebForm應用程式中使用C#操作Label控制項的屬性
    屬性拖放好的Label控制項完整的源碼為:<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>1.2.1. ID屬性ID屬性是必須屬性,指定Label控制項的唯一ID值,最好修改以「lbl+有意義的單詞」為ID值,便於後臺代碼識別。
  • 自學MVC看這裡——全網最全ASP.NET MVC 教程匯總
    七天學會ASP.NET MVC (六)——線程問題、異常處理、自定義URL七天學會ASP.NET MVC (五)——Layout頁面使用和用戶角色管理七天學會ASP.NET MVC (四)——用戶授權認證問題七天學會ASP.NET MVC (三)——ASP.Net MVC 數據處理七天學會ASP.NET MVC (二)——ASP.NET
  • 如何實現Asp與Asp.Net共享Session
    > 語言 > 關鍵詞 > 最新資訊 > 正文 如何實現Asp與Asp.Net共享Session 在.net
  • asp.net core 5.0 中的 JsonConsole
    asp.net core 5.0 中的 JsonConsoleIntroasp.net core 5.0 中日誌新增了 JsonConsole,還是輸出日誌到 Console,但是會應用 Json 格式的一個 Formatter 把日誌格式化成 json 再輸出到控制臺
  • 原創:.NET中winform與webform互相通訊實例
    原創:.NET中winform與webform互相通訊實例 現在C#越來越多朋友使用了,大家都知道.NET可以開發winform與webform頁面,有時候在開發項目過程中要結合BS+CS這樣來應用
  • ASP.Net安裝簡明手冊
    MDAC2.6Beta22、軟體下載=====================·MDAC2.7(5.03MB)https://www.microsoft.com/data/download_270RTM.htm·FullSDKDownload(131MB)https://download.microsoft.com/download/.netframesdk
  • NET開發-在ASP.NET WebForm應用程式中,使用C#操作單選按鈕
    如下是在aspx頁面上添加的RadioButtonList按鈕完整Html代碼:這裡在aspx頁面上拖放了RadioButtonList按鈕,源碼為:<asp:RadioButtonList ID="RadioButtonList1" runat="server"
  • asp.net core 使用 TestServer 來做集成測試
    asp.net core 使用 TestServer 來做集成測試Intro之前我的項目裡的集成測試是隨機一個埠,每次都真實的啟動一個 WebServer,之前也有看到過微軟文檔上 TestServer 的介紹,當時沒仔細看過以為差不多就沒用,一直是啟動了一個真正的
  • 目前中國網站服務端開發主要有PHP、asp.net、Java三種語言
    通過各招聘網站招聘程式設計師的類型統計得出結果是目前中國網站服務端開發主要有PHP、asp.net、Java三種語言,其他佔少數有潛力有C#,C++等,而Python也開始被開發者使用在服務端開發。從招聘的數據信息顯示,PHP編程開發主要集中在中小網站,個人站點,個人博客等開發,而政府網站更喜歡asp.net開發,Java則主要在電商,支付系統,安全數據的等方面有優勢。
  • ASP.NET Core Identity Hands On(2)——註冊、登錄、Claim
    如果你熟悉 asp.net core ,那我猜你可能已經想到了沒錯 Options 就是 Di中的 Options在起作用。abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.@ (現在你再試試註冊,之前可以用 _ 現在不能用了)要求郵件不重複由true變為false允許新用戶鎖定由true變為falseIdentityOptions 可配置的選項非常多,完整的列表請移步 配置 ASP.NET 核心標識更多關於Options的內容請移步 asp.net
  • React系列八 - 深入理解setState
    在這篇文章中,我對React的setState進行了很多解析,希望可以幫助大家真正理解setState。(其中涉及到一個源碼,我有貼出,但是沒有詳細展開,有機會我們再對源碼進行解析,大家不是很懂也不影響你的學習,只需要知道React內部是這樣做的即可,面試時也可以回答出來)一. setState的使用 1.1.
  • Asp定時執行操作、Asp定時讀取資料庫(網頁定時操作詳解)
    如:<meta http-equiv="refresh" content="5;URL=https://www.qqview.com/test.asp">缺點:要在瀏覽器打開頁面,不能關閉。
  • ASP.NET學習篇(3)——幾個簡單的ASP.ENT的例子
    該函數中的Message、Name、Category並沒有定義,它們來自下面的代碼: 以下為引用的內容:    <form action="intro6.aspx" method="post" runat="server">       <h3> Name: <asp:textbox id
  • 簡明 ASP.NET Core 手冊
    如果你閱讀的是 PDF、電子書,或者列印版,請查閱官網(littleasp.net/book)的版本更新。有關版本信息和更新內容,請查閱本書的最後一頁。已經被翻譯成其它語言:The Little ASP.NET Core Book (English -- original version)https://www.recaffeinate.co/book/ASP.NET Core El Kitabı (Turkish)https://sahinyanlik.gitbooks.io/kisa-asp-net-core-kitabi
  • ASP.NET定製簡單的錯誤處理頁面
    首頁 > 語言 > 關鍵詞 > asp最新資訊 > 正文 ASP.NET定製簡單的錯誤處理頁面
  • 在ASP.NET中使用SQL的IN操作
    <formid="Form1"method="post"runat="server"><asp:DataGridid="DataGrid1"runat="server" AutoGenerateColumns="False"DataKeyField="EmployeeID"> <Columns><asp:TemplateColumn
  • asp.net連接MySQL,在GridView上實現增刪改查:前臺配置參數實現
    asp.net中如果想要在GridView控制項上實現增刪改查,通過給GridView添加數據源就可以實現,前提是使用的資料庫必須是數據源中有的。正好最近做的asp.net項目就需要用在GridView中使用mysql連接,所以在網上找了很多教程,都比較零散,用的最多的就是在底層.cs文件中通過GridView的一些事件去做相應的處理,而且很麻煩,我花了好幾個小時終於找到了在前臺通過配置的方式實現增刪改查,下面是具體步驟。一、在頁面上添加一個GridView控制項和一個SqlDataSource控制項。
  • 使用SQL Server In-Memory存儲ASP.NET的會話狀態
    概述在新的會話狀態中,有許多有意思的細節.我鼓勵你為自己而深入研究代碼.你將會發現它是一段奇妙的學習旅程,其間是關於SQL Server 2014 基於內存的OLTP "Hekaton"特性的性能和限制.一個特別的屬性包含在代碼中,以模擬內存中存儲BLOB類型的數據.內存優化表現在不支持BLOB類型.序列化的會話字典和可能的大
  • 在ASP.NET Core中使用Angular2,以及與Angular2的Token base身份認證
    Angular2是基於Component的,Component可以理解為是1.x時代的Controller + $Scope + viewView的很多語法也做了更新,比如<li ng-repeat="movie in vm.movies"></li> 變成了 <li *ngFor="let