>백엔드 개발 >PHP 문제 >PHP에서 인증 코드 인식을 구현하는 방법

PHP에서 인증 코드 인식을 구현하는 방법

藏色散人
藏色散人원래의
2020-09-01 09:14:163605검색

PHP에서 인증 코드 인식을 구현하는 방법: 먼저 이미지를 이진화하고 값을 2차원 배열에 저장한 다음 루프를 통해 각 숫자의 위치를 ​​찾은 다음 2차원 배열에서 숫자의 위치를 ​​계산합니다. , 숫자를 연결하고 마지막으로 문자열을 각 글꼴의 문자열과 비교하고 식별합니다.

PHP에서 인증 코드 인식을 구현하는 방법

추천: "PHP Video Tutorial"

하지만 원래 소개는 비교적 간단하고 알고리즘의 구체적인 구현 과정을 언급하지 않습니다. 자세한 프로세스는

http://www.poboke.com/study/php-verification-code-identification-primary.html

에서 전송됩니다. 따라서 이 기사에서는 실제 예를 사용하여 PHP 식별 프로세스를 보여줍니다. 인증번호를 입력하여 제출하세요. 인증코드는 인증을 위해 서버로 전송됩니다.

파트 1: 인증 코드 인식

최근 인증 코드 지식에 대한 몇 가지 획기적인 연구를 수행하고 기록했습니다. 한편으로는 이해를 돕기 위해 지난 며칠 동안 배운 지식을 요약한 것이며, 한편으로는 이 측면을 공부하는 기술 학생들에게도 도움이 되기를 바랍니다. 웹사이트 관리자의 관심을 끌고 인증 코드 제공 시 더 많은 고려를 하시기 바랍니다. 나는 방금 지식의 이러한 측면을 접했기 때문에 이해가 비교적 간단하므로 자유롭게 의견을 말하십시오.

인증 코드의 역할: 해커가 특정 프로그램을 사용하여 무차별 대입 공격을 통해 특정 등록 사용자에게 지속적인 로그인 시도를 하는 것을 효과적으로 방지합니다. 실제로 최신 인증 코드는 일반적으로 기계가 일괄적으로 등록하는 것을 방지하고 기계가 일괄적으로 응답을 게시하는 것을 방지합니다. 현재 많은 웹사이트에서는 사용자가 로봇을 사용하여 자동으로 등록, 로그인 및 스팸을 보내는 것을 방지하기 위해 인증 코드 기술을 사용합니다.

인증 코드는 무작위로 생성된 숫자나 기호의 문자열에서 사진을 생성하는 것으로, OCR을 방지하기 위해 사진에 일부 간섭 픽셀이 추가됩니다. 양식을 입력하고 웹사이트에 제출하여 인증을 완료한 후에만 기능을 사용할 수 있습니다.

가장 일반적인 인증 코드:
1, 4자리, 임의의 한 자리 문자열, 가장 독창적인 인증 코드, 인증 효과는 거의 0입니다.
2. 무작위 디지털 사진 인증 코드. 사진의 문자는 매우 규칙적이며 일부는 임의의 인터페론이 추가되었을 수 있으며 일부는 임의의 문자 색상이 있을 수 있으므로 이전보다 확인 효과가 더 좋습니다. 그래픽과 이미지에 대한 기본 지식이 없는 사람은 이를 깨뜨릴 수 없습니다!
3. 다양한 이미지 형식의 임의의 숫자 + 임의의 대문자 영문자 + 임의의 간섭 픽셀 + 임의의 위치.
4. 한자는 무작위로 생성되는 최신 인증 코드로, 입력하기가 더 어렵고 일반적으로 덜 사용됩니다.

간단함을 위해 이번 설명의 주요 목적은 먼저 인터넷에서 흔히 볼 수 있는 몇 가지 인증 코드 사진을 살펴보겠습니다.
이 네 가지 스타일은 기본적으로 2에서 언급한 인증 코드 유형을 나타낼 수 있습니다. 얼핏 보면 첫 번째 그림이 가장 해독하기 쉽고, 두 번째 그림이 두 번째, 세 번째가 더 어렵고, 네 번째 그림이 가장 어렵습니다.
실제 상황은 어떤가요? 사실, 이 세 가지 유형의 이미지는 똑같이 해독하기 어렵습니다.

