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

news/2024/5/11 18:10:00/文章来源:https://blog.csdn.net/weixin_30273931/article/details/98855158

转载自:http://www.cnblogs.com/studyzy/archive/2008/05/08/1187626.html

我在上一篇文章中已经讲解了一般网站的登录原来和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即可。

【出自博客园深蓝居,转载请注明作者出处】

转载于:https://www.cnblogs.com/9422e/archive/2009/06/25/1510809.html

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

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

相关文章

给你一份网站升级攻略,让你的网站焕然一新

关键词&#xff1a;网站建设&#xff0c;企业官网 虽然已有官网&#xff0c;但是公司业务繁忙没时间去维护&#xff1f;久而久之网站就出现了很多问题&#xff0c;老板不看还好&#xff0c;一看不得了&#xff0c;糟糕的界面&#xff0c;过时的内容&#xff0c;还怎么好意思拿去…

大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什么…

织梦网站修改栏目模型后,文章不显示的解决办法

在一次织梦网站改版的过程中&#xff0c;有一个栏目需要改成一个新建的内容模型&#xff0c;这时候就会遇到一个问题&#xff0c;栏目的文章会突然“消失不见”&#xff0c;这是因为更改之后栏目文章会因为数据表没有更改所导致的。找到了一个方法&#xff0c;大家一起来看看吧…

学习英语的好网站 (要时刻保持对英语的热情与激情,呵呵)

这些网站是从新东方尹圆圆老师的博客上找来的&#xff0c;希望大家好好利用&#xff1a; 1. http://www.texun.cn/addrso/index.htm 特训网&#xff1a;English Learning Websites 2. http://broadcast-live.com/ Live Radio and TV from Around the World 3. http://www.nxeng…

CDN内容分发服务推荐-加速你的网站

CDN内容分发服务推荐-加速你的网站 导语 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输的更快、更稳定。 CDN服务公司推荐 免备案&#xff08;免费&#…

怎么在php上加栏目,wordpress网站如何添加栏目

wordpress自定义栏目设置方法用wordpress程序建站时&#xff0c;往往很难去设置产品的大小、重量、单价等参数&#xff0c;好在wordpress有一个自定义栏目功能。我们可以通过wordpress自定义栏目给产品增加参数属性。设置方法首先是开启自定义栏目模块&#xff0c;进入后台后&a…

十大网站管理工具

引用:http://www.williamlong.info/archives/1278.html 当网站发展到一定的规模&#xff0c;站长就应该开始考虑要为网站托管服务器。通常情况下服务器会被放到电信或网通的机房&#xff0c;网站管理员通过远程来管理服务器。在网站服务器进行托管时&#xff0c;需要安装一些常…

提高网站加载速度的3项黄金守则

如何优化网页加载速度是每个前端开发工程师需要了解的&#xff0c;也是前端开发工程师需要具备的基本条件。 优化网站加载速度的原理主要是减少网站文件的大小&#xff0c;减少HTTP请求数。网站文件越小&#xff0c;浏览器加载页面会比较轻松&#xff0c;打开页面的速度也会提升…

网站架构设计

centos7.5网站架构设计 如图&#xff1a; 大致流程&#xff1a; 1、用户访问网站通过防火墙&#xff0c;连接三层交换机到达web服务器 2、负载均衡服务器根据各个服务器的负载合理调节资源 3、web服务器先去缓存服务器找相应的资源&#xff0c;若没有&#xff0c;再去数据库等…

网站服务协议HTTP原理

一、网站页面访问流程 1)客户端 浏览器输入网址信息点击回车-----------------------ENTER 2) 客户端 完成域名的解析过程 ----------------------------------DNS 3) 客户端 直接访问相应网站服务器----------------------------开始建立TCP三次握手过程 4) 客户端 访问网站服…

Azure Traffic Manager 现可与 Azure 网站集成!

&#xfeff;&#xfeff;编辑人员注释&#xff1a;本文章由 WindowsAzure 网站团队高级专家级工程师 Jim Cheshire撰写。 AzureTraffic Manager 已经推出有一段时间&#xff0c;这是一种跨多个区域管理网站的有效方式。您可以将访问者路由至可以提供最佳性能的区域&#xff0c…

如何设计一个基于Node.js和Express的网站架构?

前言 今年七月份&#xff0c;我和几个小伙伴们合伙建立了一个开发团队。业务开展如火如荼的同时&#xff0c;团队宣传就提上了日程&#xff0c;所以迫切需要搭建公司网站出来。确定目标后我们就开始考虑如果构建一个企业网站。先是进行业内调查&#xff0c;看了看别人家的网站是…

.NET技术+25台服务器怎样支撑世界第54大网站

英文原文&#xff1a;StackOverflow Update: 560M Pageviews A Month, 25 Servers, And Its All About Performance StackOverflow 是一个 IT 技术问答网站&#xff0c;用户可以在网站上提交和回答问题。当下的 StackOverflow 已拥有 400 万个用户&#xff0c;4000 万个回答&am…

用python画出简单笑脸画法_自从有了这个网站,用函数公式画出狮子王就是这么简单...

▲▲▲点击查看▲▲▲可能对大多数人来说&#xff0c;数学一直是自己学习生涯中的弱项&#xff0c;毕竟「人被逼急了什么都做得出来&#xff0c;唯独数学不会&#xff0c;不会就是不会」&#xff0c;特别是在函数的学习中&#xff0c;因为涉及到了「变量」这一概念&#xff0c;…

北京奥运网站的图片切换轮转效果

预览 下载 转载于:https://www.cnblogs.com/CB/archive/2008/05/21/1204378.html

网站服务器80端口怎么开放,开放80端口配置

开放80端口配置 内容精选换一换本节操作指导用户关闭Windows操作系统云服务器的防火墙&#xff0c;以及防火墙添加例外端口的操作。本节操作以2012操作系统云服务器为例。防火墙开启和设置安全组是对云服务器的双重保护&#xff0c;如果选择关闭防火墙&#xff0c;建议安全组谨…

大型网站架构系列:分布式消息队列(一)

以下是消息队列以下的大纲&#xff0c;本文主要介绍消息队列概述&#xff0c;消息队列应用场景和消息中间件示例&#xff08;电商&#xff0c;日志系统&#xff09;。 本次分享大纲 消息队列概述消息队列应用场景消息中间件示例JMS消息服务&#xff08;见第二篇&#xff1a;大型…

java 网页开发工具_制作网站常用的网页开发工具有哪些

我们要想制作好网站其实是离不开网站代码的HTML&#xff0c;我们在制作网站的时候是需要用到一些常用的网页开发工具&#xff0c;才能完成我们网页的编写&#xff0c;那么&#xff0c;你知道制作网站常用的网页开发工具有哪些吗?不清楚的话&#xff0c;下面小编和你说一说吧!一…

利用 squid 反向代理提高网站性能

本文在介绍 squid 反向代理的工作原理的基础上&#xff0c;指出反向代理技术在提高网站访问速度&#xff0c;增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下&#xff0c;利用 DNS 轮询和 Squid 反向代理技术&#xff0c;实现了网站的负载均衡&#xff0c;从而…

l2的最优回归_「回归模型」5种五种回归模型及其优缺点 - seo实验室

回归模型参考资料&#xff1a;https://mp.weixin.qq.com/s/mr83EK24S94b_UUlecyqlA对异常值非常敏感如果指数选择不当&#xff0c;容易过拟合。岭回归标准线性或多项式回归在特征变量之间存在很高的共线性(high collinearity&#xff0c;比如变量x1与x2之间存在函数关系)的情况…