CAPTCHA((Completely Automated Public Turing test to tell Computers and Humans Apart)는 사용자가 실제 사람인지 컴퓨터 프로그램인지 구분하기 위해 사용되는 기술로 주로 회원가입이나 결제 시에 보게 된다.

captcha 프로그램이 임의의 문자와 숫자를 일그러지거나 왜곡된 이미지로 변환하기 때문에 기계는 알아보기 힘드나 사람은 알아볼 수 있다.

구글 reCAPTCHA(리캡챠), 네이버 캡챠 등 잘 만들어진 api들이 있고 코드이그나이터의 경우 캡챠헬퍼를 제공하지만, php만으로도 간단하게 캡챠 기능을 만들 수 있다.

 

캡챠 완성샷

1. captcha.php

<?
session_start();

//이미지 크기
$img = imagecreate(100,50);

//캡챠 폰트 크기
$size = 30;
//캡챠 폰트 기울기
$angle = 0;
//캡챠 폰트 x,y위치
$x = 10;
$y = 40;
//이미지의 바탕화면은 흰색
$background = imagefill($img,0,0,imagecolorallocatealpha($img,255, 255, 255, 100));
//폰트 색상
$text_color = imagecolorallocate($img, 233, 14, 91);
//폰트 위치
$font = 'font/tvn_bold.ttf';

//캡챠 텍스트
$str = substr(md5(rand(1,10000)),0,5);
//가입 시 캡챠 텍스트 확인을 위해 session에 담는다.
$_SESSION['str'] = $str;

//글자를 이미지로 만들기
imagettftext($img,$size,$angle,$x,$y,$text_color,$font,$str);

Header("Content-type: image/jpeg");
imagejpeg($img,null,100);
imagedestroy($img);
?>

 

2. joinForm.php

-captcha.php 뒤에 date파라미터를 쓴 이유 : 캡챠와 사용자가 입력한 글자가 맞지 않을 경우 뒤로가기를 통해 joinForm.php로 돌아온다. 이 때 captcha.php가 한번 더 호출되면서 session에 새로운 캡챠 값이 저장이 되지만, 이미지는 캐시에 저장된 이미지(이미 보여준 이미지)가 나오기 때문이다.

<form action="join.php" method="post">
	<table style="margin:auto;">
		<tr>
			<td>아이디</td>
			<td><input type="text" name="id"></td>
		</tr>
		<tr>
			<td>비밀번호</td>
			<td><input type="password" name="pw"></td>
		</tr>
		<tr>
			<td>비밀번호 확인</td>
			<td><input type="password" name="pw2"></td>
		</tr>
		<tr>
			<td rowspan="2"><img src="captcha.php?date=<?echo date('h:i:s')?>"></td>
			<td>왼쪽 이미지의 글자를 입력하세요.</td>
		</tr>
		<tr>
			<td><input type="text" name="captcha"></td>
		</tr>
	</table>
	<div style="text-align:center;">
		<button type="submit">가입하기</button>
	</div>
</form>

 

3. join.php

<?
session_start();
if($_POST['captcha'] === $_SESSION['str']){
	echo '캡챠 성공';
	echo '<br/>';
	echo '가입을 진행하세요.';
}else{
	echo '<script>
    		alert(\'입력하신 글자가 다릅니다.\');
            history.go(-1);
         </script>';
}
?>

WRITTEN BY
beautifulhill

,