摸不到的颜色是否叫彩虹,输不对的密码是否叫做验证码

简介:         摸不到的颜色是否叫彩虹,输不对的密码是否叫做验证码`(*∩_∩*)′,我想小伙伴都有这样的经历,登陆QQ的时候,总是输不对密码,这个时候,多次进行登录,就会出现请输入验证码的选项,双十一那天狂买的小伙伴是不是对输入验证码有着不一样...
        摸不到的颜色是否叫彩虹,输不对的密码是否叫做验证码`(*∩_∩*)′,我想小伙伴都有这样的经历,登陆QQ的时候,总是输不对密码,这个时候,多次进行登录,就会出现请输入验证码的选项,双十一那天狂买的小伙伴是不是对输入验证码有着不一样的感触呢,以前觉得验证码真是个麻烦鬼,每次登陆还得输入验证码,一个不小心,一个眼拙,哎呦,没有输入正确,又是一阵子大眼瞪小眼,这个时候,突然想起做软件的不都是本着为人民服务的那颗滚烫的心么?怎么总让用户输入验证码,这不是给用户带来麻烦么?我想应该没有哪个用户会愿意输入验证码,特别是对于视力不是太好的小伙伴,有时候很坑姐,明明记得是输对了,但是最后显示的是验证码输入错误,这是否跟咱们的软件为人民服务相违背呢呢?小编感触最深的就是春节回家买火车票的时候,小编买到火车票的之后,由于验证码输入错误或者提交失败一直到提交成功的时候,显示的却是票不足,购票不成功,这多伤小编的心啊。为此,小编百思不得其解。直到那天,我懂了你……

        我恍如隔世,忽然从梦中惊醒,是小编想的太少,小编总是为自己的方便着想,没有想到程序员的难处,当然程序员是想让大家方便,但是没有事事那么完美无瑕,所以为了大家方便的同时,程序员遇到更大的一个难题就是安全,而验证码是一种区分用户是计算机和人的全自动程序,可以防止,恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),程序员利用比较简易的方式实现了这个功能。到现在也许有很多的用户反映到登陆输入验证码太麻烦了,所以看到有一些网站是第一次登陆不需要输入验证码,然后你输入用户名或者密码不对的时候,就是登陆不成功的时候,验证码才出来,毕竟那是电脑,没有人脑那么灵活,所以程序员就让给电脑一个灵感,但登陆不成功的时候,为了安全,就给出验证码,这就很好的有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试了,这就实现了安全。我们看一下腾讯QQ是怎么做的:

              

             如果多次登陆不成功,就会出现如下窗口提示:

             

        我们的验证码出来了,这就证明了我们的验证码确实能有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试进行破解。所以当我们要输入验证码的时候,我们要想到这些,就不必心烦了,程序员想的不是不周到,是想让大家的数据更加安全,也为我们的秘密泄露加上了更好的防护。转念又想,至于春运买火车票的,小编总是抱怨说输入验证码导致自己没买到票,换句话说,要是不输入验证码,那更买不到了,至于人家的铁道部网站做的怎么样,我们先不讨论。相信很多人跟小编一样,有过这样的经历,其实特别美好,如果没有这样的疑惑,我们就没有进步的动力,就难以跟上时代的步伐。今天,小编就带领大家来揭开验证码的神奇面纱,看看她的背后是如何工作?首先我们做一个登陆页面,来看看验证码的背后是怎么工作的:

          

