PHP 인증 코드 의 실현 원 리 를 전면적으로 해석 하고 php 인증 코드 를 첨부 한 작은 사례

7960 단어 php인증번호
넓히다
gd 확장 을 시작 해 야 합 니 다.아래 코드 를 사용 하여 gd 확장 여 부 를 확인 할 수 있 습 니 다.

<?php

echo "Hello World!!!!";

echo phpinfo();
?>

그 다음 에 브 라 우 저 에서 Ctrl+F 에서 gd 옵션 을 찾 으 면 자신 이 이 확장 을 설 치 했 는 지 확인 할 수 있 습 니 다.없 으 면 이 확장 을 모두 설치 해 야 합 니 다.
배경 그림
imagecreatetruecolor
기본 검은색 배경 생 성

<?php
//   gd imagecreatetruecolor();       
$image = imagecreatetruecolor(100,30);
//                    
header('content-type:image/png');

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('content-type:image/png');

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 = 'abcdefghjkmnopqrstuvwxyz23456789ABCDEFGHJKLMNOPQRSTUVWXYZ';
  $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('content-type:image/png');

imagepng($image);

//     ,      
imagedestroy($image);

인증 코드 사용
세 션 시작 시기
메모:세 션 을 시작 하려 면 반드시 시작 하 는 곳 에 있어 야 합 니 다. 
검증 의 원리
검증 과정 은 클 라 이언 트 가 입력 한 인증 코드 와 session 필드 에 존재 하 는 인증 코드 를 비교 하 는 것 입 니 다.즉:

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

최적화 검증
그러나 간단하게 이렇게 검증 하 는 것 은 조금 나 쁜 점 이 있다.바로 자모의 대소 문자 가 틀 리 기 쉽다 는 것 이다.그래서 사용자 가 입력 한 수 치 를 모두 소문 자로 변환 해 야 합 니 다.
if(strtolower($_REQUEST['checkcode'])==$_SESSION['checkcode']){・・・}
작은 사례
인증 코드 생 성

<?php
session_start();//    php        ,   session


//   gd imagecreatetruecolor();       
$image = imagecreatetruecolor(100,40);

//      
$bgcolor = imagecolorallocate($image,255,255,255);
//            
imagefill($image,0,0,$bgcolor);

////////     4             
$checkcode='';
for($i=0;$i<4;$i++){
  $fontsize = rand(6,8);
  $fontcolor = imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
  //           ,              
  $rawstr = 'abcdefghjkmnopqrstuvwxyz23456789';
  $fontcontent = substr($rawstr,rand(0,strlen($rawstr)),1);
  //           
  $checkcode.=$fontcontent;
  //          
  $x += 20;
  $y = rand(10,20);
  imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);  
}
//    session   
$_SESSION['checkcode']=$checkcode;

//         ,   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('content-type:image/png');

imagepng($image);

//     ,      
imagedestroy($image);

폼 검증

<?php
header("Content-Type:text/html;charset=utf8");
    if(isset($_REQUEST['checkcode'])){
      session_start();
      if(strtolower($_REQUEST['checkcode'])==$_SESSION['checkcode']){
        echo "<font color='green'>Success!</font>"; 
      }else{
        echo "<font color='red'>Failed!</font>";  
      }
      exit();
    }
?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>       </title>
  <script>
    function change(){
      document.getElementById("image_checkcode").src='./store.php?r='+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 로 imagecoloralocate 에서 발생 하 는 색 을 채 웁 니 다.
 •imagestring 을 사용 하여 인증 코드 와 배경 그림 의 결합 을 실현 합 니 다.
 •imagesetpixel 을 사용 하여 방해 점 을 추가 합 니 다.
 •이미지 라인 을 사용 하여 간섭 선 을 추가 합 니 다.
 •session 을 사용 하기 전에 시작 부분 에서 session 을 켜 야 합 니 다.start()방법
 •자바 스 크 립 트 를 사용 하여 인증 코드 를 동적 으로 수정 하 는 src 를 사용 하여 사용자 의'바 꾸 기'수 요 를 만족 시 킵 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기