CodeIgniter User Guide Version 2.1.0


CAPTCHA 헬퍼

CAPTCHA 헬퍼는 CAPTCHA 이미지를 만드는 데 유용한 함수로 구성되어 있습니다.

헬퍼 로딩

다음 코드를 사용하여로드합니다:

$this->load->helper('captcha');

다음 함수를 사용할 수 있습니다:

create_captcha($data)

CAPTCHA 생성을 위한 정보를 배열로 받아서 지정한곳에 이미지를 생성한 후 이미지에 대한 정보를 연관배열로반환합니다.

[array]
(
  'image' => IMAGE TAG
  'time' => TIMESTAMP (in microtime)
  'word' => CAPTCHA WORD
)

"image"는 실제 image 태그입니다 : <img src="http://example.com/captcha/12345.jpg" width="140" height="50" />

"time"은 파일이름으로 사용할 마이크로 타임스탬프 입니다. 다음과 같은 숫자가 될것입니다: 1139612155.3422

"word" 는 이미지에 표시될 문자입니다.지정하지않으면 랜덤한 문자열이 사용됩니다.

CAPTCHA 헬퍼 사용하기

일단 헬퍼를 로드한후 아래와같이 CAPTCHA를 생성할 수 있습니다:

$vals = array(
    'word' => 'Random word',
    'img_path' => './captcha/',
    'img_url' => 'http://example.com/captcha/',
    'font_path' => './path/to/fonts/texb.ttf',
    'img_width' => '150',
    'img_height' => 30,
    'expiration' => 7200
    );

$cap = create_captcha($vals);
echo $cap['image'];

데이터베이스 추가

CAPTCHA를 이용해 사용자의 폼전송을 막으려면 create_captcha() 함수가 반환하는 정보를 디비에 저장할 필요가 있습니다.그 정보를 이용하여 사용자의 폼전송이 적합성 및 만료 여부를 확인할 수 있습니다.

테이블 형태:

CREATE TABLE captcha (
 captcha_id bigint(13) unsigned NOT NULL auto_increment,
 captcha_time int(10) unsigned NOT NULL,
 ip_address varchar(16) default '0' NOT NULL,
 word varchar(20) NOT NULL,
 PRIMARY KEY `captcha_id` (`captcha_id`),
 KEY `word` (`word`)
);

디비와 함께 사용하는 예제입니다. CAPTCHA를 사용하는 페이지에서는 아래 비스무리한 코드를 구현합니다:

$this->load->helper('captcha');
$vals = array(
    'img_path' => './captcha/',
    'img_url' => 'http://example.com/captcha/'
    );

$cap = create_captcha($vals);

$data = array(
    'captcha_time' => $cap['time'],
    'ip_address' => $this->input->ip_address(),
    'word' => $cap['word']
    );

$query = $this->db->insert_string('captcha', $data);
$this->db->query($query);

echo 'Submit the word you see below:';
echo $cap['image'];
echo '<input type="text" name="captcha" value="" />';

폼 전송을 받는 페이지에서는 아래 비스무리한 코드를 구현합니다:

// First, delete old captchas
$expiration = time()-7200; // Two hour limit
$this->db->query("DELETE FROM captcha WHERE captcha_time < ".$expiration);

// Then see if a captcha exists:
$sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?";
$binds = array($_POST['captcha'], $this->input->ip_address(), $expiration);
$query = $this->db->query($sql, $binds);
$row = $query->row();

if ($row->count == 0)
{
    echo "You must submit the word that appears in the image";
}