大流量、高并发网站验证码解决方案

news/2024/5/20 11:31:40/文章来源:https://blog.csdn.net/weixin_30875157/article/details/95731537

最近不知道怎么的,总是喜欢研究一些大型站点的一些功能的实现,这两天看了下几个大型站的验证码的实现,觉得有点意思。

于是在.Net下也实现了一套类似的机制。我们先来看看这几个站的验证码功能的外在表现:

看QQ的,网站上有验证的地方都可以看的到,我这里提供个地址:http://pay.qq.com/login.shtml?url=http://pay.qq.com/

看看获取验证码的地址是:http://ptlogin2.qq.com/getimage,而当前操作的域是:pay.qq.com,可见它的这个实现跟我们普通

的.Net下的实现是不一样的。

大家看看这个网站就知道了:http://www.byf.com/member/member_login.aspx?url=http%3a%2f%2fwww.byf.com%2fmember%2findex.aspx

登录页面上的验证码跟当前的操作是在一个域下,至少可以肯定的是在同一个站点下。

验证码的地址是:http://www.byf.com/member/validate_img.aspx

这是外面可以看的出来的不一样的地方。我们再来看看外表看不到的地方,借助HttpWatch来看看QQ的:

GET /getimage HTTP/1.1

HTTP/1.1 200 OK
Server: tencent http server
Accept-Ranges: bytes
Pragma: No-cache
Content-Length: 2589
Set-Cookie: verifysession=4a8ea93680ebf2b7fbdab088121fb2c7fbb5f134443e2844fbb16da500e6c128773e6e9f25e25cf2; PATH=/; DOMAIN=qq.com;
Connection: close
Content-Type: image/jpeg

在请求验证码图片的同时服务端往客户端写了cookie verifysession登录提交的时候登录服务器会获取这个cookie。

再来看普通的验证码:

GET /member/validate_img.aspx HTTP/1.1

HTTP/1.1 200 OK
Date: Wed, 07 May 2008 02:26:07 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 1.1.4322
Cache-Control: private
Content-Type: image/Gif; charset=gb2312
Content-Length: 1953

什么都没有,就是在服务端把请求得到的验证码数据存到了Session中,等提交的时候直接获取验证码输入框中的值和Session中的值比较。

再来看看taobao的:http://member1.taobao.com/member/register.jhtml?_lang=default

验证码地址:http://checkcode.taobao.com/auction/checkcode?sessionID=230bc9bc5e73ac5c7f49e6804a1e1d17

他是反过来的,没有往客户端写cookie,而是验证码那边获取注册这边的session然后存到某个地方,提交的时候去那里验证。

我们还可以看到一个小hack在验证码的头部有一段文字:

Copyright (c) 2006 by Yahoo! China Incorporated. All Rights Reserved.  有点搞笑哦,哈哈!!!

 

再来看看163的:http://reg.163.com/reg0.shtml

它的做法跟taobao一样,没有写cookie,是验证那边获取应用这边的Session的。

再来看看baidu的 :

HTTP/1.1 200 OK
Date: Wed, 07 May 2008 02:47:05 GMT
Server: Apache
Set-Cookie: BDUSS=2pObG53NHlOZ1FlYm1iV29wZ1MtMHRDNmVFTkhXekNPN09OMWdGYUJTd3BwVWhJQlFBQUFBJCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkYIUgpGCFIS; path=/; domain=.baidu.com
Expires: Mon, 26 Jul 1997 00:00:00 GMT
Last-Modified: Wed, 07 May 2008 02:47:05 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 2038
Connection: close
Content-Type: image/png

跟QQ的是一样的模式,验证那边往应用这边写cookie。

还有xunlei 、google啊等。都是这样的做法。。。肯定有它的道理在的!!!

 

综上所述,这些大型站点都是把验证码服务器和应用服务器分开的。具体的做法有两种:

1.获取验证码的时候验证码服务器往客户端写验证cookies,提交的时候服务端获取这个cookie和提交上来的验证码,再去验证码服务器验证。

2.获取验证码的时候传个应用这边的session到验证码服务器那边,提交的时候服务端把应用这边的session和提交上来的验证码一起到验证码服务器验证。

 

分析就到这里了哦,既然清楚了原理,我们不妨来做个呵呵。

首先要解决的一个问题就是怎么样把客户端请求的验证码数据存储起来而且要两边都能够访问我是这样解决的:

