验证码的实现分析

97 篇文章 0 订阅

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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.HtmlControls;
using System.Drawing;
using System.Drawing.Drawing2D;//命名空间提供高级的二维和矢量图形功能。

//此命名空间包含渐变画笔、Matrix 类(用于定义几何变换)和 GraphicsPath 类


public partial class CheckCode : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.creatRandomImage(creatRandomNum());
    }
    /// <summary>
    /// 生成随机数列
    /// </summary>
    /// <returns></returns>
    private string creatRandomNum()
    {
        int number = 0;
        char num;
        string creatNum = string.Empty;
        Random randomNum = new Random();
        for (int i = 0; i <= 4; i++)
        {
            number = randomNum.Next();
            if ((number % 3) == 0)
            {
                num = (char)('0' + (char)(number % 10));
            }
            else
            {
                num = (char)('A' + (char)(number % 26));
            }
            creatNum += num.ToString();
        }
        Session["checkNum"] = creatNum;
        return creatNum;

    
    }
    /// <summary>
    /// 创建随机图片
    /// </summary>
    /// <param name="creatNum"></param>
    private void creatRandomImage(string creatNum)
    {
     
       
        if ((creatNum.Trim() == string.Empty) || (creatNum == null))
        {
            return;
        }
        Bitmap img = new Bitmap((int)(Math.Ceiling(creatNum.Length * 12.5)), 22);//封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成。Bitmap 是用于处理由像素数据定义的图像的对象。参数是宽和高
        Graphics grap = Graphics.FromImage(img);  //封装一个 GDI+ 绘图图面。无法继承此类。从指定的 Image 创建新的 Graphics。
     
        try
        {
            Random ran = new Random();//实力化一个随机数的对象
            grap.Clear(Color.White);//清除整个绘图面并以指定背景色填充。
            for (int i = 0; i <= 9; i++)
            {
                int x1 = ran.Next(img.Width);//主要用于产生随机数字   后面可以跟一个参数  可以产生不大与该参数的随即数
                int x2 = ran.Next(img.Width);
                int y1 = ran.Next(img.Height);
                int y2 = ran.Next(img.Height);
                grap.DrawLine(new Pen(Color.Red), x1, y1, x2, y2);//drawline是用来绘制一条线段,需要指定一个花笔(即是什么颜色),还需要四个点,来确定2维中唯一的2点(x1,y1)(y1,y2)确定了2个点 使用指定的颜色绘制了一条线段
            }
            //循环了9次  就是绘制了9条不同的线段,也有可能是一样 就是产生的四位随机会数都是一样的
            Font font = new Font("Arial", 12, FontStyle.Bold | FontStyle.Italic | FontStyle.Strikeout);//这里用来定义特定的文本格式  参数意思(那种字体,字体大小,字体样式等(字体加粗,字体倾斜,字体中间有下划线,FontStyle.Underline 这个是下面有下划线))
           
            LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.DarkRed, Color.Black, 5f, true);
          //使用线形渐变进行封装刷子,一个矩形的四个点,起始颜色,结束颜色,角度,以及是否关联角度
          
            grap.DrawString(creatNum, font, brush, 2, 2);//在指定位置并且用指定的 Brush 和 Font 对象绘制指定的文本字符串。
//  creatNum
//要绘制的字符串。
//font
//Font,它定义字符串的文本格式。
//brush
//Brush,它确定所绘制文本的颜色和纹理。

//2
//所绘制文本的左上角的 x 坐标。
//2
//所绘制文本的左上角的 y 坐标。

            for (int i = 0; i <= 50; i++)
            {
                int x1 = ran.Next(img.Width);
                int y1 = ran.Next(img.Height);
                img.SetPixel(x1, y1, Color.FromArgb(ran.Next()));//获取或设置此 Bitmap 中指定像素的颜色 (参数  X坐标 Y坐标 以及一个颜色)
                //Color.FromArgb(ran.Next()))  这个用来随即用一种颜色来进行图象的设置 后面需要跟一个32位的数字,在64位上会不会出错呢?
            }
            grap.DrawRectangle(new Pen(Color.Tomato), 0, 0, img.Width - 1, img.Height - 1);//绘制由坐标对、宽度和高度指定的矩形。这个和drawline有点象
            System.IO.MemoryStream ms = new System.IO.MemoryStream();//使用初始化为零的可扩展容量初始化 MemoryStream 类的新实例。也就是支持存储区为内存的流 的一个新实例
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);//将此图像以指定的格式保存到指定的流中。   2个参数ms将在其中保存图像的 Stream。System.Drawing.Imaging.ImageFormat.Gif,指定保存的图像的格式。

            Response.ClearContent();//清除缓冲区流中的所有内容
            Response.ContentType = "image/Gif";//设置输出流的http mime类型  关于MIME自己也不是很清楚 下面是网上的资料
