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

news/2024/5/8 18:08:47/文章来源:https://blog.csdn.net/studyzy/article/details/11524363

我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法。

验证码的由来

几年前,大部分网站、论坛之类的是没有验证码的,因为对于一般用户来说验证码只是增加了用户的操作,降低了用户的体验。但是后来各种灌水机器人、投票机器人、恶意注册机器人层出不穷,大大增加了网站的负担同时也给网站数据库带来了大量的垃圾数据。为了防止各种机器人程序的破坏,于是程序员想出了只有人眼能够识别的,程序不容易识别的验证码!

验证码是一个图片,将字母、数字甚至汉字作为图片的内容,这样一张图片中的内容用人眼很容易识别,而程序将无法识别。在进行数据库操作之前(比如登录验证、投票、发帖、回复、注册等等)程序首先验证客户端提交的验证码是否与图片中的内容相同,如果相同则进行数据库操作,不同则提示验证码错误,不进行数据库操作。这样各种机器人程序就被拒之门外了!

但是随着计算机科学的发展,模式识别等技术越来越成熟,于是编写机器人程序的家伙可以通过程序将直接写在图片中的内容识别出来,然后提交到服务器,这样验证码将形同虚设。为了防止机器人程序的识别,验证码的图片生成也不断在发展,加入干扰点、干扰线,文字变形、变换角度位置,颜色不同……各种防止计算机识别的技术也应用到验证码中。就在这两种技术的竞争中,于是便形成了我们现在看到的验证码,已经有很多人在抱怨“这是什么验证码哦,人眼都分辨不清楚是什么”,一切也是无奈。

验证码的使用

验证码是针对各种机器人程序的,所以验证码图片中的内容是不能存放在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#登录带验证码的网站

前面我们已经对整个验证码的原理和使用有了基本的了解,现在言归正传,讲讲如何登录带验证码的网站。这里我们以CSDN的登录为例。

image

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=%2FwEPDwULLTE4NDgzMDI2NjcPFgIeCkZpbmlzaFN0YXloFgJmD2QWBAIBDxYCHgRUZXh0BQznlKjmiLfnmbvlvZVkAgIPZBYCAgMPZBYCAgEPFgIeB1Zpc2libGVoZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAgUeY3RsMDAkQ1BIX0NvbnRlbnQkY2JfU2F2ZVN0YXRlBR1jdGwwMCRDUEhfQ29udGVudCRJbWFnZV9Mb2dpbr5SL%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%24Image_Login.x=26&ctl00%24CPH_Content%24Image_Login.y=11

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

3.以上将CSDN的登录原理分析清楚了,那么接下来就是代码实现了,代码实现比较简单,我直接在上篇文章所使用的Demo代码上修改的,所以写的不是很漂亮,大家若有兴趣可以看看。/Files/studyzy/LoginCSDNDemo.rar
成功登录后如图:

image

现在当前用户已经成功登录了,那么接下来是要在CSDN上发表博客、论坛发帖只需要将当前的SessionID放入Cookie中,在提交时使用该Cookie即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_865765.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高性能网站性能优化

从LiveJournal后台发展看大规模网站性能优化方法 于敦德 2006-3-16 一、LiveJournal发展历程 LiveJournal是99年始于校园中的项目&#xff0c;几个人出于爱好做了这样一个应用&#xff0c;以实现以下功能&#xff1a; 博客&#xff0c;论坛 社会性网络&#xff0c;找到朋友 聚合…

php搭建网站

一.需要一台没有安装过lamp环境的cenos7 二. yum install -y wget && wget -O install.sh https://notdocker.xp.cn/install.sh && sh install.sh 下载phpstudy 三. 浏览器输入这里的公网地址&#xff0c;载入界面后输入初始账户和用户名 四. 软件商店下载m…

实际采用 FleaPHP 的网站

下面都是采用 FleaPHP 框架开发的网站列表&#xff0c;如果发现无效连接请在留言。 如果你有采用 FleaPHP 开发的网站&#xff0c;并且愿意公开网址&#xff0c;可以发邮件到 dualface (at) gmail.com 需要提供的信息包括网站名称和连接地址&#xff0c;以及简单的介绍文字。 云…

LAMP网站架构搭建案例—论坛搭建

LAMP即LinuxApacheMysqlphp的简写。下面以论坛搭建为例来说明LAMP架构。 准备 创建论坛站点 mkdir -p /var/www/westos.com/bbs/html vim /etc/httpd/conf.d/bbs.conf1. 安装数据库 yum install mariadb mariadb.server -y systemctl start mariadb###安全初始化数据库 mysq…

vs2005 发布网站,只生成一个dll

2008年02月09日 星期六 18:10 1.允许更新此预编辑站点 选中这一项后&#xff0c;编译出来的包括aspx文件和dll&#xff0c;与2003下一样。 不选中这一项&#xff0c;编译出来的aspx中没有界面信息&#xff0c;只有一句静态文本&#xff0c;就是不允许发布后修改页面 为了不让订…

seo优化:把百度放进数据库

seo优化:把百度放进数据库 有时候我想&#xff0c;能把百度的数据放进数据库&#xff0c;用广大程序员熟悉的sql语句查询百度的搜索结果应该是一个不错的主意。在这方面Google早已经跨出了一大步&#xff0c;利用Google Search API 把Google的搜索结果放进数据库是很容易办到得…

