zoukankan      html  css  js  c++  java
  • PHP 动态生成验证码

    ……机器人会在网站中搜寻允许他们插入广告的输入表单,在虚拟世界没有什么能阻挡它们胡作非为。这些机器人效率极高,完全不关心所攻击的表单的本来用途。它们唯一的目标就是用它们的垃圾广告覆盖你的内容,残忍地为它们的主人谋取广告收入。

    要检验一个表单所面对的是一个真正的人,这种测试称为CAPTCHA(完全自动化公共图灵测试)。目前最有效的方法是生成一个要求用户输入的随机通行短语,为了防止支持OCR(光学字符识别)的机器人破解系统,通行短语字母必须变形,或者用随机的直线和点进行部分模糊处理。

    /* 生成验证码序列 */
    define("CAPTCHA_NUMCHARS", 6);  //验证码长度
    $pass_phrase = "";              //验证码内容
    for ($i = 0; $i < CAPTCHA_NUMCHARS; $i++) {
        //随机生成字母添加至验证码
        $pass_phrase .= chr(rand(97, 122));
    }
    
    /* 生成验证码图像 */
    define("CAPTCHA_WIDTH", 300);    //验证码宽度
    define("CAPTCHA_HEIGHT", 100);    //验证码高度
    //创建空白画布
    $img = imagecreatetruecolor(CAPTCHA_WIDTH, CAPTCHA_HEIGHT);
    //设置主题颜色
    $bg_color = imagecolorallocate($img, 225, 225, 225);       //白色背景
    $text_color = imagecolorallocate($img, 0, 0, 0);           //黑色字体
    $graphic_color = imagecolorallocate($img, 64, 64, 64);     //灰色图像
    //填充背景
    imagefilledrectangle($img, 0, 0, CAPTCHA_WIDTH, CAPTCHA_HEIGHT, $bg_color);
    //绘制随机直线
    for ($i = 0; $i < 10; $i++) {
        imageline($img, 0, rand() % CAPTCHA_HEIGHT, CAPTCHA_WIDTH, rand() % CAPTCHA_HEIGHT, $graphic_color);
    }
    //绘制随机点
    for ($i = 0; $i < 20; $i++) {
        imagefilledellipse($img, rand() % CAPTCHA_WIDTH, rand() % CAPTCHA_HEIGHT, 10, 10, $graphic_color);
    }
    //绘制验证码
    imagettftext($img, 60, 0, 20, CAPTCHA_HEIGHT - 20, $text_color, "C:/Windows/Fonts/SketchFlow Print.ttf", $pass_phrase);
    //作为PNG图像输出
    header("Content-type: image/png");
    imagepng($img);
    //从内存从撤销图像
    imagedestroy($img);

    使用PHP动态生成的图像并不存储在一个文件中,实际上,imagepng() 函数会在服务器的内存中生成一个二进制PNG图像,然后把它直接通过一个首部传送到浏览器。

    正因如此可以直接把PHP脚本放置在 <img> 标记的 src 属性中:<img src = "CAPTCHA.php"/>

  • 相关阅读:
    [读书笔记]子查询
    [读书笔记]SQL约束
    [转载]NoSQL数据库的基础知识
    利用C#实现对excel的写操作
    [转载]SQL Server内核架构剖析
    利用花生壳和IIS发布网页过程
    [读书笔记]ASP.NET的URL路由引擎
    [翻译]比较ADO.NET中的不同数据访问技术(Performance Comparison:Data Access Techniques)
    [正则表达式]基础知识总结
    CF623E Transforming Sequence
  • 原文地址:https://www.cnblogs.com/woider/p/5491662.html
Copyright © 2011-2022 走看看