첫번째 사진이 가장 쉽습니다. 사진의 배경과 숫자는 같은 색을 사용하고, 글자도 규칙적이고, 글자의 위치도 같습니다. 이 문서에서는 이러한 유형의 인증 코드를 예로 사용합니다. 학생들은 스스로 다른 사진을 만들 수 있습니다.
두번째 사진은 쉽지 않을 것 같지만 사실 잘 찾아보면 배경색과 인터페론이 어떻게 바뀌어도 검증문자가 규칙적이고 같은 색이라 아주 쉽습니다. 모든 비특징성 색소가 제거되는 한 인터페론을 제거할 수 있습니다.
세 번째 사진은 위에서 언급한 것처럼 배경색과 인터페론이 바뀌는 것 외에도 인증문자의 색상도 바뀌고, 각 문자의 색상도 달라서 좀 복잡한 것 같습니다.
네 번째 사진은 세 번째 사진에서 언급한 기능 외에도 텍스트에 두 개의 직선을 추가하여 비율을 방해하는 것처럼 보이지만 실제로는 쉽습니다.

다음은 Wanwang의 "일반 URL 쿼리"를 사용하여 인증 코드 식별 프로세스를 보여줍니다.
Wanwang 열기: http://www.net.cn, 웹사이트 오른쪽 사이드바에 "일반 URL 쿼리"가 있습니다:

이것이 첫 번째 인증 코드임을 알 수 있습니다. 사람의 눈으로 인식되는 숫자가 출력되기 때문에 인증코드 이미지의 숫자색과 배경색의 색상차이가 상대적으로 크기 때문에 RBG값 역시 매우 다르다고 판단하여 숫자와 배경을 구별할 수 있습니다. 각 픽셀의 RGB 값입니다.

인증코드 인식은 일반적으로 다음과 같은 단계로 나누어집니다.

1. 폰트 꺼내기
인증코드를 인식하는 것은 결국 전문적인 OCR 인식이 아니며, 각 사이트의 인증코드이기 때문입니다. 다르기 때문에 결국 일반적인 방법은 이 인증 코드에 대한 기능 코드 라이브러리를 생성하는 것입니다. 글꼴을 제거할 때 이 그림에 모든 문자가 포함되도록 몇 장의 그림을 더 다운로드해야 합니다. 여기 그림에는 숫자만 있으므로 0-9를 포함한 숫자의 그림만 수집하면 됩니다.

1. 인증 코드를 여러 번 새로 고치고 0~9까지의 인증 코드 사진을 모두 저장하세요.

2. 이미지 처리 소프트웨어로 이미지를 엽니다. 저는 Fireworks를 사용하여 이미지의 모든 픽셀을 명확하게 관찰할 수 있도록 이미지 보기를 8배로 확대합니다.

각 숫자의 너비는 6px, 높이는 10px, 숫자 사이의 간격은 4px, 첫 번째 숫자의 왼쪽은 2px, 위쪽은 0px인 것을 확인할 수 있습니다. 이 번호는 나중에 사용됩니다.

3. 각 숫자를 잘라서 사진으로 저장하세요. 크기는 6*10 입니다.

2. 이미지 이진화
이진화는 이미지의 인증번호 각 픽셀을 숫자 1로, 그 외의 부분은 0으로 표현하는 것입니다. 인식할 이미지를 이진화하고 데이터를 2차원 배열로 저장하여 이미지 특징 배열을 얻습니다.

1. 먼저 배경색, 간섭색과 숫자를 구분하고 화면 색상 선택기를 사용하여 색상 패턴을 관찰합니다.

결론을 내릴 수 있습니다. 배경색의 R, G, B 값은 모두 200보다 큰 반면, 디지털 색상의 R, G, B 값 중 하나는 200보다 작을 수 있습니다. 200이므로 쉽게 구별할 수 있습니다.

2. 다음 PHP 코드는 2차원 배열을 시각적으로 보여주기 위한 것입니다. 1과 0은 0과 -로 변경됩니다.



1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21


echo '<br><img src="v1.jpg"><br><br>';

 

getHec("v1.jpg");

 

function getHec($imagePath) {

    $res = imagecreatefromjpeg($imagePath);

    $size = getimagesize($imagePath);

    

    for ($i = 0; $ i &lt; $사이즈[1]; ++$i) {

ㅋㅋㅋ

$j &lt; $사이즈[0]; ++$j) {

ㅋㅋㅋ

$j, $i );

            $rgbarray = imagecolorsforindex($res, $rgb);

            if ($rgbarray['red'] & lt; 200 || $rgbarray['green']&lt;200 || $rgbarray['블루 '] & lt; 200) {

               echo "0";

           }else{

                echo "-";

            }

        }

        echo "<br>";

    }

}

