PHP는 그래픽 인증 코드를 생성합니다(강화된 간섭 유형).

安安杰尼
풀어 주다: 2023-04-08 15:16:01
원래의
195679명이 탐색했습니다.

인증 코드 사용 시나리오

시스템 개발 과정에서 기본적으로 모든 시스템에는 로그인 모듈이 포함됩니다. 인증 코드 기능은 이에 없어서는 안될 부분이며 시스템 폭발을 방지하는 효과적인 방법입니다. 악마는 길만큼 높다는 속담처럼 요즘에는 인증코드가 점점 더 복잡해지고 고급화되고 있습니다. 이 도움말에서는 간단한 영숫자 인증 코드를 자세히 설명합니다.

Code

<?php

/*********************************************************************************
 * InitPHP 3.8.2 国产PHP开发框架   扩展类库-验证码
 *-------------------------------------------------------------------------------
 * 版权所有: CopyRight By initphp.com
 * 您可以自由使用该源码,但是在使用过程中,请保留作者信息。尊重他人劳动成果就是尊重自己
 *-------------------------------------------------------------------------------
 * Author:zhuli Dtime:2014-11-25
 ***********************************************************************************/
class Code
{

    private $charset = "abcdefghjklmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";   //随机因子
    private $code;     //验证码文字
    private $codelen = 4;    //验证码显示几个文字
    private $width = 100;   //验证码宽度
    private $height = 40;   //验证码高度
    private $img;       //验证码资源句柄
    private $font;     //指定的字体
    private $fontsize = 20;  //指定的字体大小
    private $fontcolor;     //字体颜色  随机

    //构造类  编写字体
    public function __construct()
    {
        $this->font = &#39;/outputs/font/font.ttf&#39;;
    }

    //创建4个随机码
    private function createCode()
    {
        $_leng = strlen($this->charset) - 1;
        for ($i = 1; $i <= $this->codelen; $i++) {
            $this->code .= $this->charset[mt_rand(0, $_leng)];
        }
//        session_start();
//        $_SESSION[&#39;VerifyCode&#39;] = strtolower($this->code);
        Session::set(&#39;VerifyCode&#39;, strtolower($this->code));
        return $this->code;
    }

    //创建背景
    private function createBg()
    {
        //创建画布 给一个资源jubing
        $this->img = imagecreatetruecolor($this->width, $this->height);
        //背景颜色
        $color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
        //画出一个矩形
        imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color);
    }

    //创建字体
    private function createFont()
    {
        $_x = ($this->width / $this->codelen);   //字体长度
        for ($i = 0; $i < $this->codelen; $i++) {
            //文字颜色
            $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
            //资源句柄 字体大小 倾斜度 字体长度  字体高度  字体颜色  字体  具体文本
            imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x * $i + mt_rand(1, 5), $this->height / 1.4, $color, $this->font, $this->code[$i]);
        }
    }

    //随机线条
    private function createLine()
    {
        //随机线条
        for ($i = 0; $i < 6; $i++) {
            $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
            imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color);
        }
        //随机雪花
        for ($i = 0; $i < 45; $i++) {
            $color = imagecolorallocate($this->img, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255));
            imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), &#39;*&#39;, $color);
        }
    }

    //输出背景
    private function outPut()
    {
        //生成标头
        header(&#39;Content-type:image/png&#39;);
        //输出图片
        imagepng($this->img);
        //销毁结果集
        imagedestroy($this->img);
    }

    //对外输出
    public function doimg()
    {
        //加载背景
        $this->createBg();
        //加载文件
        $this->createCode();
        //加载线条
        $this->createLine();
        //加载字体
        $this->createFont();
        //加载背景
        $this->outPut();
    }

    //获取验证码
    public function getCode()
    {
        return strtolower($this->code);
    }

    //验证验证码
    public function checkCode($code, $clear = false)
    {
//        session_start();
        if (Session::get(&#39;VerifyCode&#39;) == strtolower($code)) {
            if($clear) $this->clearCode();
            return true;
        }
        if($clear) $this->clearCode();
        return false;
    }

    //清除验证码
    public function clearCode()
    {
        Session::del(&#39;VerifyCode&#39;);
//        session_start();
//        unset ($_SESSION[&#39;VerifyCode&#39;]);
    }
}
로그인 후 복사

Verification

ob_clean();
$verify = new Code();
$verify->doimg();
로그인 후 복사

이렇게 하면 다음과 같은 인증코드가 출력될 수 있습니다

PHP는 그래픽 인증 코드를 생성합니다(강화된 간섭 유형).

매개변수를 조정하여 인증코드의 크기, 간섭 항목 등을 조절할 수 있습니다.

Expansion

다음으로는 확장 기능과 인증코드의 간섭 항목을 강화하는 방법, 로그인 인증을 위한 프로젝트에 통합하는 방법에 대해 소개하겠습니다.

1. 간섭 강화

우선 위 스크린샷에서 몇 줄을 볼 수 있습니다. 외부인이 분석 도구를 사용하여 디코딩하는 경우, 이때 우리의 인증 코드를 해결하는 것은 매우 간단합니다. 줄을 추가하려면 코드에서 다음 코드를 찾아서 수정하세요

//随机线条
private function createLine()
{
    //随机线条 
    for ($i = 0; $i < 6; $i++) {
        $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
        imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color);
    }
    //随机雪花
    for ($i = 0; $i < 45; $i++) {
        $color = imagecolorallocate($this->img, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255));
        imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), &#39;*&#39;, $color);
    }
}
로그인 후 복사

위의 6번은 천천히 조정한 후 만족할 때까지 효과를 확인하시면 됩니다. 동시에 인증 코드에 눈꽃 효과가 많이 있음을 알 수 있습니다. 이 역시 간섭 항목이므로 위의 숫자 45를 수정하여 만족스러운 결과를 얻을 수 있습니다.

참고: 코드의 $charset 변수는 확인을 위해 여기에서 문자를 무작위로 선택합니다. 소문자 i와 L의 효과를 구별하기 어렵기 때문에 i 문자를 제거했습니다.

2. 프로젝트 확인에 액세스

다음 코드를 사용하여 새 파일을 만듭니다.

로그인 후 복사

그런 다음 이 인터페이스를 기존 시스템 로그인 페이지에 도입하여 사용자가 확인 코드를 입력하고 제출하면 서버가 이를 수행합니다. 다음 인증

//验证验证码
public function checkCode($code, $clear = false)
{
    if (Session::get(&#39;VerifyCode&#39;) == strtolower($code)) {
        if($clear) $this->clearCode();
            return true;
    }
    if($clear) $this->clearCode();
    return false;
}
//清除验证码
public function clearCode()
{
    Session::del(&#39;VerifyCode&#39;);
}
로그인 후 복사

이 시점에서 인증코드 생성 및 인증 과정이 완료되었습니다.

위 내용은 PHP는 그래픽 인증 코드를 생성합니다(강화된 간섭 유형).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