精华内容
下载资源
问答
  • 看验证码

    2007-09-04 10:09:42
    你遇到过么~
  • 验证码

    2017-10-08 16:48:03
    我们来一下验证码的生命周期: 1. 客户端请求验证码 2. 服务端渲染验证码: - 渲染一张包含随机字符串的图片 - 随机字符串写入session - 读取图片并返回响应 3. 客户端提交: - 显示响应(即验证码图片...

    验证码的生命周期

    在web应用中,验证码常用于登录注册。验证码本质就是一张图片。
    我们来看一下验证码的生命周期:
    1. 客户端请求验证码
    2. 服务端渲染验证码:
    - 渲染一张包含随机字符串的图片
    - 随机字符串写入session
    - 读取图片并返回响应
    3. 客户端提交:
    - 显示响应(即验证码图片)
    - 获取用户输入字符串
    - 提交用户输入
    4. 服务端验证:
    - 取出session中保存的随机字符串与用户提交的字符串进行对比
    - 字符串信息一致,进行下一步处理
    - 字符串信息不一致,返回错误信息

    下面我们在Django中实践以上流程。

    验证码实践

    1. 新建一个名为ValidCode的Django项目,并创建应用app01,配置路由如下:

      from django.conf.urls import url
      from app01 import views
      
      urlpatterns = [
          url(r'^test/$', views.test),
          url(r'^valid_code/$', views.valid_code),
      ]
    2. 定义test视图函数,当客户端访问http://127.0.0.1:8000/test/时,返回test.html页面;当客户端提交提交数据时,取出session中保存的验证码与用户提交的字符串进行对比:

      from django.shortcuts import render, HttpResponse, redirect
      
      
      def test(request):
          if request.method == 'GET':
              return render(request, 'test.html')
      
          code1 = request.session['valid_code']
          code2 = request.POST.get('valid_code')
          if code1 == code2:
              return HttpResponse('OK')
          else:
              return redirect('/test/')
      <form action="" method="post">
          {% csrf_token %}
          <p>
              <label for="valid_code">验证码:</label>
          </p>
          <p>
              <input type="text" id="valid_code" name="valid_code">
              <img src="/valid_code/" alt="validPic" width="150" height="30"><a href="#" class="refresh">刷新</a>
          </p>
          <p>
              <button type="submit">验证</button>
          </p>
      </form>
      
      <script>
          var refresh = document.getElementsByClassName('refresh')[0];
          var validPic = document.getElementsByTagName('img')[0];
          refresh.onclick = function () {
              validPic.src += "?"; //利用img标签的特性,刷新验证码
          }
      </script>

      说明:

      • test.html中<img>标签的属性:src="/valid_code/",表示向http://127.0.0.1:8000/valid_code/发起get 请求,以获取图片
      • 点击<a href="#" class="refresh">刷新</a>标签,执行validPic.src += "?",以重新获取图片(刷新验证码)
    3. 定义valid_code视图函数,将验证码写入session中,并返回验证码:

      def valid_code(request):
          with open('bilibili.jpg', 'rb')as f:
              res = f.read()
      
          valid_code = 'bilibili'
          request.session["valid_code"] = valid_code
      
          return HttpResponse(res)

      说明:验证码本质就是一张图片,这里就先返回一张图片吧。。。

    4. 浏览器访问http://127.0.0.1:8000/test/

      这里写图片描述

      说明:显示以上页面其实有两次get请求:

      • /test/发起get请求,服务端返回test.html页面;
      • test.html页面中<img>标签的属性:src="/valid_code/",对/valid_code/发起get请求,服务端返回一张图片
    5. 提交验证码:输入’bilibili’,显示‘OK’,否则重定向到当前页面,略。

    生成随机验证码

    这样似乎就成了,不过实际应用中的验证码都是随机生成的。而上面的验证码不论怎么刷新,也不会变,服务端始终返回一张静态图片。那么有没有办法呢?有,用pillow画图模块,每次请求过来,服务端实时渲染一张包含随机字符串的图片。下面我们改写valid_code函数:

    def valid_code(request):
        from PIL import Image, ImageDraw, ImageFont
        from io import BytesIO  # 内存管理,优化速度 
        import random
    
        img = Image.new(mode='RGB', size=(120, 30),
                        color=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
        # 创建图像对象(模式,大小,颜色)
    
        draw = ImageDraw.Draw(img, mode='RGB')  # 创建画笔(图像对象,模式)
        font = ImageFont.truetype("app01/static/fonts/kumo.ttf", 28)  # 读取字体(字体路径,字体大小)
    
        code_list = []
        for i in range(5):
            char = random.choice([chr(random.randint(65, 90)), str(random.randint(1, 9))])
            code_list.append(char)
            draw.text([i * 24, 0], char, (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)),
                      font=font)
            # 通过画笔的text方法,为图像绘制字符串(位置,文本,颜色,字体)
            # [i * 24, 0] 字体坐标,i*24设置水平偏移,让每个字符分开显示
    
        f = BytesIO()  # 拿到一个内存文件句柄f
        img.save(f, "png")  # 保存图像对象到f
    
        valid_code = ''.join(code_list)  
        request.session["valid_code"] = valid_code  # 验证码写入session
    
        return HttpResponse(f.getvalue())  # `getvalue()`方法拿到内存文件句柄的内容

    说明:

    • 使用前需要先安装pillow模块:pip install pillow
    • 绘制的图像可以保存的磁盘上,但是速度慢,这里使用内存管理from io import BytesIO,优化速度
    • f = BytesIO() 拿到一个内存文件句柄
    • f.getvalue()拿到内存文件句柄的内容
    • 注意,Django的session信息默认存在数据库,使用session前应先执行数据库迁移,以生成django_session表

    现在重新访问http://127.0.0.1:8000/test/

    这里写图片描述

    现在验证码已经是实时生成的了,并且每次点击刷新,显示一张新的图片。

    展开全文
  • 主要介绍了PHP使用GD库制作验证码的方法(点击验证码不清会刷新验证码)的相关资料,需要的朋友可以参考下
  • 验证码 demo

    千次阅读 2012-08-17 10:09:30
    From : http://blog.csdn.net/yi_zz/article/details/7869009 我们做一个登陆页面,来看看验证码的背后是怎么工作的: 登陆验证码测试 登录验证码测试

    From : http://blog.csdn.net/yi_zz/article/details/7869009


    我们做一个登陆页面,来看看验证码的背后是怎么工作的:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login_blog.aspx.cs" Inherits="WebApplication1.Login_blog" %>
    
    <!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_blog.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <h3>
                登录验证码测试
            </h3>
            <div id="Login_blog">
                <p>
                    用户名:
                    <asp:TextBox ID="txtUserName" runat="server" CssClass="textbox"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="请输入用户名"
                        Text="*" ControlToValidate="txtUserName"></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="" οnclick="changeCode()" />
                    <asp:TextBox ID="txtCode" runat="server" CssClass="txtCode"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ErrorMessage="请输入验证码!"
                        Text="*" ControlToValidate="txtCode"></asp:RequiredFieldValidator>
                </p>
                <p>
                    <asp:Button ID="btnLogin" runat="server" Text="登录" OnClick="btnLogin_Click" />
                </p>
                <asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="true"
                    ShowSummary="false" />
            </div>
        </div>
        </form>
    </body>
    </html>
    

    在Login_blog.aspx.cs里边这样

    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;
    
    namespace WebApplication1
    {
        public partial class Login_blog : 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();
                string rightCode = Session["Code"].ToString();
                if (code!=rightCode)
                {
                    Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('验证码输入错误!');</script>");
                    return;
                }
                string name = txtUserName.Text.Trim();
                string pwd = txtPassword.Text.Trim();
    
                bool b = LoginManager.Login(name, pwd);
                if (b)
                {
                    //登录成功
                    Session["admin"] = name;
                    Response.Redirect("http://blog.csdn.net/yi_zz");
                }
                else
                {
                        //登录失败
                    Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('登陆失败,用户名或者密码错误!');</script>");
                }
            }
            
    
        }
    }

    css文件中我们排一下版:

    /*
    *登陆验证码测试
    */
    
         *
    {
        margin :0;
        padding :0;
        }
    body 
    {
        font-size :14px;
    }
    
    
    #loginfrm #login p
    {
        padding-bottom :10px;
        }
    .textbox
    {
        width :150px;
        }
    .txtCode
    {
        width :73px;
        }
    

    /*
     * 创建人:宗毅   
     * 创建时间:2012年8月11日19:38:27
     * 说明:登陆的业务逻辑类
     * 版权所有:
    */
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    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 ("zongyi" == name && "czy" == pwd)
               {
                   flag = true;
               }
               return flag;
           }
           #endregion
       }
        
    }
    

    最后看看验证码这部分的代码:

    /*
     * 验证码
    */
    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;
            }
        }
    
    }

    我们看到这个界面:

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


    展开全文
  • 数组验证码

    2019-02-15 17:13:49
    数组验证码 下载后自己
  • 验证码看不清

    2019-06-26 15:25:27
  • 验证码之图像验证码

    千次阅读 2017-04-13 09:46:53
    1、在App的开发中,各种验证码层出不穷。  现在主流的验证码方式是: 1、手机验证码...2、先本博客实现的效果 3、呼朋唤友 群的特点:  1、iOS 开发交流群,每周都有更新新的内容。  2、群里有3~5年的

    1、在App的开发中,各种验证码层出不穷。

       现在主流的验证码方式是: 1、手机验证码:就是用户使用手机获取短信得到验证码,在输入App中。2、就是App 生成图形,展示在用户的手机上,用户根据图片展示输入验证码。下面我们就对第二种进行探究。

    2、先看本博客实现的效果


    3、呼朋唤友

    群的特点:

      1、iOS 开发交流群,每周都有更新新的内容。

      2、群里有3~5年的资深开发者。

      3、群员在App开发过程中遇到什么问题,可以在群里提问。

      4、群员在App开发中,如果遇到难实现的功能或者模块,可以在群里提出,有人员帮助你实现。

      5、加入群后,可以get到App 开发中的一些小功能模块。

      群号是:185341804   群名字:成功QQ吧

      群主号:1542100658 (qq)

    4、代码展示

    1》 工程中的使用代码

            VerificationCodeLable * lable = [[VerificationCodeLable alloc]initWithFrame:CGRectMake(130, 100+ i*80, 100, 30)];

            [self.view addSubview:lable];


    2》网络获取验证码的数值

    /**

     获取验证码的值

     */

    -(void)getVerificationCodeValue{

        /**

         防止重复点击

         */

        CFAbsoluteTime  startTime = CFAbsoluteTimeGetCurrent();

        CFAbsoluteTime  saveTime = [[[NSUserDefaults standardUserDefaults] objectForKey:@"CurrentTime"] doubleValue];

        if (startTime -saveTime >2000) {

            [[NSUserDefaults standardUserDefaults] setObject:@(startTime) forKey:@"CurrentTime"];

            [[NSUserDefaults standardUserDefaults] synchronize];

            /**

             创建接受数据

             */

            responseData = [NSMutableData dataWithCapacity:0];

             /**

              可以重新获取验证码的值

              */

            NSURLSession * session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

            NSURLSessionDataTask * Task = [session dataTaskWithURL:[NSURL URLWithString:@""]];

            [Task resume];

         }

    }


    3》颜色随机获取

    /**

     颜色随机获取

     @return 颜色对象

     */

    -(UIColor*)colorAcquisition:(float)alpha{

        CGFloat R,G,B = 0.0;

        R = arc4random() % 255 /255.0;

        G = arc4random() % 255 /255.0;

        B = arc4random() % 255 /255.0;

        UIColor * color = [UIColor colorWithRed:R green:G blue:B alpha:alpha];

        return color;

    }


    4》底层乱线的绘制

    /**

     绘制背景线条

     */

    -(void)drawBackLine:(CGRect)rect{

        /**

         获取上下文

         */

        CGContextRef contextRef  = UIGraphicsGetCurrentContext();

        /**

         色值画笔的宽度

         */

        CGContextSetLineWidth(contextRef, 1.0f);

        /**

         获取绘制点

         */

        for (unsigned i =0 ; i<8; i++) {

            /**

              获取画笔的颜色

              */

            CGContextSetStrokeColorWithColor(contextRef, [self colorAcquisition:0.25f].CGColor);

            /**

             获取绘制的初始点

             */

            float pX = arc4random() % (int)rect.size.width;

            float pY = arc4random() % (int)rect.size.height;

            /**

             移动画笔

             */

            CGContextMoveToPoint(contextRef, pX, pY);

            float pend_X = arc4random() % (int)rect.size.width;

            float pend_Y = arc4random() % (int)rect.size.height;

            CGContextAddLineToPoint(contextRef, pend_X, pend_Y);

            CGContextStrokePath(contextRef);

        }

    }


    5》验证码的绘制

    - (void)drawRect:(CGRect)rect {

        [super drawRect:rect];

        /**

         计算单个字体的大小

         */

        CGSize singleSize = [@"Z" sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]}];

        /**

         单个字体剩余的宽

         */

        CGFloat singleSurplusWeight = rect.size.width / verificationCodeString.length - singleSize.width;

        /**

         单个字体剩余的宽

         */

        CGFloat singleSurplusHeight = rect.size.height - singleSize.height;

        /**

         获取绘制参数,并开始绘制

         */

        float pX ,pY;

        for (unsigned i = 0; i<verificationCodeString.length; i++) {

             /**

              随机获取绘制的点

              */

            pX = arc4random() % (int)singleSurplusWeight + rect.size.width /verificationCodeString.length* i;

            pY = arc4random() % (int)singleSurplusHeight;

            /**

             获取要绘制的字

             */

            unichar objectChar = [verificationCodeString characterAtIndex:i];

            NSString * drawStr = [NSString  stringWithFormat:@"%c",objectChar];

            /**

             绘制对象

             */

            [drawStr drawAtPoint:CGPointMake(pX, pY) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15],NSForegroundColorAttributeName:[self colorAcquisition:1.0]}];

        }

        /**

         创建文本底线

         */

        [self drawBackLine:rect];

    }


    5、代码下载

    https://pan.baidu.com/s/1pLAYMNL


    展开全文
  • 短信验证码、动态验证码

    千次阅读 多人点赞 2019-01-15 19:27:26
    短信验证码、图形验证码的快速实现。
  • 验证码字体

    2017-12-03 13:39:18
    生成验证码时,当设置的字体服务器上没有,生成的验证码会乱码,此为终极解决方案,永不担心字体不存在而导致验证码乱码问题
  • php 验证码

    2015-08-23 23:15:59
    里面有五种验证码,PHP生成图片验证码实例,同时介绍了点击切换(不清?换一张)效果实现方法
  • 短信验证码

    2014-12-03 11:05:57
    租金做一个短信验证码 发现这个还不错 大家可以进来看看
  • 这是利用GD库生成验证码的页面 test.php header('Content-Type:image/jpeg'); $img = imagecreatetruecolor(100, 40); $black = imagecolorallocate($img, 0x00, 0x00, 0x00); $green = imagecolorallocate...
  • 拼图验证码

    2018-01-03 15:27:14
    拼图验证码,java后台生成图片(base64格式)、坐标方法,工具类,详细的代码注释,保证一就懂。欧耶
  • 上篇文章记录了2种分割验证码的方法,此外还有一种叫做”滴水算法”(Drop Fall Algorithm)的方法,但本人智商原因这个算法的云里雾里的,所以今天记录滑动验证码的处理吧。网上据说有大神已经破解了滑动验证码的...
  • javaweb验证码

    2014-03-23 20:06:04
    包含详细的javaweb验证码代码!值得一
  • windows系统正常,部署到centos云服务中验证码出现以下情况这种情况一般是linux中的字体问题操作如下:1:连接云服务器2:运行yum groupinstall "Fonts"3:重启服务...
  • 随着安全性的要求越来越高,如今的验证码已经不再是简单的四个数字或者字母了,更复杂的图形验证码和行为验证码已经成为了更流行的趋势,但更难的实现也让很多开发者头秃,Gitee 已经替你们想到了这一点。...
  • SSM带验证码登录

    万次阅读 2017-09-23 19:51:41
    登陆的时候有的需要带验证码连同用户名密码一同发送到后台校验,用户名和密码的校验我这个demo里面就不处理了,为了突出验证码部分,所以直接看验证码的校验就可以,验证通过控制台打印“用户输入的验证码和图片生成...
  • 动画验证码

    2007-07-10 22:53:17
    动画验证码,可以看看
  • 验证码识别

    2013-10-16 01:14:38
    本源码是新手学习值得的的学习制作识别验证码的源码
  • iPhone验证码

    2013-04-13 17:43:43
    一个特简单的IOS生成验证码的方式,代码让人无语,好奇的可以看看
  • 验证码demo

    2015-11-18 11:14:22
    不清,换一张!这是一个完整的项目,导入就可以看到效果,利用验证码做的一个小效果!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,255
精华内容 27,302
关键字:

如何看验证码