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:
- Buatlah session untuk menyimpan hasil pengacakan string.
- Definisikan gambar yang akan dibuat (tentukan ukuran, dan warna yang akan memenuhi gambar tersebut).
- Persiapkan string yang akan diacak.
- 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.
- Bangkitkan CAPTCHA dengan menghidupkan session, dan memanggil fungsi pembangkit gambar yang ada pada ekstensi GD.
Dan inilah contoh source code-nya (Anda diperbolehkan untuk mengutip, mengedit, memodifikasi, dan menyebarkannya):
<?php
/**
* @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 atas 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
<img src="image.php" />
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:
- 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
- Modifikasilah karakter-karakter CAPTCHA yang dibuat dengan merotasi karakter dan/atau mengatur ukuran karakter tersebut agar berbeda.
-KnightDNA-






eh.. klo disimpen di variabel $_SESSION, berarti dikirim jadi cookies ato tetep ada di server?
aq ngeliat baris yg ini :
$_SESSION['randstr'] = sha1($text);
maksudnya, klo tetep ada di server, berarti ga mesti di-sha1 ya..
CMIIW
@aisar:
setauku semua variabel $_SESSION selalu disimpan di server. Selama ente nggak nge-set cookie, ato bikin suatu identifier buat user (misal: PHPSESSID) dia nggak akan disimpen di client.
ya, biar lebih aman dienkripsi aja sekalian…
CMIIW juga
kalo gambar nya gak keluar kenapa yah tu??
ada yg salah dengan..
??
gak keluar td
<img src=”image.php”
@ykzir:
Maaf, itu tadi baru source code untuk gambarnya. Anda benar. Katakanlah Anda menyimpan source code tadi di suatu file eksternal bernama “image.php”. Anda tinggal panggil lewat tag HTML <img src=”image.php”>. Kalau masih belum keluar juga, mungkin Anda belum menambahkan font AnkeCalligraph.TTF di satu folder yang sama dengan image.php. Silakan gunakan font lain sesuka Anda.
Semoga membantu
terus itu kalo mau langsung ditempel di halaman gimana? nggak dari luar. gimana masukinnnya? pl
@Darojatun:
Jadi kalo mau manggil gambar ya panggillah menggunakan tag <img>
Hmm, setau saya sih tidak akan bisa, karena CAPTCHA itu adalah format gambar (di contoh adalah image/png), sementara halaman web itu sendiri berformat text/html. Kalaupun ada yang mencoba untuk memakai cara manipulasi header tetap tidak akan bisa. Ya, karena gambar CAPTCHA dan halaman web yang akan ditempel memang dua hal yang berbeda
Hmm, analogi lain adalah Anda mencoba untuk menempelkan file pdf di satu halaman web. Tentu tidak akan bisa juga, karena keduanya memang berformat beda. PHP memang bisa membuat format file selain text/html (misal gambar, pdf, animasi flash), tapi perlakukan browser terhadap file yang formatnya beda ya tetap saja beda… Mungkin harus menunggu beberapa tahun lagi sampai ada protokol baru yang menanganinya atau web browser yang bisa melakukan pengenalan satu halaman web yang memiliki format berbeda-beda
CMIIW
Wahh.. sepp.
thanks info nya..
Qu Coa dulu…