这两天在处理一个关于验证码的东西,因为有一些机器人在捣鬼。对于现在流行的框架而言都是系统集成了,直接实例化就OK,不用去管什么session的存储之类的琐事。

但是,璞玉目前所接手的框架是SAF,有些年头的东西了。之前写过一篇关于《细说SAF框架》 有兴趣的可以看看。

验证码,这个东西现在哪儿都有,说说运行的流程吧。首先当用户请求HTTP的时候,服务器端就创建一个唯一的sessionid,这个是session会话ID,然后就去启动GD库或者imagemagick这些画图工具,把程序生成的随机的字符写到一张图片里面,然后显示到客户端,供用户查看。同时会利用这个唯一的sessionID来保存我们的验证码内容,当用户提交验证码的时候,程序会根据之前保存在session里面的内容取出来,跟表单提交的进行对比,看是否一直,如果一样,那么就继续去判断其他的选项。如果都OK,那就就注册成功了。

下面就开始详细讲下php结合GD库生成验证码的例子:

php验证码

演示地址:http://www.pooy.net/captcha/
下载地址:http://pan.baidu.com/share/link?shareid=517762&uk=3240790330

解压密码:djfdskfdi43j4jruu4

  • 新建一个PHP文件captcha_code_file.php
  • //首先开启session
    session_start();
    //定义前台显示验证码长&宽
    $image_width = 120;
    $image_height = 40;
    $characters_on_image = 6;
    $font = './monofont.ttf';
    
    //The characters that can be used in the CAPTCHA code.
    //avoid confusing characters (l 1 and i for example)
    $possible_letters = '23456789bcdfghjkmnpqrstvwxyz';
    $random_dots = 10;
    $random_lines = 30;
    $captcha_text_color="0x142864";
    $captcha_noice_color = "0x142864";
    //定义要生成验证码的字符串
    $code = '';
    
    $i = 0;
    while ($i < $characters_on_image) { 
    $code .= substr($possible_letters, mt_rand(0, strlen($possible_letters)-1), 1);
    $i++;
    }
    
    $font_size = $image_height * 0.75;
    $image = @imagecreate($image_width, $image_height);
    
    /* setting the background, text and noise colours here */
    $background_color = imagecolorallocate($image, 255, 255, 255);
    
    $arr_text_color = hexrgb($captcha_text_color);
    $text_color = imagecolorallocate($image, $arr_text_color['red'], 
            $arr_text_color['green'], $arr_text_color['blue']);
    
    $arr_noice_color = hexrgb($captcha_noice_color);
    $image_noise_color = imagecolorallocate($image, $arr_noice_color['red'], 
            $arr_noice_color['green'], $arr_noice_color['blue']);
    
    /* generating the dots randomly in background */
    for( $i=0; $i<$random_dots; $i++ ) {
    imagefilledellipse($image, mt_rand(0,$image_width),
     mt_rand(0,$image_height), 2, 3, $image_noise_color);
    }
    
    /* generating lines randomly in background of image */
    for( $i=0; $i<$random_lines; $i++ ) {
    imageline($image, mt_rand(0,$image_width), mt_rand(0,$image_height),
     mt_rand(0,$image_width), mt_rand(0,$image_height), $image_noise_color);
    }
    
    /* create a text box and add 6 letters code in it */
    $textbox = imagettfbbox($font_size, 0, $font, $code); 
    $x = ($image_width - $textbox[4])/2;
    $y = ($image_height - $textbox[5])/2;
    imagettftext($image, $font_size, 0, $x, $y, $text_color, $font , $code);
    
    /* Show captcha image in the page html page */
    header('Content-Type: image/jpeg');// defining the image type to be shown in browser widow
    imagejpeg($image);//showing the image
    imagedestroy($image);//destroying the image instance
    //设置session,做验证
    $_SESSION['6_letters_code'] = $code;
    
    function hexrgb ($hexstr)
    {
      $int = hexdec($hexstr);
    
      return array("red" => 0xFF & ($int >> 0x10),
                   "green" => 0xFF & ($int >> 0x8),
                   "blue" => 0xFF & $int);
    }
  •  显示验证码页面index.php

 

  • &lt;?php
    session_start();
    if(isset($_REQUEST['Submit'])){
        // code for check server side validation
        if(empty($_SESSION['6_letters_code'] ) ||
            strcasecmp($_SESSION['6_letters_code'], $_POST['6_letters_code']) != 0)
        {  
            $msg="您输入的验证码有误,请重新输入!";
        }else{
            echo "您输入的是正确的!";
            // Captcha verification is Correct. Final Code Execute here!
        }
    }    
     ?&gt;
    
    &lt;style type="text/css"&gt;
    .table{
        font-family:Arial, Helvetica, sans-serif;
        font-size:12px;
        color:#333;
        background-color:#E4E4E4;    
    }
    .table td{
        <a href="http://www.coinstar-money.com/coinstar/sri_lanka/1907_kinniya.html">Coinstar Money point</a>  background-color:#F8F8F8;     
    }
    &lt;/style&gt;
    
    &lt;form action="" method="post" name="form1" id="form1" &gt;
      &lt;table width="400" border="0" align="center" cellpadding="5" cellspacing="1"&gt;
    &lt;?php if(isset($msg)){?&gt;
        &lt;tr&gt;
          &lt;td colspan="2" align="center" valign="top"&gt;&lt;?php echo $msg;?&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;?php } ?&gt; 
        &lt;tr&gt;
          &lt;td align="right" valign="top"&gt; 验证码Demo:&lt;/td&gt;
          &lt;td&gt;&lt;img src="captcha_code_file.php?rand=&lt;?php echo rand(0,20);?&gt;" id='captchaimg'  onclick="refreshCaptcha();" &gt;&lt;br&gt;
            &lt;label for='message'&gt;请输入验证码:&lt;/label&gt;
            &lt;br&gt;
            &lt;input id="6_letters_code" name="6_letters_code" type="text"&gt;
            &lt;br&gt;
            如果看不到,请 &lt;a href='javascript: refreshCaptcha();'&gt;点我&lt;/a&gt; 刷新一下!
            &lt;/p&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;td&gt;&amp;nbsp;&lt;/td&gt;
          &lt;td&gt;&lt;input name="Submit" type="submit" onclick="return validate();" value="Submit"&gt;&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    &lt;/form&gt;
    &lt;script type='text/javascript'&gt;
    //定义的刷新请求
    function refreshCaptcha()
    {
        var img = document.images['captchaimg'];
        img.src = img.src.substring(0,img.src.lastIndexOf("?"))+"?rand="+Math.random()*1000;
    }
    &lt;/script&gt;

以上文件及字体都会打包,方便大家测试。

上面这个验证码是以GD库扩展来实现的,测试前,要保证你的服务器安装了GD库,怎么查看你的服务器是否启用了GD库扩展呢?直接写一个php脚本:

<? phpinfo();?>

然后放在你的网站根目录下直接访问就行。如果没有安装好GD库,请移步:《如何给linux服务器安装GD扩展库》。

如果出现:Warning: session_start() [function.session-start]…… 可以移步到:《解决Warning: session_start() [function.session-start]……

 

演示地址:http://www.pooy.net/captcha/
下载地址:
http://pan.baidu.com/share/link?shareid=517762&uk=3240790330

解压密码:djfdskfdi43j4jruu4

有任何问题请留言,一起交流。

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="">

请选择吧!