网站地图    收藏   

主页 > 入门引导 > 黑客攻防 >

Web安全实践(4)c#简单http编程示例 - 网站安全 - 自学php网

来源:未知    时间:2015-04-15 13:43 作者:xxadmin 阅读:

[导读] 关于http 编程 我们可以采取套接字的方式遵循http协议来做。我采用的C#,对于http编程微软提供了已经封装好的类,WebRequest,WebResponse,HttpWebRequest,HttpWebResponse是常用的几个类,关于这...

关于http编程我们可以采取套接字的方式遵循http协议来做。我采用的C#,对于http编程微软提供了已经封装好的类,WebRequest,WebResponse,HttpWebRequest,HttpWebResponse是常用的几个类,关于这些类的详细介绍请参考博客园内的其他文章,我只简单介绍我所用到的HttpWebRequest,HttpWebResponse类。抛砖引玉,因为做个好的http程序也是需要一定时间的,我这里给出的不是成型的工具,只是一个简单的例子,时间有限,望各位见谅。
HttpWebRequest类
HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
不要使用 HttpWebRequest 构造函数。使用 WebRequest.Create 方法初始化 HttpWebRequest 的一个新实例。如果 URI 的方案是 http:// 或 https://,则 Create 将返回 HttpWebRequest 实例。
GetResponse 方法向 RequestUri 属性中指定的 Internet 资源发出同步请求并返回包含该响应的 HttpWebResponse 实例。可以使用 BeginGetResponse 和 EndGetResponse 方法对 Internet 资源发出异步请求。
当要向 Internet 资源发送数据时,GetRequestStream 方法返回用于发送数据的Stream实例。BeginGetRequestStream 和 EndGetRequestStream 方法提供对发送数据流的异步访问。
下面的示例为 URI http://www.2cto.com/ 创建 HttpWebRequest。

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


HttpWebResponse类
此类包含对 WebResponse 类中的属性和方法的 HTTP 特定用法的支持。HttpWebResponse 类用于生成发送 HTTP 请求和接收 HTTP 响应的 HTTP 独立客户端应用程序。
注意:不要混淆 HttpWebResponse 和 HttpResponse;后者用于 ASP.NET 应用程序,而且它的方法和属性是通过 ASP.NET 的内部 HttpResponse 对象公开的。
决不要直接创建 HttpWebResponse 类的实例。而应当使用通过调用 HttpWebRequest.GetResponse 所返回的实例。
通过调用 GetResponseStream 方法,以 Stream 的形式返回来自 Internet 资源的响应的内容。
下面的示例返回 HttpWebRequest 的 HttpWebResponse:
HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create("http://www.2cto.com");
HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();

// Insert code that uses the response object.
HttpWResp.Close()


Uri类
URI 是 Internet 上可由应用程序使用的资源的简洁表示形式。Uri 类定义了属性和方法来处理 URI,包括分析、比较和组合。Uri 类属性是只读的,修改 Uri 实例需使用 UriBuilder 类。
Uri 类只存储绝对 URI(例如"http://www.2cto.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 包括段标识符或查询。段标识符是 URI 中跟在数字符号 (#) 后的任何文本,存储在 Fragment 属性中。查询信息是 URI 中跟在问号 (?) 后的任何文本,存储在 Query 属性中。

注意:URI 类支持使用以下格式的 IP 地址:四组表示法的 IPv4 协议和冒号分隔的十六进制 IPv6 协议。请记住在 IPv6 地址两边括上方括号,如 http://[::1]。

 

下面的示例创建 Uri 类的实例,并用它来创建 WebRequest。

Uri siteUri = new Uri("http://www.2cto.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();

}

}

/// <summary>

/// 把参数传入ProcessInfo类的处理函数

/// </summary>

private void GetInfo()

{



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

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

}

/// <summary>

/// 用于异步调用向textbox中添加响应信息

/// </summary>



/// <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;

}

}

好了,这个简单的例子可能不能给你太多的启示,但是我的这个系列还得继续向前走。更多的编程实践,如果你做了,一定要分享哦,独乐乐不如众乐乐吗!

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论