>  기사  >  백엔드 개발  >  PHP 확인 코드 클래스 ValidateCode 분석

PHP 확인 코드 클래스 ValidateCode 분석

墨辰丷
墨辰丷원래의
2018-05-26 16:27:371668검색

이 글은 주로 PHP 검증 코드 클래스 ValidateCode를 자세히 분석하는데, 관심 있는 친구들은 이를 참고할 수 있습니다.

PHP 파싱 검증 코드 클래스

1.Start

온라인에서 ValidateCode가 작성된 것을 보았습니다. 인증코드 클래스를 생성하는데 PHP를 사용하니 느낌이 좋아서 분석하고 배워보겠습니다.

2. 클래스 다이어그램

3. 확인 코드 클래스 부분 코드

3.1 변수 정의

  //随机因子
  private $charset = 'abcdefghjkmnprstuvwxyzABCDEFGJKMNPRSTUVWXYZ23456789';
  private $code;
  private $codeLen = 4;

  private $width = 130;
  private $heigh = 50;
  private $img;//图像

  private $font;//字体
  private $fontsize = 20;

$charset은 임의 요소입니다. 몇 개 제거됐어 문자 "i, l, o, q", 숫자 "0,1" 등 구별하기 어려운 문자입니다. 필요한 경우 중국어 또는 기타 문자나 계산 등을 추가할 수 있습니다.

$codeLen은 인증 코드의 길이를 나타내며 일반적으로 4자리입니다.

3.2 생성자, 인증 코드 글꼴 설정, 트루 컬러 이미지 생성 img

public function __construct()
  {
    $this->font = ROOT_PATH.'/font/Chowderhead.ttf';
    $this->img = imagecreatetruecolor($this->width, $this->heigh);
  }

3.3 랜덤 인수에서 4자를 무작위로 $code 인증 코드로 추출합니다.

//生成随机码
  private function createCode()
  {
    $_len = strlen($this->charset) - 1;
    for ($i = 0; $i < $this->codeLen; $i++) {
      $this->code .= $this->charset[mt_rand(0, $_len)];
    }
  }

3.4 인증코드 배경색을 생성합니다.

//生成背景
  private function createBg()
  {
$color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
    imagefilledrectangle($this->img, 0, $this->heigh, $this->width, 0, $color);

  }

그 중 mt_rand(157, 255)는 무작위로 밝은 색상을 선택하는 것을 목표로 합니다.

3.5 이미지에 텍스트를 생성합니다.

//生成文字
  private function createFont()
  {
    $_x = $this->width / $this->codeLen;
    $_y = $this->heigh / 2;
    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(3, 5), $_y + mt_rand(2, 4), $color, $this->font, $this->code[$i]);
    }
  }

주로 이미지의 텍스트 위치와 각 텍스트의 색상을 고려하여 이미지에 인증 코드 텍스트를 생성합니다.

n번째 텍스트의 x축 위치 제어 = (이미지 너비 / 인증 코드 길이) * (n-1) + 임의 오프셋 숫자 n = {d1....n}

n번째 텍스트 제어 텍스트의 y축 위치 = 이미지 높이 / 2 + 임의 오프셋 숫자

mt_rand(0, 156)는 텍스트 색상을 무작위로 선택하고, 0-156은 더 어두운 색상을 선택하는 것을 목표로 합니다.

mt_rand(-30, 30) 임의 텍스트 회전.

3.6 이미지에 선과 눈송이 생성

//生成线条,雪花
  private function createLine()
  {
    for ($i = 0; $i < 15; $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->heigh), mt_rand(0, $this->width), mt_rand(0, $this->heigh), $color);
    }
    for ($i = 0; $i < 150; $i++) {
      $color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
      imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->heigh), &#39;#&#39;, $color);
    }
  }