<span style="font-size:18px;"><%@ Page Language="C#" AutoEventWireup="true" CodeFile="login.aspx.cs" Inherits="admin_login" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>后台登陆-牛腩新闻发布系统</title>
    <link href="../css/login.css" rel="stylesheet" type="text/css" />
    <script language="javascript" type="text/javascript">
        function changeCode() {
            var imgNode = document.getElementById("vimg");
            imgNode.src = "../handler/WaterMark.ashx?t=" + (new Date()).valueOf();  // 这里加个时间的参数是为了防止浏览器缓存的问题   
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div id="loginfrm" class="round1">
      <h3>后台登陆-牛腩新闻发布系统</h3>
      <div id="login">
        <img src="../images/niunanlogo.jpg" alt="LOGO" class="login_logo" />
        <p>用户名:<asp:TextBox ID="txtName" runat="server" CssClass="textbox"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtName" ErrorMessage="姓名不能为空">*123</asp:RequiredFieldValidator>
        </p>                                
        <p>密 码:<asp:TextBox ID="txtPassword" runat="server" TextMode="Password"  CssClass="textbox"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="请输入密码!" Text="*" ControlToValidate="txtPassword"></asp:RequiredFieldValidator>
        </p>
        <p>
        验证码:<img src="../handler/WaterMark.ashx" id="vimg" alt="" onclick="changeCode()"/>
                    <asp:TextBox ID="txtCode" runat="server" CssClass="textcode"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ErrorMessage="请输入验证码!" Text="*" ControlToValidate="txtCode"></asp:RequiredFieldValidator>
        </p>
          <asp:ValidationSummary ID="ValidationSummary1" runat="server" />
          <p>
              <asp:Button ID="btnLogin" runat="server" Text="登陆" onclick="btnLogin_Click" /></p>  
      </div>
      <div id="footer">版权所有 &copy; <a href="http://niunan.javaeye.com" target="_blank">牛腩</a>&<a href="http://www.tg029.com"
            target="_blank">众志网 </a></div>
    </div>
    </form>
</body>
</html></span>
             Login.aspx.cs的代码:

             

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BLL;
using System.Web.Security;

public partial class admin_login : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    // 登陆按钮
    protected void btnLogin_Click(object sender, EventArgs e)
    {
        // 判断验证码是否输入正确
        string code = txtCode.Text.Trim().ToUpper();
        string rightCode = Session["Code"].ToString();
        if (code != rightCode)
        {
            Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('验证码输入错误!');</script>");
            return;
        }

        string name = txtName.Text.Trim();
        string pwd = txtPassword.Text.Trim();

        // 把密码转为MD5码的形式
        pwd = FormsAuthentication.HashPasswordForStoringInConfigFile(pwd, "MD5");

        bool b = LoginManager.Login(name, pwd);
        if (b)
        {
            //  登陆成功
            Session["admin"] = name;
            Response.Redirect("categorymanager.aspx");
        }
        else
        {
            Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('登陆失败,用户名或者密码错误!');</script>");
        }

    }
}
</span>
              css排版中的代码

             

<span style="font-size:18px;">/* 
*登陆验证码测试 
*/  
  
     *  
{  
    margin :0;  
    padding :0;  
    }  
body   
{  
    font-size :14px;  
}  
  
  
#loginfrm #login p  
{  
    padding-bottom :10px;  
    }  
.textbox  
{  
    width :150px;  
    }  
.txtCode  
{  
    width :73px;  
    }  </span>
        业务逻辑层:

        

<span style="font-size:18px;">/*
 *创建人:丁国华
 *创建时间:2014年11月19日 14:36:59
 *说明:登陆的业务逻辑类
 *版权所有:丁国华&www.tg029.com(众志网)
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace BLL
{
    public class LoginManager
    {
        #region 用户登陆是否成功
        /// <summary>
        /// 用户登陆是否成功
        /// </summary>
        /// <param name="name">用户名</param>
        /// <param name="pwd">密码</param>
        /// <returns></returns>
        public static bool Login(string name, string pwd)
        {
            bool flag = false;
           if ("niunan" == name && "E10ADC3949BA59ABBE56E057F20F883E" == pwd)
            {
                flag = true;
            }
            return flag;

        }
        #endregion
    }
    
}
</span>
              最后我们来看看验证码这块的内容:

              

<span style="font-size:18px;"><%@ WebHandler Language="C#" Class="WaterMark" %>
/*
 * 创建人:丁国华
 * 创建时间:2014年11月22日 21:54:52
 * 版权所有:丁国华&众志网(www.tg029.com)
 */
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Web.SessionState;  

public class WaterMark : IHttpHandler, IRequiresSessionState  // 要使用session必须实现该接口,记得要导入System.Web.SessionState命名空间
{

