php验证码生成器

现在很多网站都有实现用户集。然而为了防止机器人的网络攻击。限制登陆或者注册是有必要的。

在注册和登陆时强制要求输入一个机器难以识别的字符串集是一个不错的选择。虽然不能解决根本问题,但至少可以增加他们的成本。

利用PHP生成验证码需要用到GD2库。GD2库引用方法网络上有很多,不同操作系统导入方式也不同。

这段代码运行在WINDOS服务器平台。

  1. <?php
  2. $iC=newidCode(5,60,30);
  3. $iC->createPNG();
  4. classidCode{
  5. private$words=array('a','b',
  6. 'c','d','e','f','g','h','i','j','k','l',
  7. 'm','n','o','p','q','r','s','t','u','v',
  8. 'w','x','y','z','A','B','C','D','E','F',
  9. 'G','H','I','J','K','L','M','N','O','P',
  10. 'Q','R','S','T','U','V','W','X','Y','Z',
  11. Ɔ',Ƈ',ƈ',Ɖ',Ɗ',Ƌ',ƌ',ƍ',Ǝ',Ə');
  12. private$fonts;
  13. private$count;//验证码字符数
  14. private$height;
  15. private$width;
  16. private$path='..\myfolder\fonts'
  17. private$keys;
  18. //构造函数
  19. publicfunction__construct($count,$width,$height){
  20. $this->count=$count;
  21. $this->getFonts();
  22. $this->height =$height;
  23. $this->width =$width;
  24. }
  25. privatefunctiongetFonts(){
  26. $dir= dir($this->path);
  27. while(false !== ($file=$dir->read())){
  28. if($file!='.'&&$file!='..'){
  29. $this->fonts[count($this->fonts)] =basename($file);
  30. }
  31. }
  32. $dir->close();
  33. }
  34. privatefunctioncreateKeys(){
  35. for($i= 0;$i<$this->count;$i++){<!--$this--->
  36. $this->keys[$i]['char'] =$this->words[rand(0,count($this->words)-1)];
  37. //使用字体路径标识
  38. $this->keys[$i]['filename'] =$this->path.'\\'.$this->fonts[rand(0,count($this->fonts)-1)];
  39. }
  40. }
  41. publicfunctioncreatePNG(){
  42. $this->createKeys();
  43. //创建画布以及颜色块儿
  44. $bg= imagecreatetruecolor($this->width + 10*2,$this->height + 3*2);//两边留10px空白,上下3px
  45. $grey= imagecolorallocate($bg,155,155,155);
  46. $blue= imagecolorallocate($bg,0x00,0x00,0xff);
  47. //填充背景
  48. imagefill($bg,0,0,$grey);
  49. //添加字符
  50. $pwidth=$this->width/$this->count;
  51. $x;$y;
  52. for($i= 0;$i<$this->count;$i++){<!--$this--->
  53. $rotation= rand(-40,40);//偏转角度±40°
  54. $fontsize= 33;
  55. $width_txt;
  56. $height_txt;
  57. do{
  58. $fontsize--;
  59. $bbox= imagettfbbox($fontsize,$rotation,$this->keys[$i]['filename'],$this->keys[$i]['char']);
  60. $width_txt=$bbox[2] -$bbox[0];//x 0 2 4 6,y1 3 5 7;左下,右下,右上,左上
  61. $height_txt=$bbox[7] -$bbox[1];
  62. }while($fontsize> 8 && ($height_txt>$this->height ||$width_txt>$pwidth));
  63. $fontcolor= imagecolorallocate($bg,rand(0,255),rand(0,255),rand(0,255));
  64. $x= 8 +$pwidth*$i+$pwidth/2 -$width_txt/2;//x坐标基本位置
  65. $y=$this->height/2 -$height_txt/2;
  66. imagettftext($bg,$fontsize,$rotation,$x,$y,$fontcolor,$this->keys[$i]['filename'],$this->keys[$i]['char']);
  67. }
  68. //绘制干扰线
  69. //根据字体酌情增加干扰线
  70. imageline($bg,0,15,40,10,$blue);
  71. //图像输出头文件
  72. header('Content-type:image/png');
  73. //输出png图像
  74. imagepng($bg);
  75. //清除缓存资源
  76. imagedestroy($bg);
  77. }
  78. publicfunctioncheckKeys($input){
  79. if(count($input)!=$this->count){
  80. return'ERROR:长度不正确.'
  81. }else{
  82. for($i=0;$i<$this->count;$i++){<!--$this--->
  83. //0 o O I l 1 校准,根据所选择的字体确定是否需要手动校准
  84. if($input[$i] !=$this->keys[$i]['char']){
  85. return'SUCCESS.'
  86. }else{ //phpfensi.com
  87. return'ERROR:请输入正确验证码.'
  88. }
  89. }
  90. }
  91. }
  92. }
  93. ?>