결과는 아래 그림과 같습니다.

사진의 배경색이 더 복잡하더라도 처리 방법은 동일합니다. 구별할 중요한 값은 항상 직접 관찰해야 합니다.

3. 디지털 글꼴의 이진화
각 디지털 글꼴의 이진 데이터를 계산하고 이를 기록하여 키로 사용합니다.

1. 0~9의 디지털 글꼴 이미지를 이진화하여 이미지의 픽셀 같은 색상을 하나씩 꺼낸 다음 각 픽셀의 R, G, B 값을 구한 후 판단합니다. 코드는 다음과 같습니다.

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21


ㅋㅋㅋ

&lt; 10;$i++){

    echo"'$i'=>'";

    echogetHec("$i.jpg")."',<br>";

}

 

functiongetHec($imagePath){

    $res =imagecreatefromjpeg( $imagePath);

    $size=getimagesize($imagePath);

    

    for($i=0;$ i&lt; $사이즈[1];++$i){

        for($j=0;$ j&lt; $size[0];++$j){

            $rgb=imagecolorat($res, $j,$i );

            $rgbarray=imagecolorsforindex($res, $rgb);

            if($rgbarray['red']& lt;200|| $rgbarray['녹색']&lt;200||$rgbarray['blue'] &lt; 200){

               echo"1";

           }else{

               echo"0";

             }

        }

    }

}

출력 결과:



1

2

3

4

5

6

7

8

9

10


'0'=&gt;' 011110100001100001100001100001100001100001100001100001011110',

'1'=&gt;'001000111000001000001000001000001000001000001000001000111 110',

'2'=&gt; '011110100001100001000001000010000100001000010000110011111111',

'3'=&gt;'011110100001100001000010001100000010000001100001100001011 110',

'4'=&gt; '000100000100001100010100100100100100111111000100001100001111',

'5'=&gt;'111111100000100000101110110001000001000001100001100001011 110',

'6'=&gt; '001110010001100000100000101110110001100001100001100001011110',

'7'=&gt;'111111100010100010000100000100001000001000001000001000001 000',

'8'=&gt; '011110100001100001100001011110010010100001100001100001011110',

'9'=&gt;'01110010001010000110000110001101110100000100000110001001 1 100',

Four. Control 샘플
2단계에서 이미지 기능코드를 넣어주세요. 3단계에서 인증코드의 폰트를 비교하여 인증사진의 숫자를 알아냅니다.

알고리즘 프로세스(코드는 첨부 파일 참조):
1. 이미지의 이진화된 값을 2차원 배열로 저장합니다.
2. 반복을 통해 이전에 얻은 숫자의 너비, 높이, 간격, 왼쪽 오프셋, 위쪽 오프셋을 사용하여 각 숫자의 위치를 ​​찾습니다.
예: i번째 숫자의 왼쪽 오프셋 = (숫자 너비 + 간격) * i + 왼쪽 오프셋. (w h 유사한 문자 모양을 가진 문자열.
4. 문자열을 각 글꼴의 문자열과 비교하여 유사도가 가장 높은 숫자를 선택하거나, 유사도가 95% 이상일 때 특정 숫자라고 결론을 내릴 수 있습니다.
5. 인식 결과는 다음과 같습니다.

현재 방식으로는 인증코드 인식이 기본적으로 100% 가능합니다.

위의 과정을 통해서도 인터페론 제거 방법을 아직 찾지 못했다고 말씀하셨을 텐데요! 실제로 인터페론을 제거하는 방법은 매우 간단합니다. 인터페론의 중요한 특징은 인증코드의 표시 효과에 영향을 미치지 않는다는 것입니다. 따라서 인터페론을 만들 때 그 RGB가 특정 값보다 낮을 수도 있고 높을 수도 있습니다. 제가 제시한 예에서는 사진에서 인터페론의 RGB값이 200보다 작지 않아 인터페론을 쉽게 제거할 수 있습니다.

소스코드 다운로드 : http://yunpan.cn/cmJCkEnyGij3t 접속 비밀번호 d2ba

위 내용은 PHP에서 인증 코드 인식을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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