    public void ProcessRequest(HttpContext context)
    {
        string checkCode = GenCode(5);  // 产生5位随机字符
        context.Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证
        System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);
        Graphics g = Graphics.FromImage(image);
        try
        {
            //生成随机生成器
            Random random = new Random();

            //清空图片背景色
            g.Clear(Color.White);

            // 画图片的背景噪音线
            int i;
            for (i = 0; i < 25; i++)
            {
                int x1 = random.Next(image.Width);
                int x2 = random.Next(image.Width);
                int y1 = random.Next(image.Height);
                int y2 = random.Next(image.Height);
                g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
            }

            Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));
            System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);
            g.DrawString(checkCode, font, brush, 2, 2);

            //画图片的前景噪音点
            g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            context.Response.ClearContent();
            context.Response.ContentType = "image/Gif";
            context.Response.BinaryWrite(ms.ToArray());
        }
        finally
        {
            g.Dispose();
            image.Dispose();
        }
    }

    /// <summary>
    /// 产生随机字符串
    /// </summary>
    /// <param name="num">随机出几个字符</param>
    /// <returns>随机出的字符串</returns>
    private string GenCode(int num)
    {
        string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        char[] chastr = str.ToCharArray();
        string code = "";
        Random rd = new Random();
        int i;
        for (i = 0; i < num; i++)
        {
            //code += source[rd.Next(0, source.Length)];
            code += str.Substring(rd.Next(0, str.Length), 1);
        }
        return code;

    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}</span>
          最后,我们来看一下我们的界面效果:

          

         这个登录验证码的窗体已经完成了,我们看的出来验证码其实就是通过一张图片,来区分用户和计算机,就能达到很好的防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试;所以为了咱们的网络安全,这个验证码确实发挥了很大的作用。牛腩新闻发布系统,未完,待续......

              

            

目录
相关文章
|
数据采集 前端开发 开发者
滑动拼图验证码的原理和破解方法~
滑动拼图验证码的原理和破解方法~
2159 0
滑动拼图验证码的原理和破解方法~
|
18天前
|
前端开发 数据安全/隐私保护
【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示
【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示
|
8月前
|
安全 开发工具 Python
滑动拼图验证,摆脱烦人的验证码输入
你最近是否遇到过令人头疼的验证码?为何不让滑动拼图成为你的新选择呢?通过完成一个有趣的滑动拼图来验证你的身份,既能锻炼大脑,又能保护你的隐私。
滑动拼图验证,摆脱烦人的验证码输入
|
开发工具
文字点选验证码【建议收藏】
哎!这验证码形态多变,怎么干扰这么多?这文字数量怎么一会点4个、一会点6个,这到底是怎么弄的。这些问题一下就给我整懵了,终于让我发现通过 KgCaptcha 可以成功实现,接下来开始分享它的设置使用。
文字点选验证码【建议收藏】
|
前端开发 开发工具
【记录】滑动拼图验证码
在一次项目中,为了使验证码更加贴合自身风格。我找到了一款验证码产品可以通过设置图片素材,来修改验证码的底图,使其更加契合。下面就是我对该产品的一些记录。
【记录】滑动拼图验证码
|
监控 前端开发 开发工具
KgCaptcha 文字点选验证码数据监控
在信息时代, 对信息处理和利用能力的强弱成为决定企业兴衰成败的关键。一个成熟的数据监控展示平台是我们需要考虑的问题。 下面小编将用KgCaptcha,带领大家使用一个漂亮的数据监控展示平台!
KgCaptcha 文字点选验证码数据监控
|
前端开发
图形验证码
图形验证码,防止恶意攻击者采用恶意工具批量注册账号或大量频繁调用某些请求,给服务器造成压力,占用大量的系统资源。本文介绍如何实现图形验证码?
图形验证码
|
安全 C# 数据安全/隐私保护
C#图形验证码
图形验证码在生活中得到了广泛的应用,在很多登录页面都可以看到验证码的身影。之所以如此,是因为图形验证码可以隔绝不法分子的密码爆破,对我们的登录过程起到了至关重要的保护作用。
C#图形验证码
|
JavaScript API 数据安全/隐私保护
数美滑块验证码分析
本文以官网的滑块验证码为例,分析验证过程,完成模拟验证。
1273 0
数美滑块验证码分析
|
数据采集 小程序 Python
论如何破解腾讯滑块验证码
论如何破解腾讯滑块验证码
1925 0