本站业务范围:1、PC端软件开发、网站开发 2、移动端APP、网站、微信接口、微商城开发 3、视频教程、课程设计和辅导 4、单片机开发 5、串口通讯调试
 当前位置:文章中心 >> Asp.net专题(WCF/WPF/WF)
立即购买视频教程 验证码的原理和对应的登录方法
夜鹰教程网 来源:www.yyjcw.com 日期:2017-10-23 16:50:23
我在上一篇文章中已经讲解了一般网站的登录原理和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲​验证码的原理和对应的登录方法。

这篇文章不能解决你的问题?我们还有相关视频教程云课堂 全套前端开发工程师培训课程

微信号:yyjcw10000 QQ:1416759661  远程协助需要加QQ!

业务范围:视频教程|程序开发|在线解答|Demo制作|远程调试| 点击查看相关的视频教程

技术范围:全端开发/前端开发/webapp/web服务/接口开发/单片机/C#/java/node/sql server/mysql/mongodb/android/。 




验证码的由来

几 年前,大部分网站、论坛之类的是没有验证码的,因为对于一般用户来说验证码只

是增加了用户的操作,降低了用户的体验。但是后来各种灌水机器人、投票机器 人、

恶意注册机器人层出不穷,大大增加了网站的负担同时也给网站数据库带来了大量的

垃圾数据。为了防止各种机器人程序的破坏,于是程序员想出了只有人眼能 够识别的,

程序不容易识别的验证码!

验 证码是一个图片,将字母、数字甚至汉字作为图片的内容,这样一张图片中的内容

用人眼很容易识别,而程序将无法识别。在进行数据库操作之前(比如登录验证、

投票、发帖、回复、注册等等)程序首先验证客户端提交的验证码是否与图片中的内容

相同,如果相同则进行数据库操作,不同则提示验证码错误,不进行数据库操 作。这

样各种机器人程序就被拒之门外了!

但 是随着计算机科学的发展,模式识别等技术越来越成熟,于是编写机器人程序的家伙

可以通过程序将直接写在图片中的内容识别出来,然后提交到服务器,这样验证 码将形

同虚设。为了防止机器人程序的识别,验证码的图片生成也不断在发展,加入干扰点、

干扰线,文字变形、变换角度位置,颜色不同……各种防止计算机识别 的技术也应用到

验证码中。就在这两种技术的竞争中,于是便形成了我们现在看到的验证码,已经有很

多人在抱怨“这是什么验证码哦,人眼都分辨不清楚是什 么”,一切也是无奈。

验证码的使用

验证码是针对各种机器人程序的,所以验证码图片中的内容是不能存放在Cookie、HTML

和URL中的,如果看到一个验证码图片的URL是http://xxxxxx.com/Expwd.aspx?code=1af8

而 验证码图片中的内容就是1af8那将是十分可笑的事情。同时,如果通过抓包发现了

Cookie中保存了验证码的值或者查看HTML时看到了形 如:<input type="hidden"

id="exPwd" name="exPwd" value="1af8"/>这样将验证码的内容放在隐藏元素中也

是不可思议的。对于这些行为,显然是这个程序员不知道验证码是拿来干什么的,只是

别人的网站上有验证码,与自己的网站也弄一个来赶时髦。另外还有一种好笑的是验证

码看上去像是验证码,结果看HTML代码居然不是一个图片,而是一 个<span>1</span>

<span>a</span><span>f< /span><span>8</span>。大家不要不以为然,以上这几

种情况还真是我现实生活中遇到过的,当年写投票机 器人的时候遇到这种情况我最高兴了

验证码的内容必须保存在服务器端,一般我们可以将随机生成的验证码的内容放入Session

中,用户提交的时候将提交的内容与Session中的验证码进行比较判断。在生成验证码的页

面后台代码可以写为:

protected void Page_Load(object sender, EventArgs e)
   {
       
string checkCode = CreateCode(4);
       Session[
"CheckCode"= checkCode;
       CreateImage(checkCode);
   } 

比如在登录进行验证的时候可以写为:

protected void btnLogin_Click(object sender, ImageClickEventArgs e)
  {
      
if (Session["CheckCode"== null)
      {
          UIHelper.Alert(Page, 
"验证码已过期,请重新输入");
          
return;
      }
      
if (Session["CheckCode"].ToString().ToLower() != txbCode.Text.ToLower())

//验证码忽略大小写
      {
          UIHelper.Alert(Page, 
"验证码错误");
          
return;
      } 
//数据库验证…… 
}

 

使用C#登录带验证码的网站

image_thumb.png

前面我们已经对整个验证码的原理和使用有了基本的了解,现在言归正传,

讲讲如何登录带验证码的网站。这里我们以CSDN的登录为例。

1.在IE中正常登录一次并把登录时候的数据包抓下来。

2.分析其中的登录原理如下:

1)请求http://passport.csdn.net/UserLogin.aspx页面,与服务器建立会话,

服务器返回一个SessionID在HTTP的Header中,如下,其他内容我们可以忽略。

ASP.NET_SessionId=ydebagnqgiiixi2dvihfw355; path=/; HttpOnly,ABCDEF=;

domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,QWERTOP=;

domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,activeUserName

=Guest; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,UserName

=Guest; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,PName=;

domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,ClientKey=;

expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,userid=0; expires=Tue,

22-Apr-2008 17:57:01 GMT; path=/,ClientKey=933ffb09-5096-4fbb-b90f-5f0bff335b41;

path=/

2) 该页面返回的HTML中有一个<input type="hidden" name="ClientKey" value=

