net 生成gif动画验证码
用ServletJSP动态生成图像验证码
用ServletJSP动态生成图像验证码现在有不少网站在用户填写表单时,同时要求填写验证码,验证码的一个目的就是防范一些恶意的网站下载软件,这些软件能通过遍历链接而将网站的所有网页下载。
还可以防止用户不经过本网站的页面而使用网站的资源。
所以现在有不少网站都使用了验证码技术,验证码通常是一个在WEB服务器上生成的随机字符串,同时以某种方式保存起来,比如保存到与当前的Session中,然后在用户提交网页时与用户输入的验证比较是否一致,然而如果直接以明文的方式,还是不能防范一些功能较强的自动填写表格的软件。
所以一般将验证码以图片的形式显示出来,同时可以将在图片中显示的字符串进行一些处理,比如使用旋转字符,添加背景纹理等技术以增大被软件识别的难度。
下面简要介绍一下如果实现这种验证码:首先实现一个servlet用来生成图片(当然也可以用jsp实现):import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;import com.sun.image.codec.jpeg.*;import java.awt.*;import com.sun.image.codec.jpeg.*;import java.awt.image.BufferedImage;import java.awt.image.DataBuffer;import java.awt.geom.GeneralPath;import javax.swing.*;import java.math.*;public class Servlet1extends HttpServlet {//Process the HTTP Get requestpublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType(CONTENT_TYPE);response.setContentType("image/jpeg"); //必须设置ContentType为image/jpegint length = 4; //设置默认生成4个数字Date d = new Date();long lseed = d.getTime();java.util.Random r = new Random(lseed); //设置随机种子if (request.getParameter("length") != null) {try {length = Integer.parseInt(request.getParameter("length"));}catch (NumberFormatException e) {}}StringBuffer str = new StringBuffer();for (int i = 0; i <length; i++) {str.append(r.nextInt(9)); //生成随机数字}//可以在此加入保存验证码的代码//创建内存图像BufferedImage bi = new BufferedImage(40, 16, BufferedImage.TYPE_INT_RGB); Graphics2D g = bi.createGraphics();g.clearRect(0, 0, 16, 40);g.setColor(Color.green.CY AN);g.drawString(str.toString(), 4, 12);try {//使用JPEG编码,输出到response的输出流JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response. getOutputStream());JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);param.setQuality(1.0f, false);encoder.setJPEGEncodeParam(param);encoder.encode(bi);}catch (Exception ex) {}}}然后在需求显示验证码的加入以下代码就可以了<img alt="" src="/WebModule1/servlet1" width="40" height="16"/>将/WebModule1/servlet1替换成你用来生成验证码的servlet的全路径。
.Net二维码验证码生成下载与识别
二维码识别与验证系统的设计与实现摘要:图像识别,是利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。
验证码识别是图像数字识别的热门研究方向。
本系统以Visual Studio作为开发环境,使通过C#语言编程实现,利用网格特征模板、交叉点特征模板、改进的活动模板, 结合孔洞数特征, 设计了基于模板匹配算法的模糊数字验证码识别系统。
为进一步提高识别率, 提出了一种加权模板及其构造方案, 并运用统计学方法。
通过在线下载网络上的验证码来动态测试本系统的有效性和鲁棒性。
旨在通过获取观察对象、图像灰度化、特征提取、二值化图像、图像切割、细化、字符外形特征分析然后通过模板匹配获取结果。
论文在介绍了设计背景以及系统分析后,详述了系统总体设计、编码等过程,并对设计过程中采用的关键技术、遇到的难点问题及解决方法做了重点论述。
关键词:验证码,识别,C#Design and Implementation of a two-dimensional Code Recognition and Verification SystemAbstract:Image recognition is the technique that deals with processing ,analysis and understanding of the images by puter to identify the different mode of target. Verification code recognition is a popular research direction of digital image recognition.This system uses Visual Studio as development environment, which is realized by C# language programming.With the use of grid feature template,crossing points feature template, improved active template, bined with the hole number features, we design verification code identification system of fuzzy numbers based on template matching method.In order to further improve the recognition rate, this paper proposes a weighted template and its construction scheme,includingstatistical method. The verification code through online download on the network dynamically tests the effectiveness and robustness of the system.Aimed to obtain object of observation, the gray image, feature extraction, the two value image, image cutting, thinning, character shape feature analysis , then using the template matching gets results.This paper introduces the design background and analysis of the system, details system design, coding process, and the difficulties encountered, the key technology in the process of design and the solution is detailed.Keywords: Verification code, recognition, C#文档目录前言1第1章绪论21.1 项目背景31.2 设计原则41.3 本章小结4第2章系统分析52.1 系统分析52.1.1 系统输入输出环节需求分析62.1.2 系统算法需求分析62.1.3 系统图像处理环节需求分析62.1.4 系统功能环节需求分析62.1.5 系统菜单分类分析62.2 系统工作流程72.3 系统创新性分析82.4 本章小结8第3章总体设计83.1 系统总体体系结构83.2 二维码生成与验证系统模块总体设计93.2.1 二维码生成模块设计9文档3.2.2 二维码识别模块设计113.3 关键技术分析123.4 本章小结13第4章编码实现134.1 系统开发环境134.2 程序设计语言134.3 核心功能编码实现134.3.1 二维码生成144.4 本章小结15第5章系统测试与维护155.1 运行环境165.2 测试原则165.3 测试方法165.4 模块测试175.5 模块整合测试175.6 系统整体测试185.7 系统的运行结果185.8 系统维护20结束语21参考文献22致谢23前言当今网络社会选择加密已是我们别无选择,其一是我们知道在互联网上进行文件传输、电子商务往来存在许多不安全因素,特别是对于一些大公司和一些某某文件在网络上传输。
php生成动态图片验证码代码
php生成动态图片验证码代码php生成动态图片验证码代码php生成动态图片验证码的一段代码,有需要的朋友可以看看。
一个简单的php图形验证码程序:(产生一个随机数,取得随机字符串,然后将该字符串设置进session--方便验证;php生成动态图片验证码的.一段代码,有需要的朋友可以看看。
一个简单的php图形验证码程序:(产生一个随机数,取得随机字符串,然后将该字符串设置进session--方便验证;PHP设置成@header("Content-Type:image/png");生成对应图片。
)另外,记得把php中extension=php_gd2.dll 打开。
复制代码代码如下:<?phpsession_start();function random($len){$srCStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";$strs="";for($i=0;$i<$len;$i++){$strs.=$srCStr[mt_rand(0,35)];}return $strs;}$str=random(4); //随机生成的字符串$width = 50; //验证码图片的宽度$height = 25; //验证码图片的高度@header("Content-Type:image/png");$_SESSION["code"] = $str;$im = imagecreate($width,$height);//背景色$back = imagecolorallocate($im,0xFF,0xFF,0xFF);//模糊点颜色$pix = imagecolorallocate($im,187,230,247);//字体色$font = imagecolorallocate($im,41,163,238);//绘模糊作用的点for($i=0;$i<1000;$i++){imagesetpixel($im,mt_rand(0,$width),mt_rand(0,$height),$pi x);}imagestring($im, 5, 7, 5,$str, $font);imagerectangle($im,0,0,$width-1,$height-1,$font);imagepng($im);imagedestroy($im);$_SESSION["code"] = $str;>小结:自 PHP 4.2.0 起,不再需要用 srand()或 mt_srand() 函数给随机数发生器播种,现已自动完成。
Asp.net中图片验证码的设计与实现
中图片验证码的设计与实现作者:王伟娜刘群来源:《电脑知识与技术》2013年第11期摘要:图片验证码已成为许多主流网站用来防止非法用户自动注册、登录、灌水的一种有效手段。
该文在介绍了验证码原理、技术的基础上,给出了在中设计图片验证码的方法。
关键词:图片验证码;;Session中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)11-2598-03当今的互联网环境下,基于软件的安全性防护是软件开发人员必须考虑的一个重要问题。
在传统的网站登录界面中基本上只需要填写好用户名和密码来与数据库中的用户信息进行比从而确定是否允许该用户登录,但非法用户无处不在,攻击方式和手段数不胜数,如机器人程序自动登陆、批量注册、暴力破解密码、截获用户名和密码等导致传统方式中网站安全性不高。
因此,把好系统登陆这一关极为重要,目前很多web页面采用一种安全防御技术,在登陆系统时不但要填写用户名和密码,还要输入验证码,在很大程度上增强了系统登录的安全性。
1 验证码技术介绍1.1 常见的验证码类型目前的网站中使用的验证码类型有:文本验证码、图片验证码、邮件验证码和手机验证码四大类。
文本验证码是最原始的技术,由于安全性较低,多数网站目前已经弃用这种方式;图片验证码则采用随机生成的若干数字或字母组成一张图像,然后在图像上布满杂点等干扰像素,或者是对字母数字进行旋转、变形、扭曲等操作,迫使用户用肉眼辨认出图片中的一串符号并手工输入到文本框,连同用户名和密码一起提交到服务器进行验证,三项信息全部验证成功才能登录系统;邮件验证码需要用户在网页中输入自己的电邮,系统将验证码通过邮件这种途径推送到用户邮箱中,从时间成本和工作效率来看,这种形式相对而言要麻烦些;手机验证码需要用户输入手机号码来接收网站发送的验证码信息,由于涉及到个人的电话信息,容易遭到用户的排斥,除银行等安全级别较高的服务网站外,大多数的网站不会采用这种方式。
ASP.NET实现验证码图片
实现验证码图⽚新建⼀个checkcode.aspx⽂件,页⾯中不⽤写任何东西,在代码中,Page_Load中写⼊如下代码:string chkCode = string.Empty;int ix, iy;ix = 80;iy = 24;//颜⾊列表,⽤于验证码、噪线、噪点Color[] color ={ Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue }; //字体列表,⽤于验证码string[] font ={ "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "MingLiU", "Arial" };//验证码的字符集,去掉了⼀些容易混淆的字符char[] character ={ '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };Random rnd = new Random();//⽣成验证码字符串for (int i = 0; i < 4; i++){chkCode += character[rnd.Next(character.Length)];}Bitmap bmp = new Bitmap(ix, iy);Graphics g = Graphics.FromImage(bmp);g.Clear(Color.White);//画噪线for (int i = 0; i < 10; i++){int x1 = rnd.Next(ix);int y1 = rnd.Next(iy);int x2 = rnd.Next(ix);int y2 = rnd.Next(iy);Color clr = color[rnd.Next(color.Length)];g.DrawLine(new Pen(clr), x1, y1, x2, y2);}//画验证码字符串for (int i = 0; i < chkCode.Length; i++){string fnt = font[rnd.Next(font.Length)];Font ft = new Font(fnt, 14, FontStyle.Bold);Color clr = color[rnd.Next(color.Length)];g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 16 + 2, (float)2);}//画噪点for (int i = 0; i < 50; i++){int x = rnd.Next(bmp.Width);int y = rnd.Next(bmp.Height);Color clr = color[rnd.Next(color.Length)];bmp.SetPixel(x, y, clr);}//将验证码写⼊SESSIONSession["checkcode"] = chkCode.ToLower();//清除该页输出缓存,设置该页⽆缓存Response.Buffer = true;Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0);Response.Expires = 0;Response.CacheControl = "no-cache";Response.AppendHeader("Pragma", "No-Cache");//将验证码图⽚写⼊内存流,并将其以 "image/Png" 格式输出MemoryStream ms = new MemoryStream();try{bmp.Save(ms, ImageFormat.Png);Response.ClearContent();Response.ContentType = "image/Png";Response.BinaryWrite(ms.ToArray());}finally{//显式释放资源bmp.Dispose();g.Dispose();}在login.aspx中,添加Image控件,设置ImageUrl=“checkcode.aspx" 即可。
net 生成gif动画验证码
.net 生成gif动画验证码using System;using System.IO;using System.Web;using System.Drawing;//GIF验证码类public class Validate{//设置最少4位验证码private byte TrueValidateCodeCount = 4;public byte ValidateCodeCount{get { return TrueValidateCodeCount; }set{//验证码至少为3位if (value > 4)TrueValidateCodeCount = value;}}protected string ValidateCode = "";//是否消除锯齿public bool FontTextRenderingHint = false;//验证码字体public string ValidateCodeFont = "Arial";//验证码型号(像素)public float ValidateCodeSize = 13;public int ImageHeight = 23;//定义验证码中所有的字符public string AllChar = "1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";//获得随机四位数private void CreateValidate(){ValidateCode = "";//将验证码中所有的字符保存在一个字符串数组中string[] CharArray = AllChar.Split(',');int Temp = -1;//生成一个随机对象Random RandCode = new Random();//根据验证码的位数循环for (int i = 0; i < ValidateCodeCount; i++){//主要是防止生成相同的验证码if (Temp != -1){//加入时间的刻度RandCode = new Random(i * Temp * ((int)DateTime.Now.Ticks));}int t = RandCode.Next(35);if (Temp == t){//相等的话重新生成CreateValidate();}Temp = t;ValidateCode += CharArray[Temp];}//错误检测,去除超过指定位数的验证码if (ValidateCode.Length > TrueValidateCodeCount)ValidateCode = ValidateCode.Remove(TrueValidateCodeCount);}//生成一帧的BMP图象private void CreateImageBmp(out Bitmap ImageFrame){//获得验证码字符char[] CodeCharArray = ValidateCode.ToCharArray(0, ValidateCodeCount);//图像的宽度-与验证码的长度成一定比例int ImageWidth = (int)(TrueValidateCodeCount * ValidateCodeSize * 1.3 + 4);//创建一个长20,宽iwidth的图像对象ImageFrame = new Bitmap(ImageWidth, ImageHeight);//创建一个新绘图对象Graphics ImageGraphics = Graphics.FromImage(ImageFrame);//清除背景色,并填充背景色//Note:Color.Transparent为透明ImageGraphics.Clear(Color.White);//绘图用的字体和字号Font CodeFont = new Font(ValidateCodeFont, ValidateCodeSize, FontStyle.Bold);//绘图用的刷子大小Brush ImageBrush = new SolidBrush(Color.Red);//字体高度计算int FontHeight = (int)Math.Max(ImageHeight - ValidateCodeSize - 3, 2);//创建随机对象Random rand = new Random();//开始随机安排字符的位置,并画到图像里for (int i = 0; i < TrueValidateCodeCount; i++){//生成随机点,决定字符串的开始输出范围int[] FontCoordinate = new int[2];FontCoordinate[0] = (int)(i * ValidateCodeSize + rand.Next(1)) + 3;FontCoordinate[1] = rand.Next(FontHeight);Point FontDrawPoint = new Point(FontCoordinate[0], FontCoordinate[1]);//消除锯齿操作if (FontTextRenderingHint)ImageGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;elseImageGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;//格式化刷子属性-用指定的刷子、颜色等在指定的范围内画图ImageGraphics.DrawString(CodeCharArray[i].ToString(), CodeFont, ImageBrush, FontDrawPoint);}ImageGraphics.Dispose();}//处理生成的BMPprivate void DisposeImageBmp(ref Bitmap ImageFrame){//创建绘图对象Graphics ImageGraphics = Graphics.FromImage(ImageFrame);//创建铅笔对象Pen ImagePen = new Pen(Color.Red, 1);//创建随机对象Random rand = new Random();//创建随机点Point[] RandPoint = new Point[2];//随机画线for (int i = 0; i < 15; i++){RandPoint[0] = new Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));RandPoint[1] = new Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));ImageGraphics.DrawLine(ImagePen, RandPoint[0], RandPoint[1]);}ImageGraphics.Dispose();}//创建GIF动画private void CreateImageGif(){Bitmap ImageFrame;Kissogram.Drawing.Gif.AnimatedGifEncoder GifPic = new Kissogram.Drawing.Gif.AnimatedGifEncoder();MemoryStream BmpMemory = new MemoryStream();GifPic.Start();//确保视觉残留GifPic.SetDelay(5);//-1:no repeat,0:always repeatGifPic.SetRepeat(0);for (int i = 0; i < 20; i++){//创建一帧的图像CreateImageBmp(out ImageFrame);//生成随机线条DisposeImageBmp(ref ImageFrame);//输出绘图,将图像保存到指定的流ImageFrame.Save(BmpMemory,System.Drawing.Imaging.ImageFormat.Png);GifPic.AddFrame(Image.FromStream(BmpMemory));BmpMemory = new MemoryStream();}GifPic.OutPut(ref BmpMemory);HttpContext.Current.Response.ClearContent();//配置输出类型HttpContext.Current.Response.ContentType = "image/Gif";//输出内容HttpContext.Current.Response.BinaryWrite(BmpMemory.ToArray());BmpMemory.Close();BmpMemory.Dispose();}//输出验证码public void OutPutValidate(string ValidateCodeSession){CreateValidate();CreateImageGif();//把生成的验证码输入到SESSIONHttpContext.Current.Session[ValidateCodeSession] = ValidateCode;}}加水印的代码:public static Bitmap WaterMarkWithText(System.Drawing.Bitmap origialGif, string text,string filePath){//用于存放桢List frames = new List();//如果不是gif文件,直接返回原图像if (origialGif.RawFormat.Guid != System.Drawing.Imaging.ImageFormat.Gif.Guid){return origialGif;}//如果该图像是gif文件foreach (Guid guid in origialGif.FrameDimensionsList){System.Drawing.Imaging.FrameDimension frameDimension = new System.Drawing.Imaging.FrameDimension(guid);int frameCount = origialGif.GetFrameCount(frameDimension);for (int i = 0; i < frameCount; i++){if (origialGif.SelectActiveFrame(frameDimension, i) == 0){int delay = Convert.ToInt32(origialGif.GetPropertyItem(20736).Value.GetValue(i));Image img = Image.FromHbitmap(origialGif.GetHbitmap());Font font = new Font(new FontFamily("宋体"), 35.0f,FontStyle.Bold);Graphics g = Graphics.FromImage(img);g.DrawString(text, font, Brushes.BlanchedAlmond, new PointF(10.0f, 10.0f));Frame frame = new Frame(img, delay);frames.Add(frame);}}ponents.AnimatedGifEncoder gif = new ponents.AnimatedGifEncoder();gif.Start(filePath);gif.SetDelay(100);gif.SetRepeat(0);for (int i = 0; i < frames.Count; i++){gif.AddFrame(frames[i].Image);}gif.Finish();try{Bitmap gifImg = (Bitmap)Bitmap.FromFile(filePath);return gifImg;}catch{return origialGif;}}return origialGif;}Bitmap bmp = new Bitmap(100, 100);Graphics g = Graphics.FromImage(bmp);Font f = new Font("arial", 11f);Brush b = Brushes.Blue;string txt = "Rotate text animation!";SizeF sz = g.MeasureString(txt, f);g.Clear(Color.WhiteSmoke);g.DrawString(txt, f, b, 50-sz.Width/2, 50-sz.Height/2);g.Flush();GifImage.GifAnimation gif = new GifImage.GifAnimation(bmp,GifImage.GraphicControlExt.Default);gif.Application = GifImage.ApplicationExt.Default;eGlobalColorTableOnly = true;for (int i = 1; i < 36; ++i){g.Clear(Color.WhiteSmoke);g.TranslateTransform(50,50);g.RotateTransform(10f * i);g.DrawString(txt, f, b, sz.Width/-2, sz.Height/-2);g.ResetTransform();g.DrawString("Hello", f, Brushes.Red, -50 + i * 4, 20);g.DrawString("Yeah", f, Brushes.Orange, 60, -20+i*4);g.Flush();gif.AddFrame(bmp);}f.Dispose();g.Dispose();bmp.Dispose();FileStream fs = new FileStream(@"E:\vmlinux\out.gif", FileMode.Create); gif.Save(fs);fs.Close();Console.WriteLine("{0}x{1}", gif.Screen.Width, gif.Screen.Height);。
.net生成图片验证码
// 取得当前点的颜色
int nOldX = 0, nOldY = 0;
nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
nOldY = bXDir ? j : j + (int)(dy * dMultValue);
string code=CreateVerifyCode();
CreateImageOnPage(code, context);
context.Response.Cookies.Add(new HttpCookie("CheckCode", code.ToUpper()));// 使用Cookies取验证码的值
private const double PI2 = 6.283185307179586476925286766559;
/// <summary>
/// 正弦曲线Wave扭曲图片(Edit By )
/// </summary>
dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseAxisLen;
dx += dPhase;
double dy = Math.Sin(dx);
string[] fonts = { "Arial", "Georgia" };
public string[] Fonts
{
get { return fonts; }
set { fonts = value; }
using System.Drawing.Imaging;
如何为网页设计制作动态的GIF图像
如何为网页设计制作动态的GIF图像一、概述和介绍(150字)- GIF(Graphics Interchange Format)是一种常用的图片格式,它支持动画效果,非常适合用于网页设计。
- 制作动态的GIF图像可以为网页增加吸引力和用户体验,提升页面的互动性。
二、准备工作(200字)1. 选择合适的GIF制作工具:市面上有很多GIF制作工具可供选择,如Adobe Photoshop、GIMP、Ezgif等,根据个人需求和操作习惯选择适合自己的工具。
2. 收集合适的素材:根据网页的主题和目标,收集需要在GIF中展示的素材,包括图片、短视频或动画片段等。
三、使用Adobe Photoshop制作GIF(350字)1. 打开Adobe Photoshop软件,选择“新建”创建一个新的文稿。
2. 导入素材:打开素材文件夹,将需要使用的素材拖拽到Photoshop文稿中。
3. 调整素材尺寸:使用“变换工具”或“裁剪工具”对素材进行尺寸调整,使其适应网页设计需要。
4. 配置时间轴:在Photoshop中,选择“窗口”-“时间轴”打开时间轴面板。
在时间轴中,可以添加、删除、调整素材的帧,设置每一帧的时间间隔。
5. 添加过渡效果:为了制作更流畅的GIF效果,可以在相邻帧之间添加过渡效果,如渐变、淡入淡出等。
6. 优化GIF:点击“文件”-“存储为Web用途”将GIF保存为Web格式,选择合适的压缩选项和颜色模式,减小GIF文件大小并保持画质。
四、使用GIMP制作GIF(350字)1. 打开GIMP软件,选择“文件”-“新建”创建一个新的文稿。
2. 导入素材:选择“文件”-“打开作为图层”,将需要使用的素材逐个导入到GIMP文稿中,每个素材对应一个图层。
3. 调整素材尺寸:使用“工具箱”中的工具,如放缩工具、裁剪工具等,对素材进行尺寸调整,使其适应网页设计需要。
4. 配置时间轴:选择“窗口”-“插件”-“动画”,在弹出的动画面板中,可以添加、删除、调整素材的帧,设置每一帧的时间间隔。
图形验证码的两种实现方式
图形验证码的两种实现⽅式情形⼀:图形验证码跟短信验证码⼀起,只需要将后台提供的动态链接填到(id="img")的src中即可⽣成动态验证码。
然后,在需要请求接⼝的地⽅,只需把(id="imgCode")中⽤户输⼊的信息通过ajax传给后台,验证验证码是否正确。
原理(后台):后台通过session存储图⽚上的字符串,和之后前台请求过来的带的输⼊的字符串参数,做⽐较,判断是否⼀样。
<!doctype html><html><head><meta charset="UTF-8"><title>图形验证码</title></head><body><form><div class="imgCodeBox"><label for="imgCode">图形验证码</label><input type="text" placeholder="请输⼊验证码" id="imgCode"><img src="" id="img"></div></form></body></html>情形⼆:⽤cavas,但是没有安全性,考虑到实⽤性的话,还是⽤情形⼀的好<!doctype html><html><head><meta charset="UTF-8"><title>测试</title></head><body><canvas id="canvas" width="120" height="40"></canvas><a href="#" id="changeImg">看不清,换⼀张</a><script>/**⽣成⼀个随机数**/function randomNum(min,max){return Math.floor( Math.random()*(max-min)+min);}/**⽣成⼀个随机⾊**/function randomColor(min,max){var r = randomNum(min,max);var g = randomNum(min,max);var b = randomNum(min,max);return "rgb("+r+","+g+","+b+")";}drawPic();document.getElementById("changeImg").onclick = function(e){e.preventDefault();drawPic();}/**绘制验证码图⽚**/function drawPic(){var canvas=document.getElementById("canvas");var width=canvas.width;var height=canvas.height;var ctx = canvas.getContext('2d');ctx.textBaseline = 'bottom';/**绘制背景⾊**/ctx.fillStyle = randomColor(180,240); //颜⾊若太深可能导致看不清ctx.fillRect(0,0,width,height);/**绘制⽂字**/var str = 'ABCEFGHJKLMNPQRSTWXY123456789';for(var i=0; i<4; i++){var txt = str[randomNum(0,str.length)];ctx.fillStyle = randomColor(50,160); //随机⽣成字体颜⾊ctx.font = randomNum(15,40)+'px SimHei'; //随机⽣成字体⼤⼩var x = 10+i*25;var y = randomNum(25,45);var deg = randomNum(-45, 45);//修改坐标原点和旋转⾓度ctx.translate(x,y);ctx.rotate(deg*Math.PI/180);ctx.fillText(txt, 0,0);//恢复坐标原点和旋转⾓度ctx.rotate(-deg*Math.PI/180);ctx.translate(-x,-y);}/**绘制⼲扰线**/for(var i=0; i<8; i++){ctx.strokeStyle = randomColor(40,180);ctx.beginPath();ctx.moveTo( randomNum(0,width), randomNum(0,height) );ctx.lineTo( randomNum(0,width), randomNum(0,height) );ctx.stroke();}/**绘制⼲扰点**/for(var i=0; i<100; i++){ctx.fillStyle = randomColor(0,255);ctx.beginPath();ctx.arc(randomNum(0,width),randomNum(0,height), 1, 0, 2*Math.PI);ctx.fill();}}</script></body></html>情形⼆转⾃:https:///meishuixingdeququ/article/details/52386542情形三、⽤js产⽣随机数实现1、创建图形码容器<label class="myLabel">图形码:<input type = "button" id="code" onclick="createCode()" style="border: 0;background-color: transparent;padding: 0;"/> </label>2、产⽣验证码并在页⾯加载时和点击时调⽤ // 图形验证码var code ; //在全局定义验证码//产⽣验证码window.onload = function createCode(){code = "";var codeLength = 4;//验证码的长度var checkCode = document.getElementById("code");var random = new Array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//随机数for(var i = 0; i < codeLength; i++) {//循环操作var index = Math.floor(Math.random()*36);//取得随机数的索引(0~35)code += random[index];//根据索引取得随机数加到code上}checkCode.value = code;//把code值赋给验证码}。
ASP.NET中生成图形验证码的方法研究
【 关键词】 验证码 ;s .E 算法 A P T; N
0 引 言
i tn n Bmp i h He g t= 2 ; 5 S s e Dr wi g Bi p y t m. a n . t ma b mp n w S se Dr wi g Bi p e y t m. a论坛0 T
S IN E&T C N L G F R TO CE C E H O O YI O MA I N N
21年 02
第 2 期 3
A PN T中生成图形验证码的方法研究 S .E
尚淑玲 , 丁 汀 2 (. 1 河南机电职业学院管理工程系 河南 郑州 4 00 ;. 5022河南机电职业学院信息工程系 河南 郑州 400 ) 502
Ss m.rwn .e e yt Da ig npn=n w Ss m.rwn .e (ytm.rwn . e P e yt Da ig nSs Da ig e P e C lr rm g n e - 7 n re - 7 n le 1)2; oo. o Arb(R d 1 ,G en 1 ,Bu - 7,) F f ( ta= ;<n ie; + o i Oa Ln s + 1 rn a
・
功后才 能使用该 网站提供 的某项特定功能 。
i tn i e n L n s= 3 :
1 验 证 码 使 用 现 状
验证 码技术 由于技术 使用简单 . 阐述数据小 . 因此针对 各网站特 别是论 坛性质的 网站 . 广泛使用来 防止 自动化程 序( 如论坛 自动灌水 机) 进行大批量 的恶意行为 , 此类 自 动化程序较为 流行 , 以在 国内排 所 名前 10名 的论坛 中有超过 8 %的论坛在注册、 0 0 登录或发帖部分采用 验证码技术 验证码 的另一 主要应用场所是 电子 邮件类 网站 . 用来辅 助预 防和阻止垃圾 邮件群 发 . 总体来 说 . 国外在验 证码技术 的应 用场 所和应用程序 与国内基本类似 恶 意程序或真实用户登 录具有 图形验证码 的网站 时. 用服务器 应 通常会 提供 一副具有验证 码的字符 串图片供用户识 别其 中的验 证码 信息 . 并将这些验证码字符保存在 s s n中。 ei so 真实用户在验证码输入 框输人验证码字符 串并通过 w b e 应用系统并提交 给应用 服务 器 . 然后 应用服务器会 自动验证用户提交 的验证 码和 ssin中保存 的验 证码 es o 是否相 同. 若相 同, 用户服务器就会响应用户的请求 . 否则会 提示验证 码输入错误并提供新 的图形验证码 以供用户再次输入验证码信息
.net里各种验证码的实现
验证码的实现:法1、在创建验证码的功能时,将验证码的代码放在一个单独的页面中,再有image控件来调用验证码图片,在引用设计页面中添加的代码:<asp:Image Runat="server"ID="ImageCheck"ImageUrl="ValidateCode.aspx"></asp:Image >。
"ValidateCode.aspx"是实现验证码功能的代码。
具体代码如下:using System;using System.Data;using System.Configuration;using System.Collections;using System.Drawing;using ponentModel;using System.Web;using System.Web.Security;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;public partial class ValidateCode: System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){this.CreateCheckCodeImage(GenerateCheckCode());}private string GenerateCheckCode(){int number;char code;string checkCode = string.Empty;System.Random random = new Random();for (int i = 0; i < 5; i++){number = random.Next();if (number % 2 == 0)code = (char)('0' + (char)(number % 10));elsecode = (char)('a' + (char)(number % 26));checkCode += code.ToString();}//response.cookies.add(new httpcookie("checkcode",checkcode));Session["CheckCode"] = checkCode;return checkCode;}private void CreateCheckCodeImage(string checkCode){if (checkCode == null || checkCode.Trim() == String.Empty)return;System.Drawing.Bitmap image =new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);Graphics g = Graphics.FromImage(image);try{ Random random = new Random();//生成随机生成器g.Clear(Color.White);for (int 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 = newSystem.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);//System.Drawing.Drawing2D.LinearGradientBrush brush=newSystem.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.Blue, 1.0f, true);g.DrawString(checkCode, font, brush, 2, 2);//画图片的前景噪声点for (int i = 0; i < 100; i++){int x = random.Next(image.Width);int y = random.Next(image.Height);//image.setpixel(x,y,color.FromArgb(random.Next()));image.SetPixel(x, y, Color.Yellow);}//画图片的边框线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);Response.ClearContent();Response.ContentType = "image/Gif";Response.BinaryWrite(ms.ToArray());}finally{g.Dispose();image.Dispose();}}#regionprotected override void OnInit(EventArgs e)『 InitializeComponent();base.OnInit(e);}private void InitializeComponent(){ this.Load+=new System.EventHandler(this.Page_Load);}#endregion}法2、protected void Page_Load(object sender, EventArgs e){string[] str = new string[4];string serverCode = "";string [] a=new string [61] {"1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K ","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d"," e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x", "y","z"};//生成随机生成器Random random = new Random();for (int i = 0; i < 4; i++){int rd= random.Next(60);str[i] = a[rd];}CreateCheckCodeImage(str);foreach (string s in str){serverCode += s;}Session["serverCode"] = serverCode;}public void CreateCheckCodeImage(string[] checkCode){if (checkCode == null || checkCode.Length <= 0)return;System.Drawing.Bitmap image = newSystem.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 32.5)), 30);System.Drawing.Graphics g = Graphics.FromImage(image);try{Random random = new Random();//清空图片背景色g.Clear(Color.White);//画图片的背景噪音线for (int i = 0; i < 20; 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);}//定义颜色Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };//定义字体string[] f = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };for (int k = 0; k <= checkCode.Length - 1; k++){int cindex = random.Next(7);int findex = random.Next(5);Font drawFont = new Font(f[findex], 16,(System.Drawing.FontStyle.Bold));SolidBrush drawBrush = new SolidBrush(c[cindex]);float x = 5.0F;float y = 0.0F;float width = 20.0F;float height = 25.0F;int sjx = random.Next(10);int sjy = random.Next(image.Height - (int)height);RectangleF drawRect = new RectangleF(x + sjx + (k * 25), y + sjy, width, height);StringFormat drawFormat = new StringFormat();drawFormat.Alignment = StringAlignment.Center;g.DrawString(checkCode[k], drawFont, drawBrush, drawRect, drawFormat);}//画图片的前景噪音点for (int i = 0; i < 100; i++){int x = random.Next(image.Width);int y = random.Next(image.Height);image.SetPixel(x, y, Color.FromArgb(random.Next()));}//画图片的边框线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);Response.ClearContent();Response.ContentType = "image/Gif";Response.BinaryWrite(ms.ToArray());}finally{g.Dispose();image.Dispose();}}在其他页面调用:function reloadcode(im){document.getElementById("Img").src ="验证码.aspx?"+new Date;}<img src="验证码.aspx"id="Img"onclick="reloadcode(this)"style="width: 56px; height: 28px"/>法3、使用随机数方式,代码如下:private String GetRandomint(int codeCount){Random random = new Random();string min = "";string max = "";for (int i = 0; i < codeCount; i++){min +="1";max+="9";}return (random.Next(Convert.ToInt32(min),Convert.ToInt32( max)).ToString());}使用随机组合方式,代码如下:1.private string CreateRandomCode(int codeCount)2.{3.string allChar = "0,1,2,3,4,5,6,7,8,9";4.string[] allCharArray = allChar.Split(',');5.string randomCode = "";6.int temp = -1;7. Random rand = new Random();8.for (int i = 0; i < codeCount; i++)9. {10.if (temp != -1)11. {12. rand = new Random(i * temp * ((int)DateTime.Now.Ticks));13. }14.int t = rand.Next(9);15.if (temp == t)16. {17.return CreateRandomCode(codeCount);18. }19. temp = t;20. randomCode += allCharArray[t];21. }22.return randomCode;23.}数字+字母验证码的实现,代码如下:1.private string CreateRandomCode(int codeCount)2.{3.string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v, w,x,y,z";4.string[] allCharArray = allChar.Split(',');5.string randomCode = "";6.int temp = -1;7. Random rand = new Random();8.for (int i = 0; i < codeCount; i++)9. {10.if (temp != -1)11. {12. rand = new Random(i * temp * ((int)DateTime.Now.Ticks));13. }14.int t = rand.Next(61);15.if (temp == t)16. {17.return CreateRandomCode(codeCount);18. }19. temp = t;20. randomCode += allCharArray[t];21. }22.return randomCode;23.}汉字验证码的实现,代码如下:1./**/2./* 此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将3.四个字节数组存储在object数组中。
用ActionScript生成动态验证码
Marmei 已经 有 9 %以 上 的桌 面 系 统 的 浏 览 器 都 安 装 了 c o d a称 8
验证 码 具 有更 强 的 抗 识别 性 。
在 当前 实 际应 用 的 验 证码 技 术 中 ,主要 可 以分 为 图片 验证
码 、问答 式 验证 码 、语 音 验证 码 等 方 法 。其 中 , 图片 验证 码 方 式 最 为流 行 。 这种 方 法 是将 字 母 、数 字 、汉 字 等 各 种 字符 组 合 成 的 字符 串以 图片 形 式展 示 出来 ,要求 用 户 识 别 并 正 确输 入 图
目前 验 证码 自动 识 别技 术 已经 从 单 纯 的位 图点 阵 比较 发 展 为应
用 各 类 先进 识 别 算 法 、 自动 去 除 噪 音 、提 取 有 效 特征 的高 级程
序 。在抵 御 自动识 别 程 序 时 ,可 以看 到 图片 验证 码 自身 固 有 的
一
T lC m ue n u asA at,是 一 种 旨在 于 区分 计 算 机 e o p tr adH m n p r l s ) 和人 类 的 程序 算 法 ,这 种 程 序 必 须 能生 成 并 评 价 人类 能很 容 易 通过 但 计算 机 却 通 不过 的测 试 。 目前 大 量 的 网 站 已经 使 用 了验 证码 技 术 ,其 作 用 可 以表 现 在 以下 两 个 方 面 :首 先 ,增 强 网站 的安 全 性 ,通 过 随 机生 成 的 验 证码 来 保 障用 户 会话 的 唯一 性 和 不可 重 复性 。避 免 因为 用 户会 话 信 息 被 复 制 而造 成 的身 份 冒充 行为 。其 次 ,强 制用 户 参 与会 话 ,减 少 或 阻 止 因使 用 机 器 人程 序 而 产 生 的批 量 注册 账 号 、滥 发 信 息 、传播 垃 圾 邮件 等 问 题发
vb.net实现图片验证码功能
Response.ContentType = "image/Png"
Response.BinaryWrite(ms.ToArray())
g.Dispose()
Img.Dispose()
Response.End()
End Sub
ValidateCode(VNum) '根据Session生成图片
End Sub
'--------------------------------------------
'生成图象验证码函数
Sub ValidateCode(ByVal VNum)
Dim Img As System.Drawing.Bitmap
'--------------------------------------------
'函数名称:RndNum
'函数参数:VcodeNum--设定返回随机字符串的位数
ction RndNum(ByVal VcodeNum)
Dim Vchar As String = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z" '需要使用中文验证,可以修改这里和ValidateCode函数中的字体
</tr>
<tr>
<td valign="top">输入验证码:</td>
<td valign="top"><asp:textbox ID="txtValidateCode" runat="server" TextMode="SingleLine" /><font color="#FF0000" size="2">*区分大小写</font></td>
asp.net一般处理程序(.ashx)动态生成验证码案例。
⼀般处理程序(.ashx)动态⽣成验证码案例。
{使⽤⼀般处理程序动态⽣成验证码}1.新建WebSite项⽬,添加⼀般处理程序命名为 yzm.ashx,添加如下代码:public void ProcessRequest(HttpContext context){//将context.Response.ContentType = "text/plain";修改为context.Response.ContentType = "image/JPEG";context.Response.ContentType = "image/JPEG";using (System.Drawing.Bitmap bitmap =new System.Drawing.Bitmap(150, 50)){using (System.Drawing.Graphics grapgics =System.Drawing.Graphics.FromImage(bitmap)){//测试⽰例/*grapgics.DrawString("哈喽",new System.Drawing.Font("宋体", 20),System.Drawing.Brushes.Blue, new System.Drawing.PointF(0, 0));System.Drawing.Pen pen = (System.Drawing.Pen)System.Drawing.Pens.Red.Clone();pen.Width = 3;grapgics.DrawEllipse(pen, new System.Drawing.Rectangle(20, 20, 10, 10));bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);*///⽣成随机数Random random = new Random();int code = random.Next();string strCode = code.ToString();//存sessionHttpContext.Current.Session["code"] = strCode;grapgics.DrawString(strCode,new System.Drawing.Font("宋体", 20),System.Drawing.Brushes.Blue, new System.Drawing.PointF(0, 0));bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);}}//本⾝就有的context.Response.Write("Hello World");}2.新建webApplication。
在JSP页面中动态生成图片验证码的方法实例
在JSP页⾯中动态⽣成图⽚验证码的⽅法实例在JSP页⾯中动态⽣成图⽚验证码<%@ page language="java" pageEncoding="UTF-8"%><%@ pageimport="java.awt.*,java.awt.image.*,com.sun.image.codec.jpeg.*,java.util.*" %><%@ taglib /tags-bean">/tags-bean"prefix="bean" %><%@ taglib /tags-html">/tags-html"prefix="html" %><%@ taglib /tags-logic">/tags-logic"prefix="logic" %><%@ taglib /tags-tiles">/tags-tiles"prefix="tiles" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html:html lang="true"><head><html:base /><title>MyJsp.jsp</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css" rel="external nofollow" >--></head><body><h3>在jsp页⾯⽣成验证码</h3><hr/><%//out.clear();//response.setContentType("image/jpeg");//设置响应类型//response.addHeader("pragma","NO-cache");//response.addHeader("Cache-Control","no-cache");//response.addDateHeader("Expries",0);int width=400, height=30;//图⽚的⼤⼩(宽和⾼)//构架画布,第⼀个参数表⽰画布的宽,第⼆个参数表⽰画布的⾼,第三个参数的含义有待确定BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();//实例化画图对象//以下设置背景⾊g.setColor(Color.yellow);Font DeFont=new Font("宋体", Font.ITALIC, 20);g.setFont(DeFont);//将已经设置好的背景颜⾊填充到指定的画布区域g.fillRect(0,0, width, height);//置字体⾊g.setColor(Color.blue);int x=10,y=10,xl=550,yl=15;g.drawLine(x,y,x+xl,y+yl);//在画布中画椭圆形,参数为椭圆的坐标,⽤于确定椭圆的⼤⼩g.drawOval(0,10,200,10);//在画布上输出⽂字信息,第⼀个参数表⽰要显⽰的⽂字,第⼆和第三个参数表⽰起始点的X、Y坐标g.drawString("想要输出的⽂字-我是陈杉",70,20);g.dispose();ServletOutputStream outStream = response.getOutputStream();JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(outStream);encoder.encode(image);outStream.close();%></body></html:html>--将该⽂件保存为pic.jsp,该⽂件负责⽣成图⽚!如果要在其他的页⾯显⽰该图⽚只需要写上<img src="pic.jsp"/>仅此⼀句就ok了,适⽤于⽣成各种验证码!总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。
ASP .NET环境下利用GDI+实现图形验证码技术
面来实现 。此 页面可设计为一个 函数 , 两个过程 。其 中函数
用 于 产 生 随 机 数 , 过 程 用 于 将 随 机 数 图 形 化 , 成 图 形 一个 形 验 证 码 , 一 个 过 程 是 页 面 载 入 时 的 系 统 过 程 , 过 调 用 随 另 通 机 数 函 数 和 图形 验 证 码 过 程 实 现 随机 验 证 码 图 形 化 , 以供 用
户界面调用 。
完 整的 图形 验证码至 此 已经产生 , 着需要送往用 户界 接 面 以图像方式显 示 , 因此还有 必要将其保 存成 图像格 式。位 图 实例 的 S v ae方法 可将 图像转 换成 I gF r t 指 定 的 mae oma 类 图像格式 , P g等。 如 n 此 外 , DI G +还 包 括 对 多种 图 像 格 式 的 广 泛 支 持 , 如
ቤተ መጻሕፍቲ ባይዱ
随着 互联 网深 入应用 , 验证 码识别 技术 不断 提高 , 单 简 的随机 数字 或符 号字符 串验证 码 不断被 攻破 。如果 将验证
信 息 作 为 图像 信 息 显 示 在 we , b上 既可 以不 阻碍 合 法 用 户 登 录 , 使 非 法 攻 击 者 无 法 通 过 hml 索 获 得 验 证 信 息 , 而 又 t 搜 从 降 低 服 务 器 负 荷 , 证 合 法 用户 正 常 使 用 W e 面 。 保 b页 传 统 的 验 证 码 一 般 采 用 C 、S P 程 序 加 上 一 些 加 密 GIIA I
维普资讯
A P . E S N T
ASP.NET生成图形验证码的方法详解
本文实例讲述了生成图形验证码的方法。
分享给大家供大家参考,具体如下:通常生成一个图形验证码主要有3个步骤:(1)随机产生一个长度为N的随机字符串,N的值可由开发可由开发人员自行设置。
该字符串可以包含数字、字母等。
(2)将随机生成的字符串创建成图片,并显示。
(3)保存验证码。
新建一个页面为default.aspx, 放置一个TextBox控件和一个Image控件,TextBox 控件用于输入生成的字符串,Image控件用于显示字符串,它的图片就为生成的图形验证码imageUrl=“/default.aspx”;default.aspx页面的源代码为:<form id="form1" runat="server"> <div> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Image ID="Image1" imageUrl=“/default.aspx”runat="server" /> </div></form>图形验证码的代码为:using System;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;using System.Drawing;public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string validateNum = CreateRandomNum(4); CreateImage(validateNum); Session["ValidateNum"] = validateNum; } } //生产随机数 private string CreateRandomNum(int NumCount) { string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,O,P,Q,R,S,T,U,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,m,n,o,p,q,s, t,u,w,x,y,z"; string[] allCharArray = allChar.Split(',');//拆分成数组 string randomNum = ""; int temp = -1; //记录上次随机数的数值,尽量避免产生几个相同的随机数 Random rand = new Random(); for (int i = 0; i < NumCount; i++) { if (temp != -1) { rand = new Random(i*temp*((int)DateTime.Now.Ticks)); } int t = rand.Next(35); if (temp == t) { return CreateRandomNum(NumCount); } temp = t; randomNum += allCharArray[t]; } return randomNum; } //生产图片 private void CreateImage(string validateNum) { if (validateNum == null || validateNum.Trim() == string.Empty) return; //生成BitMap图像 System.Drawing.Bitmap image = new System.Drawing.Bitmap(validateNum.Length*12+12,22); Graphics g = Graphics.FromImage(image); try { //生成随机生成器 Random random = new Random(); //清空图片背景 g.Clear(Color.White); //画图片的背景噪音线 for (int 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,x2,y1,y2); } Font font = new System.Drawing.Font("Arial",12,(System.Drawing.FontStyle.Bold|System.Drawing.FontStyle.Ital ic)); System.Drawing.Drawing2D.LinearGradientBrush brush=new System.Drawing.Drawing2D.LinearGradientBrush(newRectangle(0,0,image.Width,image.Height),Color.Blue,Color.DarkRed,1.2f,true); g.DrawString(validateNum,font,brush ,2,2); //画图片的前景噪音点 for( int i=0;i<100;i++) { int x=random.Next(image.Width); int y=random.Next(image.Height); image.SetPixel(x,y,Color.FromArgb(random.Next())); } //画图片的边框线 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); Response.ClearContent(); Response.ContentType="image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } }}希望本文所述对大家程序设计有所帮助。
动态验证码原理范文
动态验证码原理范文动态验证码(Dynamic Verification Code)是一种用于身份验证和网站登录等场景下的安全验证机制。
与传统的静态验证码不同,动态验证码会在一定时间内自动更换,使攻击者很难通过截获、复制或重复利用验证码来进行恶意操作。
1.时间限制:动态验证码会在一定时间内失效,一般为数分钟到数十分钟不等。
这样做的目的是避免攻击者利用截获的验证码进行重复利用,因为验证码的时间戳已经过期。
2.动态生成:动态验证码会根据一定的算法和规则实时生成,如基于当前时间戳和随机数等生成。
生成的验证码会在用户请求时实时生成,并返回给用户进行验证。
3.单一使用:动态验证码一般只能使用一次,即使在时间限制内,再次使用同一个验证码也会被认为是无效的。
这样做的目的是防止攻击者利用截获的验证码进行多次重复操作。
4.强随机性:动态验证码的生成过程会引入随机因素,使得生成的验证码具有较高的随机性和不可预测性。
这样做的目的是增加攻击者破解验证码的难度,提高整体的安全性。
1.用户请求验证码:用户在网站登录或进行身份验证时,会向服务端发送请求获取验证码。
2.服务端生成验证码:服务端接收到用户请求后,会生成一个动态验证码。
生成过程一般包括以下几个步骤:-生成随机数:服务端生成一个随机数,作为验证码的一部分。
-生成时间戳:服务端生成一个时间戳,表示验证码的有效期。
-生成验证码:根据一定的算法和规则,将随机数和时间戳组合生成最终的验证码。
3.服务端发送验证码:服务端将生成的验证码发送给用户,一般通过短信方式发送到用户的手机上。
4.用户验证验证码:用户收到验证码后,输入到相应的验证界面进行验证。
5.服务端验证:服务端接收到用户输入的验证码后,进行验证。
验证过程一般包括以下几个步骤:-验证时间戳:服务端检查验证码的时间戳是否在有效期内。
-验证验证码:服务端验证用户输入的验证码是否与生成的验证码一致。
6.验证结果返回:服务端根据验证结果,返回给用户相应的验证通过或验证失败的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.net 生成gif动画验证码using System;using System.IO;using System.Web;using System.Drawing;//GIF验证码类public class Validate{//设置最少4位验证码private byte TrueValidateCodeCount = 4;public byte ValidateCodeCount{get { return TrueValidateCodeCount; }set{//验证码至少为3位if (value > 4)TrueValidateCodeCount = value;}}protected string ValidateCode = "";//是否消除锯齿public bool FontTextRenderingHint = false;//验证码字体public string ValidateCodeFont = "Arial";//验证码型号(像素)public float ValidateCodeSize = 13;public int ImageHeight = 23;//定义验证码中所有的字符public string AllChar = "1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";//获得随机四位数private void CreateValidate(){ValidateCode = "";//将验证码中所有的字符保存在一个字符串数组中string[] CharArray = AllChar.Split(',');int Temp = -1;//生成一个随机对象Random RandCode = new Random();//根据验证码的位数循环for (int i = 0; i < ValidateCodeCount; i++){//主要是防止生成相同的验证码if (Temp != -1){//加入时间的刻度RandCode = new Random(i * Temp * ((int)DateTime.Now.Ticks));}int t = RandCode.Next(35);if (Temp == t){//相等的话重新生成CreateValidate();}Temp = t;ValidateCode += CharArray[Temp];}//错误检测,去除超过指定位数的验证码if (ValidateCode.Length > TrueValidateCodeCount)ValidateCode = ValidateCode.Remove(TrueValidateCodeCount);}//生成一帧的BMP图象private void CreateImageBmp(out Bitmap ImageFrame){//获得验证码字符char[] CodeCharArray = ValidateCode.ToCharArray(0, ValidateCodeCount);//图像的宽度-与验证码的长度成一定比例int ImageWidth = (int)(TrueValidateCodeCount * ValidateCodeSize * 1.3 + 4);//创建一个长20,宽iwidth的图像对象ImageFrame = new Bitmap(ImageWidth, ImageHeight);//创建一个新绘图对象Graphics ImageGraphics = Graphics.FromImage(ImageFrame);//清除背景色,并填充背景色//Note:Color.Transparent为透明ImageGraphics.Clear(Color.White);//绘图用的字体和字号Font CodeFont = new Font(ValidateCodeFont, ValidateCodeSize, FontStyle.Bold);//绘图用的刷子大小Brush ImageBrush = new SolidBrush(Color.Red);//字体高度计算int FontHeight = (int)Math.Max(ImageHeight - ValidateCodeSize - 3, 2);//创建随机对象Random rand = new Random();//开始随机安排字符的位置,并画到图像里for (int i = 0; i < TrueValidateCodeCount; i++){//生成随机点,决定字符串的开始输出范围int[] FontCoordinate = new int[2];FontCoordinate[0] = (int)(i * ValidateCodeSize + rand.Next(1)) + 3;FontCoordinate[1] = rand.Next(FontHeight);Point FontDrawPoint = new Point(FontCoordinate[0], FontCoordinate[1]);//消除锯齿操作if (FontTextRenderingHint)ImageGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;elseImageGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;//格式化刷子属性-用指定的刷子、颜色等在指定的范围内画图ImageGraphics.DrawString(CodeCharArray[i].ToString(), CodeFont, ImageBrush, FontDrawPoint);}ImageGraphics.Dispose();}//处理生成的BMPprivate void DisposeImageBmp(ref Bitmap ImageFrame){//创建绘图对象Graphics ImageGraphics = Graphics.FromImage(ImageFrame);//创建铅笔对象Pen ImagePen = new Pen(Color.Red, 1);//创建随机对象Random rand = new Random();//创建随机点Point[] RandPoint = new Point[2];//随机画线for (int i = 0; i < 15; i++){RandPoint[0] = new Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));RandPoint[1] = new Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));ImageGraphics.DrawLine(ImagePen, RandPoint[0], RandPoint[1]);}ImageGraphics.Dispose();}//创建GIF动画private void CreateImageGif(){Bitmap ImageFrame;Kissogram.Drawing.Gif.AnimatedGifEncoder GifPic = new Kissogram.Drawing.Gif.AnimatedGifEncoder();MemoryStream BmpMemory = new MemoryStream();GifPic.Start();//确保视觉残留GifPic.SetDelay(5);//-1:no repeat,0:always repeatGifPic.SetRepeat(0);for (int i = 0; i < 20; i++){//创建一帧的图像CreateImageBmp(out ImageFrame);//生成随机线条DisposeImageBmp(ref ImageFrame);//输出绘图,将图像保存到指定的流ImageFrame.Save(BmpMemory,System.Drawing.Imaging.ImageFormat.Png);GifPic.AddFrame(Image.FromStream(BmpMemory));BmpMemory = new MemoryStream();}GifPic.OutPut(ref BmpMemory);HttpContext.Current.Response.ClearContent();//配置输出类型HttpContext.Current.Response.ContentType = "image/Gif";//输出内容HttpContext.Current.Response.BinaryWrite(BmpMemory.ToArray());BmpMemory.Close();BmpMemory.Dispose();}//输出验证码public void OutPutValidate(string ValidateCodeSession){CreateValidate();CreateImageGif();//把生成的验证码输入到SESSIONHttpContext.Current.Session[ValidateCodeSession] = ValidateCode;}}加水印的代码:public static Bitmap WaterMarkWithText(System.Drawing.Bitmap origialGif, string text,string filePath){//用于存放桢List frames = new List();//如果不是gif文件,直接返回原图像if (origialGif.RawFormat.Guid != System.Drawing.Imaging.ImageFormat.Gif.Guid){return origialGif;}//如果该图像是gif文件foreach (Guid guid in origialGif.FrameDimensionsList){System.Drawing.Imaging.FrameDimension frameDimension = new System.Drawing.Imaging.FrameDimension(guid);int frameCount = origialGif.GetFrameCount(frameDimension);for (int i = 0; i < frameCount; i++){if (origialGif.SelectActiveFrame(frameDimension, i) == 0){int delay = Convert.ToInt32(origialGif.GetPropertyItem(20736).Value.GetValue(i));Image img = Image.FromHbitmap(origialGif.GetHbitmap());Font font = new Font(new FontFamily("宋体"), 35.0f,FontStyle.Bold);Graphics g = Graphics.FromImage(img);g.DrawString(text, font, Brushes.BlanchedAlmond, new PointF(10.0f, 10.0f));Frame frame = new Frame(img, delay);frames.Add(frame);}}ponents.AnimatedGifEncoder gif = new ponents.AnimatedGifEncoder();gif.Start(filePath);gif.SetDelay(100);gif.SetRepeat(0);for (int i = 0; i < frames.Count; i++){gif.AddFrame(frames[i].Image);}gif.Finish();try{Bitmap gifImg = (Bitmap)Bitmap.FromFile(filePath);return gifImg;}catch{return origialGif;}}return origialGif;}Bitmap bmp = new Bitmap(100, 100);Graphics g = Graphics.FromImage(bmp);Font f = new Font("arial", 11f);Brush b = Brushes.Blue;string txt = "Rotate text animation!";SizeF sz = g.MeasureString(txt, f);g.Clear(Color.WhiteSmoke);g.DrawString(txt, f, b, 50-sz.Width/2, 50-sz.Height/2);g.Flush();GifImage.GifAnimation gif = new GifImage.GifAnimation(bmp,GifImage.GraphicControlExt.Default);gif.Application = GifImage.ApplicationExt.Default;eGlobalColorTableOnly = true;for (int i = 1; i < 36; ++i){g.Clear(Color.WhiteSmoke);g.TranslateTransform(50,50);g.RotateTransform(10f * i);g.DrawString(txt, f, b, sz.Width/-2, sz.Height/-2);g.ResetTransform();g.DrawString("Hello", f, Brushes.Red, -50 + i * 4, 20);g.DrawString("Yeah", f, Brushes.Orange, 60, -20+i*4);g.Flush();gif.AddFrame(bmp);}f.Dispose();g.Dispose();bmp.Dispose();FileStream fs = new FileStream(@"E:\vmlinux\out.gif", FileMode.Create); gif.Save(fs);fs.Close();Console.WriteLine("{0}x{1}", gif.Screen.Width, gif.Screen.Height);。