識: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。
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/");
注意:不要混淆 HttpWebResponse 和 HttpResponse;後者用于 ASP.NET 應用程式,而且它的方法和屬性是通過 ASP.NET 的内部 HttpResponse 對象公開的。
決不要直接建立 HttpWebResponse 類的執行個體。而應當使用通過調用 HttpWebRequest.GetResponse 所傳回的執行個體。
通過調用 GetResponseStream 方法,以 Stream 的形式傳回來自 Internet 資源的響應的内容。
HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://www.contoso.com");
HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();
// Insert code that uses the response object.
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]。
Uri siteUri = new Uri("http://www.contoso.com/");
WebRequest wr = WebRequest.Create(siteUri);
程式示例說明
在界面設計上,用一個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,如需轉載請自行聯系原作者