"a50b14fa-2a75-4364-bbeb-3b498b72aa46" />这个值在登录提交时也需要,所以需要

从HTML代码中分离出来。

3)将该SessionID作为Cookie的内容发送到验证码生成的页面

http://passport.csdn.net/ShowExPwd.aspx 该页面将返回一个图片的二进制流。

4)将返回的二进制流转换为图片并呈现给用户。

Image img = new Bitmap(
          Http.GetStreamByBytes(
"http://passport.csdn.net" ,

"http://passport.csdn.net/ShowExPwd.aspx", b,
                                aspcookie, 
out header));//获得验证码图片
this.pictureBox1.Image = img;

 

5)用户输入用户名、密码和验证码,然后和同前面分离出的ClientKey按如下的格式POST

http://passport.csdn.net/UserLogin.aspx进行验证。

__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwULLTE4NDgzM

DI2NjcPFgIeCkZpbmlzaFN0YXloFgJmD2QWB

AIBDxYCHgRUZXh0BQznlKjmiLfnmbvlvZVkAgIPZBYCAgMPZBYCAgEPFgIeB1Zpc2libG

VoZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAgUeY3RsMDAkQ1B

IX0NvbnRlbnQkY2JfU2F2ZVN0YXRlBR1jdGwwMCRDUEhfQ29udGVudCRJbWFnZV9Mb

2dpbr5SL%2FGtMqVCJ%2FCh4jH%2FXp4DhlVU&ctl00%24CPH_Content%24tb

_LoginNameOrLoginEmail=studyzy&ctl00%24CPH_Content%24tb_Password=123&

ctl00%24CPH_Content%24tb_ExPwd=wgssj&ClientKey=a50b14fa-2a75-4364-bbeb-3b498b72aa46&ctl00%24CPH_Content%24cb_SaveState=on&from=http%3A%2F%2Fhi.csdn.net%

2Fmy.html&MailParameters=&MailParameters=&ctl00%24CPH_Content%24

Image_Login.x=26&ctl00%24CPH_Content%24Image_Login.y=11

6)验证成功的话将返回包含用户信息(发帖数、积分、博客排名等等)的HTML,

验证失败将返回具体的错误信息。

3.以上将CSDN的登录原理分析清楚了,那么接下来就是代码实现了,代码实现比较简单,

我直接在上篇文章所使用的Demo代码上修改的,所以写的不是很漂亮,大家若有兴趣可以

看看。/Files/studyzy/LoginCSDNDemo.rar
成功登录后如图:

image_thumb_1.png

现在当前用户已经成功登录了,那么接下来是要在CSDN上发表博客、论坛发帖只需要将当前

的SessionID放入Cookie中,在提交时使用该Cookie即可。

复制链接 网友评论 收藏本文 关闭此页
上一条: 网页渲染以及其重要性  下一条: HTTP请求/响应报文与工作原理详解
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  推荐教程/优惠活动

  热门服务/教程目录

  夜鹰教程网  新手必看,详细又全面。
  夜鹰教程网  购买教程  夜鹰教程网  在线支付-方便
  夜鹰教程网  担保交易-快捷安全   夜鹰教程网  闪电发货
  夜鹰教程网  电话和QQ随时可以联系我们。
  夜鹰教程网 不会的功能都可以找我们,按工作量收费。

客服电话:153 9760 0032

购买教程QQ:1416759661  
  热点推荐
表单提交中get和post方式的区别有…
解决ASP中UTF-8与GB2312编码转换乱…
asp数组中REDIM的用法(动态数组)…
生成html的新方法ASP
ASP字符串函数大全
ASP生成Word文件的代码
ASP中Randomize随机函数的使用
十天学会ASP教程之第一天:安装调…
自定义的asp日期格式化函数
防范ASP网站漏洞的八大法则之一
十天学会ASP教程之第二天:表单传…
asp中关于从utf8页面到gb2312页面…
ASP教程:实现长文章分页功能
IIS6架设网站的问题总结
五分钟打开 allow_url_fopen 的最…
  尊贵服务
夜鹰教程网 承接业务:软件开发 网站开发 网页设计 .Net+C#+VS2008+MSsql+Jquery+ExtJs全套高清完整版视频教程
  最近更新
C# Json数据中的特殊字符导致页面…
博客园是有开发博客查询相关的接口…
C#里面的ref和out区别
C#调用API让声卡发出声音
.NET使用反射读取用户自定义的枚举…
.net操作SqlServer数据库增删改查…
如何将WCF服务部署到远程服务器
对WebApi 实现服务端信息的监控
用WCF生成Restful风格的接口返回 …
只有一个地址如何调用WCF服务
WCF简介
搭一个简单的wcf服务
WCF配置说明
WCF传输的数据量过大问题的解决方…
asp.net大文件分块上传文件秒传断…
  工具下载  需要远程协助? 

sql2008视频教程 c#视频教程

VIP服务:如果您的某个功能不会做,可以加我们QQ,给你做DEMO!

JQUERY  Asp.net教程

MVC视频教程  vs2012
.NET+sql开发
手机:15397600032 C#视频教程下载
微信小程序 vue.js高级实例视频教程

教程咨询QQ:1416759661


这篇文章不能解决你的问题?我们还有相关视频教程云课堂 全套前端开发工程师培训课程

微信号:yyjcw10000 QQ:1416759661  远程协助需要加QQ!

业务范围:视频教程|程序开发|在线解答|Demo制作|远程调试| 点击查看相关的视频教程

技术范围:全端开发/前端开发/webapp/web服务/接口开发/单片机/C#/java/node/sql server/mysql/mongodb/android/。 



关于我们 | 购买教程 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3