using System;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace Flyimg.Verify.Server
{
    public class CodeSession
    {
        /// <summary>
        /// 存放验证数据链表
        /// </summary>
        private static LinkedList<CodeSession> VerifyCodeList = new LinkedList<CodeSession>();

        private string _SessionId;
        private string _VerifyCode;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="strSessionId"></param>
        /// <param name="strVerifyCode"></param>
        public CodeSession(string strSessionId, string strVerifyCode)
        {
            _SessionId = strSessionId;
            _VerifyCode = strVerifyCode;
        }

        /// <summary>
        /// 添加验证码数据
        /// </summary>
        /// <param name="strSessionId"></param>
        /// <param name="strVerifyCode"></param>
        /// <returns></returns>
        public static string Add(string strSessionId, string strVerifyCode)
        {
            bool bResult = false;

            LinkedListNode<CodeSession> CurrentPlay = new LinkedListNode<CodeSession>(new CodeSession(strSessionId, strVerifyCode));

            try
            {
                //保持链表长度限制客户端连接数
                if (VerifyCodeList.Count < int.Parse(ConfigurationManager.AppSettings["Capacity"].ToString()))
                {
                    VerifyCodeList.AddFirst(CurrentPlay);
                }
                else
                {
                    VerifyCodeList.RemoveLast();
                    VerifyCodeList.AddFirst(CurrentPlay);
                }
                bResult = true;
            }
            catch
            {
                bResult = false;
            }

            return bResult.ToString();
        }

        /// <summary>
        /// 删除验证码数据
        /// </summary>
        /// <param name="strSessionId"></param>
        /// <param name="strVerifyCode"></param>
        public static void Remove(string strSessionId, string strVerifyCode)
        {
            CodeSession codesession = new CodeSession(strSessionId, strVerifyCode);
            VerifyCodeList.Remove(codesession);
        }

        /// <summary>
        /// 验证验证码数据
        /// </summary>
        /// <param name="strSessionId"></param>
        /// <param name="strVerifyCode"></param>
        /// <returns></returns>
        public static string Verify(string strSessionId, string strVerifyCode)
        {
            int iResult = 0;

            foreach (CodeSession codesession in VerifyCodeList)
            {
                if (codesession._SessionId == strSessionId && codesession._VerifyCode == strVerifyCode)
                {
                    iResult = 1;
                    Remove(strSessionId, strVerifyCode);
                    break;
                }
            }

            return iResult.ToString();
        }

        /// <summary>
        /// 清除验证数据
        /// </summary>
        public static void Clear()
        {
            VerifyCodeList.Clear();
        }
    }
}

有两个主要的方法,ADD(添加)和Verify(验证)还有个问题就是两边的应用能快速的访问这个区域。我采用的是socket

没有采用webservice的原因的这样既可以分布式的部署而且速度够快。在验证码web端配置文件中配置好验证码Server的IP地址就可以了。

在验证码web端获取到验证码数据后:

 

try
{
    //添加验证到验证服务器
    Common.AddToVerifyServer(Session.SessionID, this.strVerifyCode);
}
catch (Exception ex)
{
    Logger.Add(ex.Message);
}

//写cookie
General.SetCookie("VerifyKey", Session.SessionID, "flyimg.cn");

这样验证码web端的任务就完成了,验证码Server中就有数据显示了:

 

提交的时候:

protected override void OnPostting(Object sender, DataEventArgs e)
{
    if (string.IsNullOrEmpty(Request.Form["UserAccounts"]))
    {
    strError1 = "请输入用户名!";
    }
    else if (string.IsNullOrEmpty(Request.Form["UserPwd"]))
    {
    strError2 = "请输入密  码!";
    }
    else if (string.IsNullOrEmpty(Request.Form["VerifyCode"]))
    {
    strError3 = "请输入验证玛!";
    }
    else
    {
    bool bResult = false;

    try
        {           
        //到验证服务器验证
        bResult = Common.Verify(ToolKit.Common.General.GetCookie("VerifyKey"), Request.Form["VerifyCode"]);
        }
        catch (Exception ex)
        {
        Logger.Add(ex);
        }

    if (bResult)
    {
        if (Request.Form["UserAccounts"] == "admin" && Request.Form["UserPwd"] == "123123")
        {
        General.SetCookie("user_id", "admin");

        string strReturnUrl = Request.QueryString["url"];

        if (!string.IsNullOrEmpty(strReturnUrl))
        {
            Response.Redirect(HttpUtility.UrlDecode(Request.QueryString["url"]));
        }
        else
        {
            Response.Redirect("/upload");
        }
        }
        else
        {
        strError2 = "用户名或者密码错误!";
        }
    }
    else
    {
        strError3 = "验证玛错误!";
    }
    }
}

