Membuat CAPTCHA Sederhana

CAPTCHA (kepanjangan: Completely Automated Public Turing test to tell Computers and Humans Apart) adalah gambar yang mengandung kode alfabetik, numerik, ataupun alfanumerik, yang pada umumnya mudah dibaca oleh manusia namun susah (bahkan tidak bisa) dibaca oleh komputer. CAPTCHA bisa dibuat dengan menggunakan skrip PHP dan ekstensi GD yang berfungsi untuk membangkitkan grafik. Tulisan ini akan mengulas tentang cara membuat CAPTCHA sederhana. Anda cukup menyediakan web server Apache dengan modul PHP 5 dan ekstensi GD versi 2.0.34.

Berikut ini adalah langkah-langkah untuk membuat CAPTCHA:
  1. Buatlah session untuk menyimpan hasil pengacakan string.
  2. Definisikan gambar yang akan dibuat (tentukan ukuran, dan warna yang akan memenuhi gambar tersebut).
  3. Persiapkan string yang akan diacak.
  4. Tambahkan komponen-komponen yang akan memperkuat pengamanan CAPTCHA: font yang unik, penambahan background, penambahan garis-garis, rotasi teks, pembuatan font dengan ukuran masing-masing karakter yang berbeda, dsb.
  5. Bangkitkan CAPTCHA dengan menghidupkan session, dan memanggil fungsi pembangkit gambar yang ada pada ekstensi GD.

Contoh source code-nya ada adalah sebagai berikut (Anda boleh mengutip, mengedit, memodifikasi, dan menyebarkannya),

/**
 * @name  image.php
 * @author  Aprian Diaz Novandi
 * @todo  Skrip PHP yang menghasilkan gambar berformat .PNG dari string hasil pengacakan huruf kapital dengan font jenis AnkeCalligraph.TTF
 * @version 1.0.0.0
 * @since  May 15th 2007
 */

//memulai session untuk menyimpan hasil pengacakan string
session_start();

//membuat gambar berukuran 150x50 piksel
$im = imagecreatetruecolor(150, 50);

//definisi warna
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 175, 175, 175);
$black = imagecolorallocate($im, 0, 0, 0);

//membuat kotak berwarna putih dari titik (0,0) s.d. (150,50)
imagefilledrectangle($im, 0, 0, 150, 50, $white);

//string teks yang akan diacak
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

//mengambil enam karakter saja dari hasil pengacakan string
$text = substr(str_shuffle($str),0,6);

//font yang dipilih
$font = 'Walrod-Regular.TTF';

/*parameter fungsi imagettftext
(gambar_sumber,ukuran_font,sudut,x,y,warna,jenis_font,text_yang_akan_ditulis)*/

//menambahkan bayangan
imagettftext($im, 22, 0, 10, 35, $grey, $font, $text);

//menambahkan teks
imagettftext($im, 16, 0, 10, 35, $black, $font, $text);

//menghidupkan session
/*nilai variabelnya bisa dienkripsi, bisa plain, 
agar lebih aman silakan dienkripsi*/
$_SESSION['randstr'] = sha1($text);

header("Content-type: image/png");
imagepng($im);
imagedestroy($im);

Kode di halaman tersebut adalah kode untuk gambar CAPTCHA-nya. Simpanlah di file yang berbeda (misalkan bernama image.php). Untuk menampilkan gambar tersebut, silakan gunakan tag image pada HTML.



Dan untuk mencocokkan gambar yang muncul, silakan bandingkan kesamaan input dari form dengan variabel $_SESSION['randstr']. Apabila pada kode gambar CAPTCHA, nilai variabel $_SESSION['randstr'] dienkripsi (misal menggunakan algoritma enkripsi SHA1), tentu input tersebut juga harus dienkripsi.

Skrip di atas masih memiliki kelemahan, yaitu masih bisa diinterpretasi oleh aplikasi yang memanfaatkan aspek kecerdasan buatan (computer vision). CAPTCHA yang baik adalah CAPTCHA yang susah diinterpretasi oleh aplikasi semacam itu. Saat ini, semakin banyak aplikasi yang dikembangkan untuk mematahkan pengamanan halaman web dengan CAPTCHA, dan biasanya akan dipakai oleh mesin penyebar spam.

Untuk melihat contoh aplikasi yang memanfaatkan CAPTCHA, Anda bisa menuju link: http://arc.itb.ac.id/~diaz/captcha

Tips di bawah ini barangkali berguna untuk Anda yang tertarik untuk bermain-main dengan CAPTCHA:
  1. Hindari pembuatan CAPTCHA tanpa latar belakang karena akan semakin memudahkan aplikasi pembaca kode CAPTCHA. Paling tidak buatlah tambahan garis-garis atau buatlah dengan pilihan font yang unik tapi masih terbaca manusia
  2. Modifikasilah karakter-karakter CAPTCHA yang dibuat dengan merotasi karakter dan/atau mengatur ukuran karakter tersebut agar berbeda.

-KnightDNA-
blog comments powered by Disqus