gd 확장을 활성화해야 합니다. 다음 코드를 사용하여 gd 확장이 활성화되어 있는지 확인할 수 있습니다.
<?phpecho "Hello World!!!!";echo phpinfo();?>
그런 다음 브라우저에서 gd 옵션을 검색하여 Ctrl+F
이 확장 프로그램을 설치했는지 확인하세요. 그렇지 않은 경우 확장 프로그램을 직접 설치해야 합니다.
기본적으로 검정색 배경 생성
<?php // 使用gd的 imagecreatetruecolor();创建一张背景图 $image = imagecreatetruecolor(100,30);// 在显示这张图片的时候一定要先声明头信息 header('content-type:image/png'); imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);
채우기 색상을 만들고 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);
이 방법을 사용하기 전에 먼저 헤더 정보를 설정해야 합니다. 그렇지 않으면 이미지가 정상적으로 표시되지 않습니다
적시에 리소스를 릴리스하면 서버 요청에 대한 부담이 줄어듭니다.
추후 처리를 용이하게 하기 위해 색상 정보를 생성합니다.
$fontcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
이미지의 해당 위치에 콘텐츠 정보를 씁니다.
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);
참고: 세션은 처음에 열려야 합니다
검증 프로세스 클라이언트가 입력한 인증코드와 세션 필드에 존재하는 인증코드를 비교합니다. 즉,
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 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을 사용하여 imagecolorallocate에서 생성된 색상으로 채웁니다.
이미지 문자열을 사용하여 인증 코드와 배경 이미지 결합
imagesetpixel을 사용하여 간섭 지점 추가
이미지라인을 사용하여 간섭선 추가
세션을 사용하기 전에 처음에 session_start() 메서드를 활성화해야 합니다
JavaScript를 사용하여 동적으로 수정 확인 코드의 src는 사용자의 "다른 코드 변경" 요구를 충족하는 데 사용됩니다.
위 내용은 PHP 인증코드 구현 원리에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!