这样就完成了验证:

 

好了。功能就是这样实现的。这是用第一种方式实现的,稍微修改下就可以改成第二种方式了。

下载地址:http://www.svnhost.cn/Download/Detail-108.shtml

Server端用到了一个开源的Socket类库Midapex.Net:

http://www.cnblogs.com/dyj057/archive/2008/04/18/1160392.html

谢谢,欢迎大家交流!enjoy...

转载于:https://www.cnblogs.com/voswin/articles/1273916.html

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

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

相关文章

prerender html5,HTML5 VUE单页应用 SEO 优化之 预渲染(prerender-spa-plugin)

前言&#xff1a;当前 SPA 架构流行的趋势如日中天&#xff0c;前后端分离的业务模式已经成为互联网开发的主流方式&#xff0c;但是 单页面 应用始终存在一个痛点&#xff0c;那就是 SEO&#xff0c;对于那些需要推广&#xff0c;希望能在百度搜索时排名靠前的网站而言&#x…

织梦dedecms网站首页标题被恶意非法篡改乱码解决办法!!

dedecms被篡改问题让很多人头疼&#xff0c;还有的网站中毒了会跳转到BC网站&#xff0c;赌博、彩票网站上去了&#xff0c;网站在百度搜索出现&#xff1a;百度网址安全中心提醒您&#xff1a;该站点可能受到黑客攻击&#xff0c;部分页面已被非法篡… 近期&#xff0c;我的诸…

酷站欣赏:33个优秀的淡黄色风格网站设计作品

选择颜色是网页设计的一个重要方面。Web 和图形设计人员会仔细挑选一种颜色&#xff0c;以吸引读者的注意力。黄色作为一种明亮的和令人兴奋的颜色&#xff0c;比较能够抓住读者的注意力。在这篇文章中&#xff0c;我挑选了33个优秀的黄色风格网站&#xff0c;希望能够带给你灵…

微软StockTrader 2.03 学习笔记(3)--配置网站和配置服务在StockTrader中的使用示例

有关配置网站和配置服务在StockTrader 3.0中使用&#xff0c;微软在其提供的配置说明文档中已经做了很详细的说明。基本上是一步一步傻瓜式的阐述的&#xff0c;在这里也就简单的在文档中摘选一下重点简单的做一下记录&#xff0c;理一下整个配置使用过程。 首先先简单介绍一下…

评估您的网站/博客的价值

http://www.stimator.com/ 这个网站可以对你的网站进行价值评估&#xff0c;可以试一下 转载于:https://www.cnblogs.com/andylaufzf/archive/2009/03/27/1423379.html

[转载]杨建:网站加速--动态应用篇 (上)

原文地址&#xff1a;杨建&#xff1a;网站加速--动态应用篇 (上)作者&#xff1a;iyangjian2005997--提升性能的同时为你节约10倍以上成本From: http://blog.sina.com.cn/iyangjian一, 引子二&#xff0c;总体结构图三&#xff0c;系统结构综述四&#xff0c;环境配置以及底层…

ASP.NET的SEO: 服务器控件背后——SEO友好的Html和JavaScript

本系列目录 假设你需要从一个页面转向其他页面&#xff0c;下面有很多种方式&#xff0c;你是如何选择的呢&#xff1f;你能清晰的说明理由么&#xff1f;<%--链接的表现形式--%><asp:HyperLink ID"HyperLink1"runat"server"NavigateUrl"~/…

Web开发者必须收藏的十大网站【转】

http://article.yeeyan.org/view/158539/110702 对我们这些Web开发者来说&#xff0c;不计其数的网站&#xff0c;其中有些对我们来说是相当有用的工具。在本文中&#xff0c;我汇编了10个顶有用的网站&#xff0c;可以说每个开发者都应当将这些网站存为自己的书签。 Mysql For…

分享12个非常好的免费矢量资源网站

在工作中&#xff0c;Web设计师经常需要到网上查找一些免费资源以更快更好的完成设计任务。这些资源都是到用时方恨少啊&#xff0c;所以今天本文与大家分享12个非常好的免费矢量资源网站&#xff0c;大家可收藏起来备用 :) QVectors Vecteezy Dezignus TutorialBlog Vector Po…

