Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse der PHP-Verifizierungscodeklasse ValidateCode

Analyse der PHP-Verifizierungscodeklasse ValidateCode

墨辰丷
墨辰丷Original
2018-05-26 16:27:371606Durchsuche

In diesem Artikel wird hauptsächlich die PHP-Verifizierungscodeklasse ValidateCode analysiert, die einen bestimmten Referenzwert hat.

PHP-Verifizierungscodeklasse

1

Ich habe im Internet gesehen, dass ValidateCode in PHP geschrieben wurde, um eine Verifizierungscode-Klasse zu generieren. Es fühlte sich gut an, also habe ich es zum Analysieren und Lernen verwendet.

2. Klassendiagramm

3. Verifizierungscode-Klassenteilcode

3.1 Variablen definieren

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

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

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

$charset ist ein Zufallsfaktor, hier haben wir einige entfernt, die schwierig sind Zur Unterscheidung von Zeichen wie Buchstaben „i,l,o,q“ und Zahlen „0,1“. Bei Bedarf können Sie einige chinesische oder andere Zeichen oder Berechnungen usw. hinzufügen.

$codeLen gibt die Länge des Bestätigungscodes an, normalerweise 4 Ziffern.

3.2 Konstruktor, Schriftart für den Bestätigungscode festlegen, ein Echtfarbenbildbild generieren

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

3.3 Wählen Sie zufällig 4 Zeichen aus dem Zufallsfaktor als $code-Bestätigungscode aus.

//生成随机码
  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 Generieren Sie die Hintergrundfarbe des Bestätigungscodes.

//生成背景
  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);

  }

Unter ihnen ist mt_rand(157, 255) der Zweck Wählen Sie zufällig eine hellere Farbe aus.

3.5 Text auf Bild generieren.

//生成文字
  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]);
    }
  }

Bestätigungscode auf Bild generieren Für Text , ist die Hauptüberlegung die Position des Textes auf dem Bild und die Farbe jedes Textes.

Kontrollieren Sie die X-Achsen-Position des n-ten Textes = (Bildbreite/Bestätigungscodelänge) * (n-1) + zufällige Offset-Nummer;

Kontrollieren Sie die y-Achsenposition des n-ten Textes = Bildhöhe/2 + zufällige Versatzzahl;

mt_rand(0, 156) wählt zufällig die Textfarbe aus, 0-156 soll eine dunklere Farbe sein .

mt_rand(-30, 30) Zufällige Textrotation.

3.6 Linien und Schneeflocken auf dem Bild erzeugen

//生成线条,雪花
  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);
    }
  }

Beim Zeichnen von Linien wählen Sie Wählen Sie beim Zeichnen von Schneeflocken einen dunkleren Farbwert und einen helleren Farbwert. Der Zweck besteht nicht darin, die Erkennung des Verifizierungscodes durch das menschliche Auge so weit wie möglich zu beeinträchtigen, sondern auch den automatischen Erkennungscodemechanismus zu beeinträchtigen.

3.7 Generieren Sie Verifizierungscodebilder für externe Anrufe.

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

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

3.8 vollständiger Code:

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. Test

Testcode:

<?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();

Verifizierungscode generieren:

5. Anwenden

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

Der obige Onclick-Code dient zum Klicken auf das Bild des Bestätigungscodes, wodurch der Bestätigungscode automatisch aktualisiert werden kann.

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();

Der vollständige Code für die Anwendung kann von https://git.oschina.net/andywww heruntergeladen werden /myTest Laden Sie die CMS1.0-Datei herunter.

6. Zusammenfassung

Während des unabhängigen Testprozesses wurden keine Probleme festgestellt; bei der Anwendung auf das Projekt wurde jedoch zunächst festgestellt, dass der Verifizierungscode Ich habe online nicht gesucht und einige sagten, es sei in der Funktion „outPut()“ enthalten. In header('Content-Type: image/png'); vor dieser Codezeile, die das Problem mit dem Bestätigungscode lösen kann. Obwohl diese Methode einfach ist, kann sie andere Probleme mit gepufferten Daten verursachen, da die Funktion db_clean() den Inhalt des Ausgabepuffers verwirft.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.

Verwandte Empfehlungen:

PHP-generiertes Bild

Bestätigungscode

Detaillierte Funktionserklärung
PHP implementiert Website-

Verifizierungscode

Funktion
PHP gekapselt

Verifizierungscode

Klassenausführliche Erklärung

Das obige ist der detaillierte Inhalt vonAnalyse der PHP-Verifizierungscodeklasse ValidateCode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn