数据安全是网站实现必不可少的其中一环,其中最基本的就有防止暴力破解这一类的机器人攻击。

机器人攻击,顾名思义,单纯地由程序算法计算出用户名对应的密码,达到破解账户的功能。

机器人攻击的原理如下:

网页与服务器是通过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]网站数据安全之验证码相关推荐

  1. 由“ASP.NET网站限制访问频率”想到的两点问题(转)

    转自:http://www.cnblogs.com/wangwei/archive/2009/09/19/1570242.html "ASP.NET网站限制访问频率"的作者遇到了两 ...

  2. asp.net core 腾讯验证码的接入

    asp.net core 腾讯验证码的接入 Intro 之前使用的验证码服务是用的极验验证,而且是比较旧的,好久之前接入的,而且验证码服务依赖 Session,有点不太灵活,后来发现腾讯也有验证码服务 ...

  3. 预编译 ASP.NET 网站以进行部署

    预编译 ASP.NET 网站以进行部署和更新 打开一个命令窗口并定位到包含 .NET Framework 的文件夹. .NET Framework 将安装在以下位置. %windir%\Microso ...

  4. ASP.NET 网站预编译概述

    默认情况下,在用户首次请求资源(如网站的一个页)时,将动态编译 ASP.NET 网页和代码文件.第一次编译页和代码文件之后,会缓存编译后的资源,这样将大大提高随后对同一页提出的请求的效率. ASP.N ...

  5. Asp.net网站的自动部署-sqlserver数据库的自动部署

    Asp.net网站的自动部署 2005-09-28 这段时间要解决的问题是asp.net网站的自动部署,主要功能是在安装的时候实现数据库的部署和基本数据的添加,asp.net网站的部署(多个虚拟目录) ...

  6. 解决ASP.NET网站发布问题

    解决ASP.NET网站发布问题 参考文章: (1)解决ASP.NET网站发布问题 (2)https://www.cnblogs.com/limusic/p/3378023.html 备忘一下.

  7. 实现 ASP.NET 网站地图提供者

    ASP.NET 网站导航提供若干 Web 服务器控件用于 Web 页面中导航结构的显示:SiteMapPath,TreeView,和 Menu 控件.这些 Web 服务器控件都使用 ASP.NET 默 ...

  8. vs2005不能找到ASP.NET网站之郁闷

    今天下午真是郁闷呀! 打开vs2005之后,想新建一个 "ASP.NET网站",但是怎么也没找到网站模版,我选择的是C#语言, 后来发现语言里面有两个Visual C#选项呀,要选 ...

  9. VS 2012 如何发布 ASP.NET 网站到本地IIS

    VS2012 与 VS 2010 不同的地方是在发布网站的时候VS2012的界面会让人有种摸不着头脑的感觉. 下面是如何将ASP.NET 网站发布到本地IIS上的步骤. 第一步,右键解决方案管理器中的 ...

最新文章

  1. 粗糙集(Rough sets)、模糊逻辑(Fuzzy Logic)
  2. 麦肯锡《2020年人工智能状况》报告:企业收入增长,AI真的出了力
  3. php 7.1 openssl安装,介绍 php7.1 安装openssl扩展,php openssl
  4. 国外网站评出对程序员最具影响的书籍清单
  5. oracle 添加监听地址,oracle批改监听地址为localhost
  6. 组织JSON数据、JSON转换
  7. 紫金计算机网络,南京理工大学紫金学院《计算机网络技术》考试复习试题试题[含答案解析]...
  8. 安装LR提示“此计算机缺少 vc2005_sp1_with_atl_fix_redist,请安装所有缺少的必要组件,然后重新运行此安装“
  9. pyCharm第三方库安装
  10. turbo c语言编程,turbo c3.0官方版下载-Turbo C下载[编程工具]-天极下载
  11. 游戏及相关CG行业知识分享大V全整合
  12. 皮皮高清影视播放器2015官方版
  13. Ubuntu安装Caffe .build_release/tools/caffe: error while loading shared libraries: libcudnn.so.5
  14. java实现超级玛丽游戏
  15. 百度移动生态升级一周年:背后的攻与守、破与立
  16. 下载kafka安装包
  17. 2021年熔化焊接与热切割试题及解析及熔化焊接与热切割模拟试题
  18. 2022年6月电子学会Python等级考试试卷(一级)答案解析
  19. 面试:Art虚拟机和Davlik虚拟机简要对比
  20. 数据库应用——MySQL函数

热门文章

  1. linux怎么增加cpu负载,Linux下的CPU平均负载
  2. kdj超卖_三分钟学会KDJ三大买卖绝技,简单高效,把握最佳买卖点,不懂KDJ的股民值得一看!...
  3. 验证Linux主机是否支持RDMA
  4. leetcode算法题--重建二叉树
  5. python中对象和变量的关系_浅析python中的类变量和对象变量
  6. python isnumeric函数用法_Python中isnumeric()方法的使用简介
  7. git恢复到上次提交
  8. 【Java并发编程】—–“J.U.C”:ConcurrentLinkedQueue
  9. 藏妹子之处(excel)
  10. 统计的一个小题目python实现