>  기사  >  백엔드 개발  >  PHP 인증코드 구현 원리에 대한 자세한 소개

PHP 인증코드 구현 원리에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-11 10:38:131457검색

확장

gd 확장을 활성화해야 합니다. 다음 코드를 사용하여 gd 확장이 활성화되어 있는지 확인할 수 있습니다.

<?phpecho "Hello World!!!!";echo phpinfo();?>

그런 다음 브라우저에서 gd 옵션을 검색하여 Ctrl+F 이 확장 프로그램을 설치했는지 확인하세요. 그렇지 않은 경우 확장 프로그램을 직접 설치해야 합니다.

배경 이미지

imagecreatetruecolor

기본적으로 검정색 배경 생성

<?php
// 使用gd的
imagecreatetruecolor();创建一张背景图
$image = imagecreatetruecolor(100,30);// 在显示这张图片的时候一定要先声明头信息
header(&#39;content-type:image/png&#39;);

imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);

imagecolorallocate

채우기 색상을 만들고 imagefill(image, x,y,color) 방법을 사용하여 부착합니다.

<?php
// 使用gd的
imagecreatetruecolor();创建一张背景图
$image = imagecreatetruecolor(100,30);// 生成填充色
$bgcolor = imagecolorallocate($image,255,255,255);// 将填充色填充到背景图上
imagefill($image,0,0,$bgcolor);// 在显示这张图片的时候一定要先声明头信息
header(&#39;content-type:image/png&#39;);

imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);

imagepng

이 방법을 사용하기 전에 먼저 헤더 정보를 설정해야 합니다. 그렇지 않으면 이미지가 정상적으로 표시되지 않습니다

imagedestory(image )

적시에 리소스를 릴리스하면 서버 요청에 대한 부담이 줄어듭니다.

간단한 디지털 인증코드

imagecolorallocate

추후 처리를 용이하게 하기 위해 색상 정보를 생성합니다.

$fontcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));

imagestring

이미지의 해당 위치에 콘텐츠 정보를 씁니다.

imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);

인식 간섭 증가

포인트 추가

// 生成一些干扰的点,这里是200个
for($i=0;$i<200;$i++){    
$pointcolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255));
    imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor);
}

줄 늘리기

// 生成一些干扰线 这里是5个
for($i=0;$i<5;$i++){    // 设置为浅色的线,防止喧宾夺主
    $linecolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255));
    imageline($image,rand(0,99),rand(0,29),rand(0,99),rand(0,29),$linecolor);

}

영숫자 혼합 인증코드

<?php
// 使用gd的imagecreatetruecolor();创建一张背景图
$image = imagecreatetruecolor(100,40);// 生成填充色
$bgcolor = imagecolorallocate($image,255,255,255);// 将填充色填充到背景图上
imagefill($image,0,0,$bgcolor);//////// 生成随机4位字母以及数字混合的验证码
for($i=0;$i<4;$i++){    
$fontsize = rand(6,8);    
$fontcolor = imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));    
// 为了避免用户难于辨认,去掉了某些有歧义的字母和数字
    $rawstr = &#39;abcdefghjkmnopqrstuvwxyz23456789ABCDEFGHJKLMNOPQRSTUVWXYZ&#39;;    
    $fontcontent = substr($rawstr,rand(0,strlen($rawstr)),1);    
    // 避免生成的图片重叠
    $x += 20;    $y = rand(10,20);
    imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);   
}// 生成一些干扰的点,这里是200个for($i=0;$i<200;$i++){    
$pointcolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255));
    imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor);
}
// 生成一些干扰线 这里是4个for($i=0;$i<4;$i++){    
// 设置为浅色的线,防止喧宾夺主
    $linecolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255));
    imageline($image,rand(0,99),rand(0,29),rand(0,99),rand(0,29),$linecolor);

}


header(&#39;content-type:image/png&#39;);

imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);

인증코드 사용

세션 오픈 시간

참고: 세션은 처음에 열려야 합니다

검증 원칙

검증 프로세스 클라이언트가 입력한 인증코드와 세션 필드에 존재하는 인증코드를 비교합니다. 즉,

if(isset($_REQUEST[&#39;checkcode&#39;])){
        session_start();        
        if($_REQUEST[&#39;checkcode&#39;]==$_SESSION[&#39;checkcode&#39;]){            
        echo "<font color=&#39;green&#39;>Success!</font>"; 
        }else{            
        echo "<font color=&#39;red&#39;>Failed!</font>";    
        }        
        exit();
    }

최적화된 검증

하지만 이렇게 단순히 검증을 하면 단점이 있는데, 바로 글자의 대문자 표기가 오류가 나기 쉽다는 것입니다. 그래서 사용자가 입력한 모든 값을 소문자로 변경하는 변환을 해야 합니다.

if(strtolower($_REQUEST[&#39;checkcode&#39;])==$_SESSION[&#39;checkcode&#39;]){···}

소형 케이스

인증 코드 생성

양식 확인

<?php
header("Content-Type:text/html;charset=utf8");        
if(isset($_REQUEST[&#39;checkcode&#39;])){
            session_start();            
            if(strtolower($_REQUEST[&#39;checkcode&#39;])==$_SESSION[&#39;checkcode&#39;]){                
            echo "<font color=&#39;green&#39;>Success!</font>"; 
            }else{                
            echo "<font color=&#39;red&#39;>Failed!</font>";    
            }            
            exit();
        }?>
        <!DOCTYPE html><html><head>
    <meta charset="utf-8" />
    <title>验证验证码信息</title>
    <script>
        function change(){
            document.getElementById("image_checkcode").src=&#39;./store.php?r=&#39;+Math.random();  
        }    </script></head><body><form action="./form.php" method="post"><p>验证码图片:</p>
        <img id="image_checkcode" src="./store.php?r=<?php echo rand();?>"   />
        <a href="javascript:void(0)" onclick="change()">看不清楚</a>
        <br/>请输入验证码<input type="text" name="checkcode" /><br /><p>
        <input type="submit" value="提交" /></p></form>
        </body></html>

요약

마지막으로 요약해 보겠습니다.

  • PHP를 사용하여 인증 코드를 생성하려면 gd 확장 지원이 필요합니다.

  • imagecreatetruecolor 메소드를 사용하여 배경색을 생성하고, imagefill을 사용하여 imagecolorallocate에서 생성된 색상으로 채웁니다.

  • 이미지 문자열을 사용하여 인증 코드와 배경 이미지 결합

  • imagesetpixel을 사용하여 간섭 지점 추가

  • 이미지라인을 사용하여 간섭선 추가

  • 세션을 사용하기 전에 처음에 session_start() 메서드를 활성화해야 합니다

  • JavaScript를 사용하여 동적으로 수정 확인 코드의 src는 사용자의 "다른 코드 변경" 요구를 충족하는 데 사용됩니다.

위 내용은 PHP 인증코드 구현 원리에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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