PHP 개발 인증코드(인증코드 생성)

이전 섹션을 통해 영상 처리의 본질을 잘 파악했습니다.

우리가 가진 지식을 통해. 몇 가지 간단한 확장을 사용하여 인터넷에서 가장 일반적으로 사용되는 작은 항목 중 하나인 확인 코드를 작성할 수 있습니다.

인증 코드는 기계가 자동으로 티켓을 등록하고 기계가 자동으로 티켓을 긁는 것을 방지하기 위해 가장 일반적으로 사용되는 수단 중 하나입니다.

인증코드의 효과를 살펴보겠습니다.

8.png

위의 효과를 바탕으로 구현 과정을 추론해 보겠습니다.

구현 과정:

1. 지정된 너비와 높이의 캔버스를 생성합니다

2. 생성해야 할 문자열을 준비합니다

3. 각각 time 실행하고 배경을 임의의 색상(밝은 색상)으로 채우도록 합니다

4. 캔버스에 임의의 간섭 요소를 그립니다(임의의 점, 임의의 선, 임의의 호 등은 허용되지만 지나치게 과하지 않아야 합니다). 사용자에게 영향을 미침 Visual)

5. 4 단어 쓰기

6. 헤더를 출력하고 브라우저에 특정 유형에 따라 표시하도록 지시

7. 이미지 출력

8. 이미지 리소스 삭제

위 단계에서는 인증 코드 구현의 모든 단계를 명확하게 설명합니다. 아래에서는 이 프로세스를 기반으로 구현에 대해 설명합니다.

1단계, 캔버스 만들기

$img = imagecreate($width, $height);


맞춤형 너비와 높이를 정의할 수 있습니다. 함수를 만들고 함수를 통해 너비와 높이를 전달합니다. 이러한 방식으로 보안문자 이미지의 크기를 수정할 수 있습니다.

function check_code($width = 100, $height = 50) {
    $img = imagecreate($width, $height);
}

두 번째 단계는 인증 코드에 표시되는 텍스트를 생성하는 것입니다.

인증 코드 텍스트에는 일반적으로 숫자와 문자가 포함됩니다. 인증 코드 문자를 구별하기 위해. 0-9A-Za-Z를 사용할 수 있습니다. 그러나 때로는 0과 o, l과 I의 구분이 명확하지 않을 때도 있습니다. 처리할 필요가 없다면 제거 방법을 찾을 수 있습니다:

