登入验证码的点点滴滴

只要在网上注册过账户,一定都知道验证码。
具体是如何实现的呢?这几天一直在搞,现在分享给大家。
1. 验证码介绍
因为你的WEB站有时会碰到客户机恶意攻击,其中一种很常见的攻击手段就是 身份欺骗_它通过 在客户端脚本写入一些代码,然后利用其,客户机在网站,论坛反复登陆,或者攻击者创建一个HTML窗体,其窗体如果包含了你注册窗体或发帖窗体等相同的字段,然后利用"http-post"传输数据到服务器,服务器会 执行相应的创建帐户,提交垃圾数据等操作,如果服务器本身不能有效验证并拒绝此非法操作,它会很严重耗费 其系统资源,降低网站性能甚至使程序崩溃. 而现在流行的判断访问WEB程序是合法用户还是恶意操作的方式,就是采用 一种叫 "字符校验"的技术. WEB网站像现在的动网论坛,他采用达到方法是为客户提供一个包含随即字符串的图片,用户必须读取 这些字符串,然后随 登陆窗体或者发帖窗体等用户创建的窗体一起提交. 因为人的话,可以很容易读出图片中的数字,但如果是一段客户端攻击代码,通过一般手段是很难识别验证码的 这样可以确保当前访问是来自一个人而非机器. 
验证码:就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。 
作用: 
验证码一般是防止有人利用机器人自动批量注册、对特定的注册用户用特定程序暴力破解方式进行不断的登陆、灌水。因为验证码是一个混合了数字或符号的图片,人眼看起来都费劲,机器识别起来就更困难。像百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生
常见的验证码 
1>四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。 
2>CSDN网站用户登录用的是GIF格式,目前常用的随机数字图片验证码。图片上的字符比较中规中矩,验证作用比上一个好。没有基本图形图像学知识的人,不可破!可惜读取它的程序,在CSDN使用它的第一天,好像就在论坛里发布了,真是可怜! 
3>QQ网站用户登录用的是PNG格式,图片用的随机数字+随机大写英文字母,整个构图有点张扬,每刷新一次,每个字符还会变位置呢!有时候出来的图片,人眼都识别不了,厉害啊… 
4>MS的hotmail申请时候的是BMP格式, 随机数字+随机大写英文字母+随机干扰像素+随机位置。 
5>Google的Gmail注册时候的是JPG格式,随机英文字母+随机颜色+随机位置+随机长度。 
6>其他各大论坛的是XBM格式,内容随机
2.代码分析
大家看了上面的之后,会对验证码有一个大体的了解,其实web初期,是没有这个东西的,后来有了攻击,就出现这个技术了。
我自己写了一个简单的图片验证。基于jsp的,可以随即产生数字和字符。4位。
代码如下:
package encrypt.dbOperate;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
public class IdidentifyCode {
   private int width = 100;
   private int height = 50;
   private String code= "none";
  
   public IdidentifyCode(){}
   public void createImage(){
    StringBuffer code = new StringBuffer();
     for( int i=0;i<4;i++)
      code.append(provideChar());
    setCode(code.toString());
    BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
    Graphics g = image.getGraphics();
    g.setColor( new Color(255,255,255));
    g.setFont( new Font( "Times New Roman", Font.PLAIN, 18));
    g.drawString(code.toString(), 0, 0);
    g.fillRect(0, 0, width, height);
    
    g.setColor(Color.red);
    g.drawRect(1, 1, width-2,height-2);
    
    g.setColor(Color.black);
    g.setFont( new Font( "Times New Roman",Font.BOLD+Font.ITALIC,24));
    g.drawString(code.toString(), width/4, height*3/4);
    Random rand = new Random();
     for( int i=0;i<80;i++)
      g.drawOval(rand.nextInt(width), rand.nextInt(height),0,0);
    g.dispose();
     try {
      ImageIO.write(image, "JPEG", new File( "F:/Java/Program/EncryptDbSystem/WebRoot/images/code.jpg"));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
   public String getCode() {
     return code;
  }
   public void setCode(String code) {
     this.code = code;
  }
   private char provideChar() {
    Random random = new Random();
     return intToChar(random.nextInt(61));
  }
   public char intToChar( int num){
     if(num>=0&&num<=9)
       return ( char)(num+'0');
     else if(num>=10&&num<=35)
       return ( char)(num+55);
     else
       return ( char)(num+61);
  }
}

jsp中
<%    IdidentifyCode ic = new IdidentifyCode();
    ic.createImage();
    session.setAttribute( "IdientifyCode",ic.getCode());
      %>
我的框架是struts1.3。

你可能感兴趣的:(职场,验证码,休闲)