PHP 实现验证码

来源:互联网 发布:阿里云 招聘 安全 编辑:程序博客网 时间:2024/06/08 03:12

绘制验证码类

<?phpclass Captcha {    const CODE_LENGTH = 4;  // 验证码长度固定为 4,可以根据实际需要修改    const LINE_COUNT = 4;   // 干扰线个数    const DOT_COUNT = 200;  // 干扰点个数    // 验证码备选字符    static $CANDIDATES = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";    public function __construct($width, $height) {        $this->width = $width;        $this->height = $height;        // 创建图像对象        $this->image = imagecreatetruecolor($width, $height);        // 创建验证码        $this->generateCaptchaCode();    }    public function __destruct() {        // 销毁图像对象        imagedestroy($this->image);    }    public function paint() {        // 绘制背景        $this->paintBackground();        // 绘制验证码        $this->paintText();        // 绘制干扰        $this->paintDirty();    }    public function output() {        // 设置头部为PNG图片        header('Content-Type: image/png');        // 输出到浏览器        imagepng($this->image);    }    public function code() {        return $this->code;    }    private function paintBackground() {        // 背景颜色设置为白色        $color = imagecolorallocate($this->image, 255, 255, 255);        // 填充背景        imagefill($this->image, 0, 0, $color);    }    private function paintText() {        // 遍历验证码,一个字符一个字符地绘制        for ($i = 0; $i < strlen($this->code); ++$i) {            $fontsize = 6;            $color = imagecolorallocate($this->image, rand(0,50), rand(0,50), rand(0,50));            $x = ($i * 100 / self::CODE_LENGTH) + rand(5, 10);            $y = rand(5, 10);            imagestring($this->image, $fontsize, $x, $y, $this->code[$i], $color);        }    }    private function paintDirty() {        // 绘制点        for ($i = 0; $i < self::DOT_COUNT; ++$i) {            // 点的颜色            $pointcolor = imagecolorallocate($this->image, rand(100,200), rand(100,200), rand(100,200));                // 画点            imagesetpixel($this->image, rand(1,99), rand(1,29), $pointcolor);        }        // 绘制线条        for ($i = 0; $i < self::LINE_COUNT; $i++) {            // 线的颜色            $linecolor = imagecolorallocate($this->image, rand(100,200), rand(100,200), rand(100,200));            // 画线            imageline($this->image, rand(1,$this->width-1), rand(1,29), rand(1,99), rand(1,29), $linecolor);        }    }    private function generateCaptchaCode() {        // 从备选字符串中随机选取字符        for ($i = 0; $i < self::CODE_LENGTH; ++$i) {            $len = strlen(self::$CANDIDATES);            $pos = rand(0, $len - 1);            $ch = self::$CANDIDATES[$pos];            $this->code .= $ch;        }    }    private $image = NULL;  // 图像对象    private $code = "";     // 验证码    private $width = 0;     // 图像长度    private $height = 0;    // 图像宽度}?>

绘制图片页面

<?phpsession_start();  // 开启 Session,必须是第一句require_once "./Captcha.php";$captcha = new Captcha(100, 30);  // 创建对象$_SESSION['captcha'] = $captcha->code();  // 将验证码存入Session$captcha->paint();  // 绘制$captcha->output();  // 输出?>

表单页面

<?phpsession_start();  // 开启Session,必须是第一句?><!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>提交页面</title>    <script>        function validate_form(form) {            with (form) {                if (captcha.value == null || captcha.value == "") {                    alert("验证码不能为空!");                    return false;                }            }            return true;        }    </script></head><body>    <form method="post" action="./validate.php" onsubmit="return validate_form(this)">            验证码:<input type="text" name="captcha" value="" size=10>            <img title="点击刷新" id="captchaImg" border="1" src="./captchaImage.php"                onclick="this.src='./captchaImage.php?r=' + Math.random();"></img><br>            <input type="submit"/>    </form></body></html>

验证页面

<?phpsession_start();  // 开启Session,必须是第一句?><!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>验证页面</title></head><body>    <?php    if (isset($_POST['captcha']) && strcasecmp($_POST['captcha'], $_SESSION['captcha']) == 0) {        echo "Succeeded!";    } else {        ec`o "Failed!";    }    ?></body></html>

运行结果

查看运行结果