선을 그릴 때는 더 어두운 색상 값을 사용하고, 눈송이를 그릴 때는 최대한 밝은 색상 값을 사용하는 것이 목적입니다. 육안의 인증 코드 인식에는 영향을 미치지 않지만 자동 인식 코드 메커니즘을 방해할 수 있습니다.

3.7 외부 통화에 대한 인증 코드 이미지를 생성합니다.

//对外生成
  public function doImg()
  {

    $this->createBg();   //1.创建验证码背景
    $this->createCode();  //2.生成随机码
    $this->createLine();  //3.生成线条和雪花
    $this->createFont();  //4.生成文字
    $this->outPut();    //5.输出验证码图像
  }

3.8 전체 코드:

img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
    imagefilledrectangle($this->img, 0, $this->heigh, $this->width, 0, $color);

  }

  //生成文字
  private function createFont()
  {
    $_x = $this->width / $this->codeLen;
    $_y = $this->heigh / 2;
    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(3, 5), $_y + mt_rand(2, 4), $color, $this->font, $this->code[$i]);
    }
  }

  //生成线条,雪花
  private function createLine()
  {
    for ($i = 0; $i < 15; $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->heigh), mt_rand(0, $this->width), mt_rand(0, $this->heigh), $color);
    }
    for ($i = 0; $i < 150; $i++) {
      $color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
      imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->heigh), &#39;#&#39;, $color);
    }
  }

  //输出图像
  private function outPut()
  {
    header('Content-Type: image/png');
    imagepng($this->img);
    imagedestroy($this->img);
  }

  //对外生成
  public function doImg()
  {

    $this->createBg();   //1.创建验证码背景
    $this->createCode();  //2.生成随机码
    $this->createLine();  //3.生成线条和雪花
    $this->createFont();  //4.生成文字
    $this->outPut();    //5.输出验证码图像
  }

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

}

4 테스트 코드:

<?php
/**
 * Created by PhpStorm.
 * User: andy
 * Date: 16-12-22
 * Time: 下午1:20
 */

define(&#39;ROOT_PATH&#39;, dirname(__FILE__));
require_once ROOT_PATH.&#39;/includes/ValidateCode.class.php&#39;;

$_vc=new ValidateCode();
echo $_vc->doImg();

인증 코드 생성:

5. 신청

 <label>
<img src="../config/code.php" onclick="javascript:this.src=&#39;../config/code.php?tm=&#39;+Math.random();" />
</label>

위의 온클릭코드는 인증코드 이미지를 클릭하면 자동으로 인증코드를 갱신할 수 있습니다.

code.php:

<?php
/**
 * Created by PhpStorm.
 * User: andy
 * Date: 16-12-22
 * Time: 下午3:43
 */
require substr(dirname(__FILE__),0,-7).&#39;/init.inc.php&#39;;

$_vc=new ValidateCode();
echo $_vc->doImg();
$_SESSION[&#39;ValidateCode&#39;]=$_vc->getCode();

애플리케이션의 전체 코드는 https://git.oschina.net/andywww/myTest의 CMS1.0 파일에서 다운로드할 수 있습니다.

6. 요약

독립적인 테스트 과정에서는 아무런 문제도 발견되지 않았는데, 프로젝트에 적용해보니 먼저 온라인에서 검색해보니 인증코드 이미지가 생성되지 않는다고 하더라구요. outPut() 함수.
header('Content-Type: image/png') 코드 앞에 ob_clean() 코드 한 줄을 추가하면 인증 코드 문제를 해결할 수 있습니다. 이 방법은 간단하지만 db_clean() 함수가 출력 버퍼의 내용을 삭제하므로 버퍼링된 데이터에 다른 문제가 발생할 수 있습니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.

관련 권장 사항:


PHP는 사진을 생성합니다.

인증 코드

자세한 기능 설명

php는 웹 사이트를 구현합니다.
인증 코드

function

PHP는 캡슐화합니다. ulated
인증코드

수업 자세한 설명


위 내용은 PHP 확인 코드 클래스 ValidateCode 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.