深入学习C#网络编程之HTTP应用编程(上)

2020-06-15 20:00:03王旭

清晰的认识我想类库里面的属性和方法都是神马和浮云。

五 :案例

      既然是上篇,就根据“模拟登录”的思想做一个简单的“暴力破解”的小程序,非常简单,呵呵。

第一步: 首先我们写两个action,一个login(登录页面),一个index(用户后台首页)。

 namespace Test.Controllers
 {
  [HandleError]
  public class HomeController : Controller
  {
   public ActionResult Login()
   {
    return View();
   }
 
   [HttpPost]
   public ActionResult Index(Model model)
   {
    if (model.UserName == "11" && model.Password == "11")
     return View(model);
    else
     return RedirectToAction("Login");
   }
 
   public ActionResult About()
   {
    return View();
   }
  }
 
  public class Model
  {
   public string UserName { get; set; }
 
   public string Password { get; set; }
  }
 }

好了,我们打开fiddler,输入admin,admin,点击提交,看看都post些什么到server端了,方便我们后面的模拟登录,

这里的head信息相信大家还是能看懂吧。

第二步:我们新建一个winform的程序。

namespace Http
 {
  public partial class Form1 : Form
  {
   public Form1()
   {
    InitializeComponent();
   }
 
   private void Form1_Load(object sender, EventArgs e)
   {
    //网页内容填充webbrowser1控件
    string url = "http://localhost:59773/";
 
    //创建http链接
    var request = (HttpWebRequest)WebRequest.Create(url);
 
    var response = (HttpWebResponse)request.GetResponse();
 
    Stream stream = response.GetResponseStream();
 
    StreamReader sr = new StreamReader(stream);
 
    string content = sr.ReadToEnd();
 
    webBrowser1.DocumentText = content;
   }
 
   /// <summary>
 /// 暴力破解
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
   private void button1_Click(object sender, EventArgs e)
   {
    var url = "http://localhost:59773/Home/Index";
 
    //上一次的返回结果
    string prev = string.Empty;
 
    for (int i = 0; i < 100; i++)
    {
     var username = new Random(DateTime.Now.Millisecond).Next(8, 19).ToString();
 
     Thread.Sleep(2);
 
     var password = new Random(DateTime.Now.Millisecond).Next(8, 19).ToString();
 
     //post提交的内容
     var content = "username=" + username + "&password=" + password;
 
     //将content变为字节形式
     var bytes = Encoding.UTF8.GetBytes(content);
 
     var request = (HttpWebRequest)WebRequest.Create(url);
 
     //根据fiddler中查看到的提交信息,我们也试着模拟追加此类信息然后提交
     request.Method = WebRequestMethods.Http.Post;
     request.Timeout = 1000 * 60;
     request.AllowAutoRedirect = true;
     request.ContentLength = bytes.Length;
     request.ContentType = "application/x-www-form-urlencoded";
 
 
     //将content写入post请求中
     var stream = request.GetRequestStream();
     stream.Write(bytes, 0, bytes.Length);
     stream.Close();
 
     //写入成功,获取请求流
     var response = (HttpWebResponse)request.GetResponse();
 
     var sr = new StreamReader(response.GetResponseStream());
 
     var next = sr.ReadToEnd();
 
     if (string.IsNullOrEmpty(prev))
     {
      prev = next;
     }
     else
     {
      if (prev != next)
      {
       webBrowser2.DocumentText = next;
       MessageBox.Show("恭喜你,密码已经破解!一共花费:" + (i + 1) + "次,用户名为:" + username + ",密码为:" + password);
       return;
      }
     }
 
    }
    webBrowser2.DocumentText = "不好意思,未能破解";
   }
  }
 }