[asp.net]网站数据安全之验证码
數據安全是網站實現必不可少的其中一環,其中最基本的就有防止暴力破解這一類的機器人攻擊。
機器人攻擊,顧名思義,單純地由程序算法計算出用戶名對應的密碼,達到破解賬戶的功能。
機器人攻擊的原理如下:
網頁與服務器是通過http協議進行通信的,網頁發出請求(request),經由服務器處理過后再把響應信息(response)返回給網頁。
如果服務器不進行任何安全設置的話,機器人就可以通過循環,不斷發送請求數據給服務器,比對服務器端的密碼信息,就能達到暴力破解的效果。
?
為了偽造網頁請求,首先需要做的就是知道網頁發送了什么東西給服務器,因此需要截獲網頁發送給服務器的http報文。
以下是一個簡單的asp.net登陸網頁:
1 <body> 2 <form id="form1" runat="server"> 3 <div> 4 <asp:TextBox ID="UID" runat="server" name="UID"></asp:TextBox><br /> 5 <asp:TextBox ID="PW" runat="server" name="PW"></asp:TextBox> 6 </div> 7 <asp:Button ID="Button1" runat="server" Text="登錄" onclick="Button1_Click" /> 8 </form> 9 </body>?
處理程序:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 public partial class Login : System.Web.UI.Page 9 { 10 protected void Page_Load(object sender, EventArgs e) 11 { 12 13 } 14 protected void Button1_Click(object sender, EventArgs e) 15 { 16 if (UID.Text == "admin" && PW.Text == "123") 17 { 18 Response.Write("登陸成功"); 19 } 20 else 21 { 22 Response.Write("登陸失敗"); 23 } 24 } 25 }網頁如下,輸入用戶名為admin,密碼為111:
然后立即用監視工具(Fiddler)查看網頁發送給服務器的請求報文:
從報文中,可以找到PW=111的字樣,這就是我們發送過去的密碼,通過循環地修改這個值,就能完成暴力破解。
?
機器人破解程序如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Net; 6 7 namespace ConsoleApplication1 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 WebClient wc = new WebClient(); 14 wc.Encoding = Encoding.UTF8; 15 for (int i = 0; i < 5000; i++) 16 { 17 string recv = wc.DownloadString("http://localhost:34581/Login/Login.aspx?__VIEWSTATE=%2FwEPDwULLTEzNjkxMzkwNjRkZItmCBZEBtaljaITi%2BP9tOSzd0a1hsw6qmnZTsRWpzng&__EVENTVALIDATION=%2FwEdAATO0aG3gZnScLq%2B3YhzJsDQVbQGLX9gL7AHTDMv6bbPFxoYRGJFkVe8AgQLV57tKfLN%2BDvxnwFeFeJ9MIBWR693X4PRaFD34N5nly1a8ZxUF2WtsMvHQaZ3G0IQUv6PL2A%3D&UID=admin&PW=" + i + "&Button1=%E7%99%BB%E5%BD%95"); 18 if (recv.Contains("登陸成功")) 19 { 20 Console.WriteLine("密碼:" + i); 21 break; 22 } 23 24 } 25 } 26 } 27 }?
另外,其實也可以通過C#中的webBrowser控件( ?getElementById().SetAttribute() ?)來實現機器人
?
驗證碼就是一個防止暴力破解的很好方法。
驗證碼實現如下圖:
?
分為以下幾個步驟:
1、用戶加載網頁,頁面發出生成新驗證碼的請求
2、一般處理程序受到請求后生成驗證碼,其中包含兩部分:圖片和相對應的字串(存于session)。
3、一般處理程序返回響應,網頁加載該驗證碼圖片。
4、填寫驗證碼,網頁發出請求,要求服務器的處理程序處理。
5、處理程序從session獲取字串,與網頁請求的驗證碼進行對比。
?
網頁代碼如下:
1 <body> 2 <form id="form1" runat="server"> 3 <div> 4 <img src="Handler.ashx" /> 5 </div> 6 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 7 <br /> 8 <asp:Button ID="Button1" runat="server" Text="登陸" onclick="Button1_Click" /> 9 </form> 10 </body><img src="Handler.ashx"/>這一句就是加載驗證碼圖片。當加載網頁的時候,會請求Handler.ashx處理程序處理,要求其提供驗證碼圖片。
?
生成驗證碼的一般處理程序代碼如下:
1 <%@ WebHandler Language="C#" Class="Handler" %> 2 3 using System; 4 using System.Web; 5 6 public class Handler : IHttpHandler, System.Web.SessionState.IRequiresSessionState{//必須加上System.Web.SessionState.IRequiresSessionState 7 public void ProcessRequest (HttpContext context) { 8 context.Response.ContentType = "image/JPEG"; //說明響應的格式是JPEG 9 using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(100, 50)) //生成位圖 10 { 11 using (System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bitmap)) //生成畫布 12 { 13 //以下這段為生成隨機數,并把其存到session內 14 Random rand = new Random(); 15 int code=rand.Next(1000, 9999); 16 string strCode=code.ToString(); 17 HttpContext.Current.Session["code"] = strCode; 18 19 //下面這段是生成驗證碼圖片 20 graph.DrawString(strCode, new System.Drawing.Font("宋體", 30), System.Drawing.Brushes.Green, new System.Drawing.PointF(0, 0)); 21 bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); //位圖保存在響應的輸出流中 22 } 23 } 24 } 25 26 public bool IsReusable { 27 get { 28 return false; 29 } 30 } 31 32 }一般處理程序生成驗證碼的bitmap,并存到響應(response)的輸出流中,網頁獲得響應信息后把bitmap顯示在網頁上
?
為了實現點擊驗證碼圖片后,自動更換驗證碼,可以作如下修改
<img src="Handler.ashx" onclick="this.src='Handler.ashx?aaa='+new Date()"/>點擊圖片后,瀏覽器會判斷當前的URL與目標URL是否一樣,如果一樣則不會做任何響應,否則會向目標URL發出請求。
由于new Date()產生的信息一直變化,因此能保證不同的兩秒內會產生不同的URL,從而達到點擊更換的效果。
轉載于:https://www.cnblogs.com/TaigaCon/archive/2012/08/20/2646941.html
總結
以上是生活随笔為你收集整理的[asp.net]网站数据安全之验证码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 64位Linux下使用QQ
- 下一篇: 字符编码笔记:ASCII,Unicode