해결책 1:
4개의 ASCII 코드, ASCII 코드 및 chr 또는 sprintf('%c'를 반복합니다. , 두 번째 매개 변수는 ASCII 코드로 전달되어 해당 문자를 지정된 문자로 변환합니다.

   for ($i = 0; $i < $num; $i++) {
        $rand = mt_rand(0, 2);
        switch ($rand) {
            case 0:
                $ascii = mt_rand(48, 57); //0-9
                break;
            case 1:
                $ascii = mt_rand(65, 90); //A-Z
                break;
            case 2:
                $ascii = mt_rand(97, 122); //a-z
                break;
        }
        //chr()
        $string .= sprintf('%c', $ascii);
    }

옵션 2:
옵션 1은 많은 사람들에게 다소 복잡하며 ascci 코드를 이해하지 못하는 사람들이 많습니다. 더 간단한 해결책이 있습니까? 혼자 있습니다. 문자를 준비한 다음 str_shuffle을 사용하여 문자를 섞은 다음 substr을 사용하여 가로챌 수 있습니다.

//没有0,i,l,o
$str = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789';
$str = str_shuffle($str);
$string = substr($str,0 ,3);

3. 실행될 때마다 배경을 임의의 색상(밝은 색상)으로 채우도록 합니다.

텍스트가 어둡습니다. 배경은 잠재되어 있는 동안 명확하게 볼 수 있습니다.

배경의 RGB 색상 표현은 일반적으로 이렇습니다. RGB 색상은 3가지 색상값으로, 이 3가지 색상값은 0~255입니다.

그리고:
0-120 낮은 값은 어두운 색상입니다.
130 - 255는 일반적으로 밝은 색상입니다.

그림색을 사용하는 곳은 많습니다. 따라서 색상 할당 기능을 정의할 수 있습니다.

//浅色的背景函数
function randBg($img) {
    return imagecolorallocate($img, mt_rand(130, 255), mt_rand(130, 255), mt_rand(130, 255));
}
//深色函数,深色的字或者点这些干 扰元素
function randPix($img) {
    return imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
}

4. 캔버스에 임의의 간섭 요소를 그립니다

그림에서 50픽셀을 무작위로 그릴 수 있습니다. 가장 작은 위치는 0,0입니다. 가장 큰 위치는 가장 큰 너비 또는 가장 큰 높이입니다.

그런 다음 mt_rand(0, 최대 너비), mt_rand(0, 최대 높이)를 사용합니다. 그런 다음 randPix를 사용하여 우리가 만든 캔버스에 색상을 할당합니다.

   //画干扰元素
    for ($i = 0; $i < 50; $i++) {
        imagesetpixel($img, mt_rand(0, $width), mt_rand(0, $height), randPix($img));
    }

5. 4단어 쓰기

$string은 문자열이고, $string[0]은 문자열의 첫 번째 문자입니다. 문자 하나의 문자 등.

그러므로 imagechar 함수를 사용하여 이미지에 텍스트를 쓸 수 있습니다.

공식을 사용하여 작성된 텍스트의 x 및 y 좌표를 파생할 수 있습니다.

X 위치 = 이미지 너비/문자 수(4) * 루프 수. 얻은 결과는 반올림되어 각 루프가 수행되는 횟수로 곱해집니다. 이미지의 너비가 100이라고 가정하면 첫 번째 시간은 0, 두 번째 시간은 25, 세 번째 시간은 50, 네 번째 시간은 75로 기록됩니다.

Y 위치 = mt_rand(0,이미지 높이 - 15).

다음 코드를 추론하고 해당 텍스트를 작성할 수 있습니다.

   for ($i = 0; $i < $num; $i++) {
        $x = floor($width / $num) * $i;
        $y = mt_rand(0, $height - 15);
        imagechar($img, 5, $x, $y, $string[$i], randPix($img));
    }

6. 헤더를 출력하고 브라우저에 특정 유형에 따라 표시하도록 지시합니다.

이미지 유형의 출력 기능에는 imagejpeg, imagepng, imagegif 및 기타 특성이 있다는 것을 알고 있습니다.

이미지의 MIME 형식은 image/jpeg, image/png, image/gif 등입니다.

따라서 변수를 선언할 수 있습니다:

$imagetype = 'jpeg';
$imagetype = 'png';
$imagetype = 'gif';

헤더 유형 출력 시 실행:

$header = 'Content-type:image/' . $imagetype;

실행 함수의 출력은 변수 함수:
$func = 'image' . $type;

시스템이 유형을 지원하는 경우 function_exists를 사용하여 함수가 존재하는지 감지합니다. 존재하는 경우 시스템은 이 유형을 지원하고 존재하지 않는 경우 이 유형을 지원하지 않습니다.

그래서 코드는 다음과 같이 작성할 수 있습니다:

   $func = 'image' . $type;
    $header = 'Content-type:image/' . $type;
    if (function_exists($func)) {
        header($header);
        //变为了imagejpeg等
        $func($img);
    } else {
        echo '图片类型不支持';
    }

8. 리소스를 삭제하고 해당 문자를 반환합니다.

나중에 확인하려면 모두가 확인 코드를 표시해야 합니다. 또한, 사용자가 입력한 인증문자도 이미지의 인증문자와 일치해야 합니다.

따라서 나중에 저장하려면 확인 문자를 반환해야 합니다.

   imagedestroy($img);
    return $string;

준비된 모든 PHP 함수 파일을 살펴보겠습니다. 위 코드를 모든 사람이 배우고 사용할 수 있도록 통합 함수로 캡슐화하겠습니다.

<?php

check_code();

function check_code($width = 100, $height = 50, $num = 4, $type = 'jpeg') {

   $img = imagecreate($width, $height);
   $string = '';
   for ($i = 0; $i < $num; $i++) {
       $rand = mt_rand(0, 2);
       switch ($rand) {
           case 0:
               $ascii = mt_rand(48, 57); //0-9
               break;
           case 1:
               $ascii = mt_rand(65, 90); //A-Z
               break;

           case 2:
               $ascii = mt_rand(97, 122); //a-z
               break;
       }
       //chr()
       $string .= sprintf('%c', $ascii);

   }
   //背景颜色
   imagefilledrectangle($img, 0, 0, $width, $height, randBg($img));

   //画干扰元素

   for ($i = 0; $i < 50; $i++) {

       imagesetpixel($img, mt_rand(0, $width), mt_rand(0, $height), randPix($img));

   }
   //写字
   for ($i = 0; $i < $num; $i++) {
       $x = floor($width / $num) * $i + 2;
       $y = mt_rand(0, $height - 15);

       imagechar($img, 5, $x, $y, $string[$i], randPix($img));

   }

   //imagejpeg

   $func = 'image' . $type;

   $header = 'Content-type:image/' . $type;

   if (function_exists($func)) {
       header($header);
       $func($img);
   } else {

       echo '图片类型不支持';
   }
   imagedestroy($img);
   return $string;

}
//浅色的背景
function randBg($img) {
   return imagecolorallocate($img, mt_rand(130, 255), mt_rand(130, 255), mt_rand(130, 255));
}
//深色的字或者点这些干 扰元素
function randPix($img) {
   return imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
}

?>


지속적인 학습
||
<?php check_code(); function check_code($width = 100, $height = 50, $num = 4, $type = 'jpeg') { $img = imagecreate($width, $height); $string = ''; for ($i = 0; $i < $num; $i++) { $rand = mt_rand(0, 2); switch ($rand) { case 0: $ascii = mt_rand(48, 57); //0-9 break; case 1: $ascii = mt_rand(65, 90); //A-Z break; case 2: $ascii = mt_rand(97, 122); //a-z break; } //chr() $string .= sprintf('%c', $ascii); } //背景颜色 imagefilledrectangle($img, 0, 0, $width, $height, randBg($img)); //画干扰元素 for ($i = 0; $i < 50; $i++) { imagesetpixel($img, mt_rand(0, $width), mt_rand(0, $height), randPix($img)); } //写字 for ($i = 0; $i < $num; $i++) { $x = floor($width / $num) * $i + 2; $y = mt_rand(0, $height - 15); imagechar($img, 5, $x, $y, $string[$i], randPix($img)); } //imagejpeg $func = 'image' . $type; $header = 'Content-type:image/' . $type; if (function_exists($func)) { header($header); $func($img); } else { echo '图片类型不支持'; } imagedestroy($img); return $string; } //浅色的背景 function randBg($img) { return imagecolorallocate($img, mt_rand(130, 255), mt_rand(130, 255), mt_rand(130, 255)); } //深色的字或者点这些干 扰元素 function randPix($img) { return imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120)); } ?>
  • 코스 추천
  • 코스웨어 다운로드
현재 코스웨어를 다운로드할 수 없습니다. 현재 직원들이 정리하고 있습니다. 앞으로도 본 강좌에 많은 관심 부탁드립니다~