天天看點

Web安全實踐(4)c#簡單http程式設計示例

識:c# http協定

前言

   web安全實踐系列主要是對《黑客大曝光——web應用安全機密與解決方案(第二版)》的内容做的實踐研究和部分程式設計實作。是以如果您能完全了解那本書可以跳過本文章。

                                                                   正文

關于http程式設計我們可以采取套接字的方式遵循http協定來做。我采用的C#,對于http程式設計微軟提供了已經封裝好的類,WebRequest,WebResponse,HttpWebRequest,HttpWebResponse是常用的幾個類,關于這些類的詳細介紹請參考部落格園内的其他文章,我隻簡單介紹我所用到的HttpWebRequest,HttpWebResponse類。抛磚引玉,因為做個好的http程式也是需要一定時間的,我這裡給出的不是成型的工具,隻是一個簡單的例子,時間有限,望各位見諒。

HttpWebRequest類

當要向 Internet 資源發送資料時,GetRequestStream 方法傳回用于發送資料的Stream執行個體。BeginGetRequestStream 和 EndGetRequestStream 方法提供對發送資料流的異步通路。

下面的示例為 URI http://www.contoso.com/ 建立 HttpWebRequest。

Web安全實踐(4)c#簡單http程式設計示例

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/");

注意:不要混淆 HttpWebResponse 和 HttpResponse;後者用于 ASP.NET 應用程式,而且它的方法和屬性是通過 ASP.NET 的内部 HttpResponse 對象公開的。

決不要直接建立 HttpWebResponse 類的執行個體。而應當使用通過調用 HttpWebRequest.GetResponse 所傳回的執行個體。

通過調用 GetResponseStream 方法,以 Stream 的形式傳回來自 Internet 資源的響應的内容。

Web安全實踐(4)c#簡單http程式設計示例

HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://www.contoso.com");

Web安全實踐(4)c#簡單http程式設計示例

HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();

Web安全實踐(4)c#簡單http程式設計示例

// Insert code that uses the response object.

Web安全實踐(4)c#簡單http程式設計示例

HttpWResp.Close()

URI 是 Internet 上可由應用程式使用的資源的簡潔表示形式。Uri 類定義了屬性和方法來處理 URI,包括分析、比較群組合。Uri 類屬性是隻讀的,修改 Uri 執行個體需使用 UriBuilder 類。

Uri 類隻存儲絕對 URI(例如"http://www.contoso.com/index.htm")。相對 URI(例如"/new/index.htm")必須相對于基 URI 展開,這樣才是絕對的。提供了 MakeRelative 方法在必要時将絕對 URI 轉換為相對 URI。

URI 由轉義編碼存儲為規範化 URI,所有 ASCII 值大于 127 的字元都被替換為它們的等效十六進制數。為使 URI具有規範化格式,Uri 構造函數執行以下步驟。

将 URI 方案轉換為小寫。

将主機名轉換為小寫。

移除預設端口号和空端口号。

移除多餘的段(如"/"和"/test"段)以簡化 URI。

使用 ToString 方法,可以将 Uri 類的内容從轉義編碼的 URI 引用轉換為可讀的 URI 引用。

注意:URI 類支援使用以下格式的 IP 位址:四組表示法的 IPv4 協定和冒号分隔的十六進制 IPv6 協定。請記住在IPv6 位址兩邊括上方括号,如 http://[::1]。

Web安全實踐(4)c#簡單http程式設計示例

Uri siteUri = new Uri("http://www.contoso.com/");

Web安全實踐(4)c#簡單http程式設計示例

WebRequest wr = WebRequest.Create(siteUri);

程式示例說明

Web安全實踐(4)c#簡單http程式設計示例

在界面設計上,用一個textbox控件來輸入位址,三個combobox控件提供請求方式和編碼方式,連續發送次數的選擇,因為不同的伺服器可能支援不同的請求方式,不同的頁面也可能是不同的編碼方式。

另外兩個textbox控件分别用來顯示頭資訊和内容資訊。

(1)資訊處理類ProcessInfo。我們把使用者輸入的各種參數傳給該類,由它負責發送請求和接收響應。下面給出的主要的函數,結合代碼做說明。

/// <summary>

/// 發送請求接受響應

/// </summary>

/// <param name="tb">顯示頭資訊的TextBox</param>

/// <param name="ta">顯示内容資訊的TextBox</param>

/// <param name="method">請求方式</param>

/// <param name="codemethod">編碼方式</param>

public void SendInfo( TextBox tb,TextBox ta,string method,string codemethod)

{

//首先我們建立HttpWebRequest的執行個體,用來發送請求。

hwr = (HttpWebRequest)WebRequest.Create(uri);

//然後設定它的請求方式。

hwr.Method = method;

CodingMethod = codemethod;

try

//建立HttpWebResponse的執行個體

response = (HttpWebResponse)hwr.GetResponse();

//因為response.Headers包含了我們想要的頭資訊,而它是WebHeaderCollection類型

//是以我們建立WebHeaderCollection執行個體myheaders,然後把它轉化成字元串。

WebHeaderCollection myheaders = response.Headers;

f1.AddInfo(myheaders.ToString(), ta);

// GetResponseStream()方法,擷取的資訊是傳回的内容資訊。

Stream resStream = response.GetResponseStream();

int count = resStream.Read(buf, 0, buf.Length);

f1.AddInfo(getString(buf), tb);

hwr.Abort();

resStream.Close();

response.Close();

}

catch(Exception e)

MessageBox.Show(e.ToString());

finally

Thread.CurrentThread.Abort();

(2)form1的主要函數。

這是點選button按鈕的事件處理函數,獲得使用者設定的各種參數,然後啟動單獨的線程調用資訊處理類ProcessInfo的相關方法。

private void button_send_Click(object sender, EventArgs e)

// 部分代碼省略

for (int i = 0; i < Int32.Parse(this.comboBox_sendtiems.SelectedItem.ToString()); i++)

Thread t = new Thread(new ThreadStart(GetInfo));

t.Start();

/// 把參數傳入ProcessInfo類的處理函數

private void GetInfo()

ProcessInfo pi = new ProcessInfo(textBox_uri.Text,this);

pi.SendInfo(textBox_content, textBox_head, combox1, combox2);

/// 用于異步調用向textbox中添加響應資訊

/// <param name="info"></param>

/// <param name="myt"></param>

public void AddInfo(string info,TextBox myt)

//判斷是否為跨線程調用

if (myt.InvokeRequired)

SetInfoCallback sic = new SetInfoCallback(AddInfo);

this.Invoke(sic, new object[] { info,myt });

else

myt.Text += info;

好了,這個簡單的例子可能不能給你太多的啟示,但是我的這個系列還得繼續向前走。更多的程式設計實踐,如果你做了,一定要分享哦,獨樂樂不如衆樂樂嗎!

本文轉自懸魂部落格園部落格,原文連結:http://www.cnblogs.com/xuanhun/archive/2008/10/28/1321085.html,如需轉載請自行聯系原作者

繼續閱讀