最新30佳精美 PSD 网站模板免费下载

您可能还喜欢 分享45款高质量的免费(X)HTML/CSS模板最新30佳精美 PSD 网站模板免费下载寻找网页设计灵感的27个最佳网站推荐60佳灵感来自大自然的网页设计作品欣赏分享100佳精美的作品集网站设计案例曾与大家分享过45款高质量的免费(X)HTML/CSS模板&#xff0c;今天&#xff0c…

向网页设计师推荐15个很棒的网站

网络上各种各样的社区网站数不胜数&#xff0c;但专注于创意设计的很少。今天这篇文章收集了15个非常好的专注于设计的网站推荐给设计师们&#xff0c;不管是学习先进的设计理念&#xff0c;还是寻找免费资源与工具&#xff0c;这些网站都是很不错的去处&#xff0c;记得推荐和…

网站使用微软雅黑需要版权吗

转自 :http://rpsh.net/archives/font-licensing-for-the-web/ 网站能使用微软雅黑字体吗?是否会构成侵权&#xff1f;微软雅黑有版本吗? 最近做网站,听说雅黑有版权不能用,但是使用了黑体 网站又贼丑无比,惨不忍睹 资深架构师搜了个这个文章, 分享给大家 结论: 在 CSS 中使…

网站压力测试工具-Webbench源码笔记

Ubuntu 下安装使用 1、安装依赖包CTAGS sudo apt-get install ctage 2、下载及安装 Webbench http://home.tiscali.cz/~cz210552/webbench.html 解压&#xff1a; tar -zxvf webbench-1.5.tar.gz 切换到解压后的目录&#xff1a; cd webbench-1.5 编译&#xff1a; make 安装&a…

(转)网站优化:测试网站速度的8款免费工具推荐

网站的加载速度是决定网站成败的重要因素&#xff0c;值得站长特别关注。原因很简单&#xff0c;没有人愿意为了打开一个网页而等老半天&#xff0c;换句话说&#xff0c;如果你的网站打开速度 很慢&#xff0c;将流失大量的访客&#xff0c;甚至出现多米诺效应的不良影响&…

精品欣赏:30个养眼的精美自然风光的网站设计《上篇》

设计师使用精致的充满吸引力的宽屏图片作为背景&#xff0c;给来网站带来一种别样的特色。现在网络上有成千上万的图片可供选择&#xff0c;根据您的设​​计和需求&#xff0c;你可以把普通图像变成一个功能强大的工具&#xff0c;以吸引你的客户。 让我们来仔细看看这些自然景…

thinkphp5.1--快速生成网站首页

打开网站首页&#xff0c;右键选择另存为 把另存的网站首页拖放到phpstorm,复制代码&#xff0c;用JS/HTML格式化工具转换代码格式 将格式化后的网站首页做为项目首页 app\index\controller\Index.php namespace app\index\controller;use think\Controller;class Index ext…

Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:

Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:常见问题&#xff1a;HTTP 错误 500.0 - Internal Server Error无法显示页面&#xff0c;因为发生内部服务器错误。模块 IsapiModule 通知 ExecuteRequestHandler 处理程序 AboMapperCustom-20607 错误代码 0x…

大型网站系统架构的演化(转)

前言 一个成熟的大型网站&#xff08;如淘宝、京东等&#xff09;的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性&#xff0c;它总是随着用户量的增加&#xff0c;业务功能的扩展逐渐演变完善的&#xff0c;在这个过程中&#xff0c;开发模式、技术架构、设计…

5首页加载慢_优秀网站制作注意事项 吸人眼球5大妙招

随着建站行业和建站技术的不断发展和深入&#xff0c;在网站制作过程中&#xff0c;如何抓住浏览者的眼球&#xff0c;吸引他们的注意力成为了网页设计师们考虑的核心问题&#xff0c;一个优秀专业的网站&#xff0c;在制作过程中都有哪些注意事项&#xff0c;今天专业的建站公…

生成结合图表_闭着眼也能做出高颜值的Excel图表,你只需这3个网站

今天的推文比较简单&#xff0c;为大家分享3个可以在线制作图表的宝藏网站。欢迎大家在看完之后&#xff0c;在留言区选出你心中觉得最实用的网站&#xff0c;或者跟大家分享你觉得更好用的网站。01. 图表秀全能又方便的在线图表制作神器https://www.tubiaoxiu.com/一款在线图表…