PHP实现图片登录验证码的解决方案

简介: PHP实现图片登录验证码的解决方案

PHP实现图片登录验证码的解决方案

HTML代码

    <div class="login">
        <p><input type="text" id="username" name="username" placeholder="用户名" autocomplete="off"></p>
        <p><input type="password" id="password" name="username" placeholder="密码" autocomplete="off"></p>
        <p><input type="text" id="captcha" name="captcha" placeholder="验证码" maxlength="4" autocomplete="off"></p>
        <p><img src="?m=Login&a=loginAccess&act=getCode" id="getCode" alt="" title="点击刷新验证码"></p>
        <p><button id="loginBtn">登录</button></p>
    </div>


刷新图片

        $("#getCode").click(function () {
            $(this).attr("src", '?m=Login&a=loginAccess&act=getCode&' + Math.random());
        });


生成验证码和图片

    case "getCode";
        require_once "libs/vcode.class.php";
        $obj = new vcode();//实例化;
        SetCookie("authcode", $obj->authcode, time() + 30, "/");
        die($obj->output());
        break;


验证码类库

class vcode
{
    public $authcode = '';                            //验证码
    private $width = '';                            //验证码图片宽
    private $height = '';                            //验证码图片高
    private $len = '';                            //验证码长度
    private $tilt = array(-30, 30);                //验证码倾斜角度
    private $font = 'AlteHaasGroteskBold.ttf';    //字体文件
    private $str = '';                            //验证码基
    private $im = '';                            //生成图片的句柄
    //构造函数,生成验证码。
    function __construct($width = 100, $heigh = 40, $len = 4)
    {
        $this->width = $width;
        $this->height = $heigh;
        $this->len = $len;
        //$this->str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
        $this->str = '0123456789';
        $str_len = strlen($this->str) - 1;
        for ($i = 0; $i < $len; $i++) {
            $this->authcode .= $this->str[rand(0, $str_len)];
        }
    }
    //创建图片
    private function imagecreate()
    {
        $this->im = imagecreatetruecolor($this->width, $this->height);
    }
    //干扰颜色
    private function ext_color()
    {
        return imagecolorallocate($this->im, rand(50, 180), rand(50, 180), rand(50, 180));
    }
    //创建干扰点
    private function ext_point()
    {
        for ($i = 0; $i < $this->width * 2; $i++) {
            imagesetpixel($this->im, rand(1, $this->width - 1), rand(1, $this->height - 1), $this->ext_color());
        }
    }
    //创建干扰线
    private function ext_line()
    {
        for ($i = 0; $i < $this->len; $i++) {
            $x1 = rand(1, $this->width - 1);
            $y1 = rand(1, $this->height - 1);
            $x2 = rand(1, $this->width - 1);
            $y2 = rand(1, $this->height - 1);
            imageline($this->im, $x1, $y1, $x2, $y2, $this->ext_color());
        }
    }
    //把验证码写入图片(不能和$this->imgstrfloat()同时使用)
    private function imgstr()
    {
        $old_x = 1;
        for ($i = 0; $i < $this->len; $i++) {
            $fontsize = rand(2, 5);        //字体大小
            $tmp_1 = $fontsize * 2.5;
            $tmp_2 = $i > 0 ? $tmp_1 : 0;
            $y = rand(1, $this->height / 2);
            $x = rand($old_x + $tmp_2, ($i + 1) * ($this->width) / $this->len - $tmp_1);
            $old_x = $x;
            $color = imagecolorallocate($this->im, rand(200, 255), rand(200, 255), rand(200, 255));
            imagestring($this->im, $fontsize, $x, $y, $this->authcode[$i], $color);
        }
    }
    //把验证码倾斜写入图片(不能和$this->imgstr()同时使用)
    private function imgstrfloat()
    {
        $old_x = 1;
        for ($i = 0; $i < $this->len; $i++) {
            $fontfloat = rand($this->tilt[0], $this->tilt[1]);
            $fontsize = rand(10, 15);        //字体大小
            $tmp_1 = $i > 0 ? $fontsize : 0;
            $y = rand($fontsize + 2, $this->height - 2);
            $x = rand($old_x + $tmp_1 + 2, ($i + 1) * ($this->width) / $this->len - $fontsize - 2);
            $old_x = $x;
            $color = imagecolorallocate($this->im, rand(200, 255), rand(200, 255), rand(200, 255));
            imagettftext($this->im, $fontsize, $fontfloat, $x, $y, $color, $this->font, $this->authcode[$i]);
        }
    }
    //输出图片
    public function output()
    {
        $this->imagecreate();
        $this->imgstr();
        //$this->imgstrfloat();
        $this->ext_point();
        $this->ext_line();
        header('content-type:image/png');
        imagepng($this->im);
        imagedestroy($this->im);
    }
}


@lockdata.cn

相关文章
|
3月前
|
SQL PHP 数据安全/隐私保护
php登录功能(可以判断谁登录的呢)注册粗暴解决
php登录功能(可以判断谁登录的呢)注册粗暴解决
php登录功能(可以判断谁登录的呢)注册粗暴解决
|
13天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
1月前
|
存储 PHP Apache
使用CFimagehost源码搭建无需数据库支持的PHP免费图片托管私人图床
使用CFimagehost源码搭建无需数据库支持的PHP免费图片托管私人图床
|
2月前
|
安全 PHP 数据库
从建站打拿站 -- PHP(登录和注册)
从建站打拿站 -- PHP(登录和注册)
15 1
|
3月前
|
PHP 数据安全/隐私保护
|
3月前
|
SQL PHP 数据库
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)