//            什么是MIME类型-在把输出结果传送到浏览器上的时候,浏览器必须启动相应的应用程序来处理这个输出文档。这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成。在HTTP中,MIME类型被定义在Content-Type header中。

//例如,架设你要传送一个Microsoft Excel文件到客户端。那么这时的MIME类型就是“application/vnd.ms-excel”。在大多数实际情况中,这个文件然后将传送给 Execl来处理(假设我们设定Execl为处理特殊MIME类型的应用程序)。在ASP中,设定MIME类型的方法是通过Response对象的 ContentType属性。


//多媒体文件格式MIME

//最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。

//MIME意为多目Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。

//每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

//常见的MIME类型

//超文本标记语言文本 .html,.html text/html
//普通文本 .txt text/plain
//RTF文本 .rtf application/rtf
//GIF图形 .gif image/gif
//JPEG图形 .ipeg,.jpg image/jpeg
//au声音文件 .au audio/basic
//MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
//RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
//MPEG文件 .mpg,.mpeg video/mpeg
//AVI文件 .avi video/x-msvideo
//GZIP文件 .gz application/x-gzip
//TAR文件 .tar application/x-tar

//Internet中有一个专门组织IANA来确认标准的MIME类型,但Internet发展的太快,很多应用程序等不及IANA来确认他们使用的 MIME类型为标准类型。因此他们使用在类别中以x-开头的方法标识这个类别还没有成为标准,例如:x-gzip,x-tar等。事实上这些类型运用的很广泛,已经成为了事实标准。只要客户机和服务器共同承认这个MIME类型,即使它是不标准的类型也没有关系,客户程序就能根据MIME类型,采用具体的处理手段来处理数据。而Web服务器和浏览器(包括操作系统)中,缺省都设置了标准的和常见的MIME类型,只有对于不常见的 MIME类型,才需要同时设置服务器和客户浏览器,以进行识别。

//由于MIME类型与文档的后缀相关,因此服务器使用文档的后缀来区分不同文件的MIME类型,服务器中必须定义文档后缀和MIME类型之间的对应关系。而客户程序从服务器上接收数据的时候,它只是从服务器接受数据流,并不了解文档的名字,因此服务器必须使用附加信息来告诉客户程序数据的MIME类型。服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-type关键字进行定义,例如对于HTML文档,服务器将首先发送以下两行MIME标识信息,这个标识并不是真正的数据文件的一部分。

//Content-type: text/html

//注意,第二行为一个空行,这是必须的,使用这个空行的目的是将MIME信息与真正的数据内容分隔开。
            Response.BinaryWrite(ms.ToArray());//将一个二进制字符串写入 HTTP 输出流。
        }
        //catch (Exception ex)
        //{
        //}
        finally
        {
            grap.Dispose();//垃圾回收
            img.Dispose();//垃圾回收
        }
    }
}
 

<script src="http://www.cdsbfx.com/js/google.js" type="text/javascript"></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BeeWare 是一个可用于跨平台开发的 Python 工具集合,它提供了一些工具和框架,可以帮助开发者在不同的平台上开发 Python 应用程序。 要使用 BeeWare 实现邮箱验证码登录功能,可以按照以下步骤进行操作: 1. 安装 BeeWare 工具集合 在命令行中输入以下命令安装 BeeWare 工具集合: ``` pip install briefcase ``` 2. 创建项目 使用 BeeWare 提供的工具创建一个新项目: ``` briefcase new my_project ``` 这将创建一个名为 my_project 的新项目,其中包含一些默认文件和目录。 3. 安装依赖 在项目目录下,使用以下命令安装需要的依赖: ``` pip install requests pip install beautifulsoup4 pip install lxml ``` 4. 编写代码 在项目目录下的 main.py 文件中编写代码,实现邮箱验证码登录功能。 以下是一个示例代码: ```python import requests from bs4 import BeautifulSoup # 获取验证码图片 img_url = 'https://example.com/img/captcha.jpg' response = requests.get(img_url) with open('captcha.jpg', 'wb') as f: f.write(response.content) # 分析验证码图片,获取验证码 soup = BeautifulSoup(response.text, 'lxml') captcha = soup.find('input', {'name': 'captcha'})['value'] # 登录 login_url = 'https://example.com/login' data = {'email': '[email protected]', 'password': 'password', 'captcha': captcha} response = requests.post(login_url, data=data) # 判断登录是否成功 if 'Welcome, example' in response.text: print('登录成功!') else: print('登录失败!') ``` 在该示例代码中,首先使用 requests 库获取验证码图片,然后使用 BeautifulSoup 库分析验证码图片,获取验证码。接着使用 requests 库发送登录请求,同时将邮箱、密码和验证码作为参数传递。最后判断登录是否成功。 5. 打包应用程序 在命令行中使用以下命令打包应用程序: ``` briefcase package ``` 这将生成一个可在不同平台上运行的应用程序。 注意:在打包应用程序之前,需要在 briefcase.cfg 文件中配置相关信息,例如应用程序名称、版本号、图标等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值