搜索引擎SEO外挂:一边搜索,一边看PageRank

搜索引擎SEO外挂&#xff1a;一边搜索&#xff0c;一边看PageRank 下载地址&#xff1a;多么乐站长工具 我原来曾写过一篇统计分析搜索引擎排名和Page Rank 关联分析 的文章。很多人引用&#xff0c;回复和我讨论了我的结论。有赞成的&#xff0c;有反对的&#xff0c;有鼓励的…

路由器架设虚拟服务器让外网访问到本地网站

摘自百度&#xff1a;http://jingyan.baidu.com/article/6f2f55a18e7998b5b93e6c8b.html 此文目的演示如何通过路由器设置&#xff0c;让外网可以访问到内网中的某一台电脑&#xff0c;也可以是电脑上架设的本地网站。 此方法只适合同网访问&#xff0c;如网通设置后&#xff…

真实版的“私人订制”网站服务,冯小刚葛同学,你们怎样看??

“私人定制”贺岁喜剧片马上就要上映开播了&#xff0c;我知道大家都想一睹为快。就不说太多了&#xff0c;只是最近发现一家网站&#xff0c;叫“歇会儿网”&#xff0c;百度排名第一&#xff0c;居然也再提供“私人定制”服务&#xff0c;那我就不淡定了啊&#xff0c;不淡定…

ASP.NET 2.0网站专案同时使C#与VB.NET之技巧(新书连载)

ASP.NET 2.0网站专案同时使C#与VB.NET之技巧&#xff08;新书连载&#xff09; 你知道专案ASP.NET 2.0网站要如何同时使用C#与VB.NET两种语言及多组件的技巧吗&#xff1f; 节录自【圣殿祭司的ASP.NET 2.0专家技术手册】新书 在以往VS.NET 2002及VS.NET 2003的Visual Studio工具…

私人订制,现实版的“圆梦网站”

再过一天&#xff0c;大家关注的年度贺岁喜剧片《私人定制》就要上映了&#xff0c;电影未出&#xff0c;其中的台词就开始流行开来。“成全别人&#xff0c;恶心自己”&#xff0c;专门为不同客户量身定制“圆梦方案”&#xff0c;无论客户的白日梦多奇葩、要求多严格&#xf…

网站计数器

网站计数器 View Code using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControl…

基于H.ui.Admin UI模板的网站管理后台

基于H.ui.Admin UI模板的网站管理后台 最近接手一个跨境电商平台开发&#xff0c;客户侧重电商网站UI设计&#xff0c;对管理后台要求不高&#xff0c;由我们决定选哪一款后台模板。找来找去&#xff0c;感觉还是H.ui靠谱一些&#xff0c;主要是这个模板清爽&#xff0c;不需要…

基于H.ui.Admin UI模板的网站管理后台

最近接手一个跨境电商平台开发&#xff0c;客户侧重电商网站UI设计&#xff0c;对管理后台要求不高&#xff0c;由我们决定选哪一款后台模板。找来找去&#xff0c;感觉还是H.ui靠谱一些&#xff0c;主要是这个模板清爽&#xff0c;不需要过多选择。其他的流行后台模板也看了&a…

网站优化

本来想直接发到javaeye上的&#xff0c;但是这里只能上传3个图片文件&#xff0c;所以还是选择了自己的网站。 本文以 http://www.eaful.com网站为例&#xff0c;为刚做完第一阶段的性能优化作一个总结&#xff0c;希望能给大家抛砖引玉。 我的这个网站刚上线不久&#xff0…

高性能网站建设之减少Http连接数

在对大访问量网站进行性能优化时&#xff0c;其中有一点是尽量减少http连接数&#xff0c;道理很明了&#xff0c;减少了单个PV的http连接数&#xff0c;肯定可以增加单台服务器的用户负载数。 减少Http连接数的具体方法是减少没必要的iframe使用&#xff0c;合并js文件&#…

高并发高流量网站架构

HeyJudy推荐 [2008-6-9] 出处&#xff1a;来自网上 作者&#xff1a;不详 Web2.0的兴起&#xff0c;掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念&#xff0c;细分了网站功能和用户群&#xff0c;不仅成功的造就了一大批新生的网站&#xff0c;也极大的方便…

网站项目管理-如何做好需求分析

随着技术的不断发展和用户对网站功能性的需求不断提高&#xff0c;如今网站项目的设计已经不能再仅仅简单地利用静态Html文件来实现&#xff0c;与前几年网站设计由一两名网页设计师自由的创作相比&#xff0c;网站项目的设计和开发越来越像一个软件工程&#xff0c;也越来越复…

大型网站系统架构分析

千万级的注册用户&#xff0c;千万级的帖子&#xff0c;nTB级的附件&#xff0c;还有巨大的日访问量&#xff0c;大型网站采用什么系统架构保证性能和稳定性&#xff1f; 首先讨论一下大型网站需要注意和考虑的问题。 数据库海量数据处理&#xff1a;负载量不大的情况下select、…

5种提高网站加载速度的方法

网站加载速度也是挺重要的&#xff0c;所以本篇介绍5种提高网站加载速度的方法&#xff0c;希望能够帮助到一些网站管理者。其中有的方法可能大家已经在使用&#xff0c;有些还没有听说过&#xff0c;现在就让我们一起来看看这些方法吧。 1.安装FireFox的FSlow插件 FSlow插件可…