Home > Programming, Web > Membuat PHP Captcha Sendiri

Membuat PHP Captcha Sendiri

Pernah denger istilah Captcha? captcha itu harfiahnya “Completely Automated Public Turing test to tell Computers and Humans Apart” ( dari Wikipedia ). Dibuat untuk membedakan antara mesin ( bot ) dan manusia. Captcha dibuat untuk melakukan validasi input pada website2 yang mempersilahkan pengunjung memberikan inputan baik berupa komentar, shoutout, kotak pendaftaran, atau apapun dimana pengunjung menginputkan sesuatu.

Kenapa harus divalidasi? soalnya banyak banget program2 SPAM COmment yang bisa aja menyerang situs kita. Kebayang kan klo kita bikin website, terus isi dari Comment/guestbook di website kita itu isinya Link2 ad ato penawaran tentang produk ato ga link ke situs2 porno. Jadi gak sedap dipandang. Biasanya yg ngisi Comment adalah program yang secara otomatis melakukan submit ke buku tamu / halaman comment website/blog kita.. Nah, klo pernah kejadian kayak gitu ato ga ngeliat yang kayak gitu, sebaiknya lengkapi websitenya dengan Captcha.

Captcha = Gambar Samar2
Simpelnya, Captcha merupakan sebuah gambar (image) yang berisi Angka / Teks atau kombinasi Angka & teks yang disamar2kan bentuk & rupanya sehingga memerlukan ketelitian dari pengunjung / orang yang ingin melakukan inputan data disebuah website.

Menambahkan Captcha pada website kita

Cara yang pertama adalah dengan download library Captcha dari thecaptcha.com Kita tinggal menambahkan librarynya dan disisipkan dengan website kita.

Cara yang kedua adalah dengan membuat PHP Captcha kita sendiri. Kode ini saya dapat dari somewhere setelah googling2. Eh ga taunya baru tau kalo di rumahweb.com tutorial kayak gini udah pernah ditulis. Jadi klo mau lebih detail boleh liat ke situsnya.

Cara Kerjanya:

Nah, cara kerjanya adalah bermain2 dengan session,  pada saat form pendaftaran di Load, maka dibuatkan String Random dari MD5 yang diambil 5 digit pertamanya. Kemudian string itu disimpen di SESSION, Dari String itu dibuatkan Image dengan menggunakan GDLIbrary bawaan dari PHP dan ditampilkan di halaman Form tersebut. Pada saat User Submit String tersebut, dilakukan pengecekan dengan Session yang sudah tersimpan sebelumnya.

Captcha Preview

File: php_captcha.php

<?php

session_start();
$RandomStr = md5(microtime());// md5 to generate the random string
$ResultStr = substr($RandomStr,0,5);//trim 5 digit
$NewImage =imagecreatefromjpeg("img.jpg");//image create by existing image and as back ground

$LineColor = imagecolorallocate($NewImage,233,239,239);//line color
$TextColor = imagecolorallocate($NewImage, 255, 255, 255);//text color-white

imageline($NewImage,1,1,40,40,$LineColor);//create line 1 on image
imageline($NewImage,1,100,60,0,$LineColor);//create line 2 on image
imageline($NewImage,5, 1, 200, 50, $LineColor);

imagestring($NewImage, 5, 15, 5, $ResultStr, $TextColor);// Draw a random string horizontally

$_SESSION['key'] = $ResultStr;// carry the data through session
header("Content-type: image/jpeg");// out out the image
imagejpeg($NewImage);//Output image to browser


?> 

File: form.php

<?php

session_start();


?>

<html>
<head>
<title>PHP-CAPTCHA </title>
</head>
<body onload="return focuson();">
<script   language="javascript">
function focuson()
{ document.form1.number.focus()}

function check()
{
if(document.form1.number.value==0)
{
alert("Please enter your Category Name");
document.form1.number.focus();
return false;
}
}

</script>


<?php

 if(isset($_REQUEST['Submit'])){
$key=substr($_SESSION['key'],0,5);
$number = $_REQUEST['number'];
if($number!=$key){
echo '<center><font face="Verdana, Arial, Helvetica, sans-serif" color="#FF0000">
Validation string not valid! Please try again!</font></center>';}
else{
echo '<center><font face="Verdana, Arial, Helvetica, sans-serif"  color="#66CC00">
Your string is valid!</font></center>';}
}


?>

<form name="form1" method="post" action="form.php"  onsubmit="return check();">
<img src="php_captcha.php" /></td>
<input name="number" type="text" id="number" /></td>
<input name="Submit" type="submit"   value="Submit" /></td>
</form>
</body>
</html>

Kode lengkapnya Bisa di download disini

Categories: Programming, Web Tags:
  1. January 24, 2008 at 9:30 pm | #1

    mo download tp link downloadnya gak bisa diakses , he he discreenshootnya ada tabnya recaptcha

  2. January 25, 2008 at 2:23 am | #2

    iya.. blm sempet di upload.. ntar dech di benerin lagi.. blm nemuin tempat share file yang oke nich. ada saran?

    tapi btw, itu kodenya dah valid ko, tinggal di copy paste aja… ^_^

  3. February 8, 2008 at 9:51 am | #3

    Yang saya bingungkan, kode diatas kan menghasilkan file img.jpg. Misalnya ada 2 orang atau lebih yang mengakses halaman tersebut, apakah image captchanya ga error ? atau menampilkan gambar yang sama ? atau gimana

  4. February 8, 2008 at 10:37 pm | #4

    gambar yang dihasilkan isi (angka & text) nya didapat dari hasil random String yang di MD5, lalu dipotong 5 digit pertamanya… kemudian disimpan di Session.

    $RandomStr = md5(microtime());// md5 to generate the random string
    $ResultStr = substr($RandomStr,0,5);//trim 5 digit

    ..jadi setiap kali halaman direload, pasti selalu menampilkan hasil gambar yang berbeda. coba buka dua browser dan jalankan file yang sama…

    contoh image captcha yang pernah saya buat ada disini http://himakom.prodi-mi.com/index.php/view/tipografi-font-untuk-web
    cobain aja buka 2 kali di tab yg berbeda

  5. February 21, 2008 at 2:13 am | #5

    dulu q sempat tanya ke orang2 untuk buat ini, cuman orang yang q tanya kaga ngerti….soalnya q sendiri ga tahu namanya…

    rupanya CAPTCHA

  6. February 21, 2008 at 2:27 am | #6

    Yup :D

  7. ismed
    February 29, 2008 at 3:03 am | #7

    fan…
    kenapa ga di implemen ke web nya alia ?
    dah lumayan banyak tuh spam nya..
    :D

  8. paul
    March 5, 2008 at 11:06 am | #8

    nanya dunkz?

    1. fungsi captcha apa sih?
    2. kenapa harus pake captcha?

    thanks before!!

  9. March 6, 2008 at 12:31 pm | #9

    @ismed:
    sudah di implement kang ismed, silahkan cek lagi di http://alia.pknlpkia.ac.id
    mohon maaf agak telat respon nya :D

    @paul:
    1.fungsi utamanya untuk mencegah spam. karena sekarang sudah banyak BOT (mesin) yang melakukan insert ke buku tamu / comment di website kita secara otomatis. nah, dengan captcha dipastikan, yang mau insert ke bukutamu/comment tersebut adalah manusia, bukan mesin.

    2.sudah terjawab di nomor 1.

    ;-)

  10. paul
    March 11, 2008 at 7:51 pm | #10

    thanks banget ya… maklumlah lagi mencari artikel2nya sih… mas irfan makasih bgt…
    btw… masih bisa nanyakan?

    1. apakah ada cara lain selain captcha? pengen ngebandingin dengan yang lain… siapa tau ada..
    2. bisa ga kita buat captcha, tapi kita randomnya dari folder yang isinya file2 .gif yang sudah dibuat dari perpaduan antara huruf dan angka?

    best regard.

    pengen ngebandingin dengan yang lain

  11. March 15, 2008 at 2:17 pm | #11

    @paul:
    y sama.. senengnya bisa ngebantu :D

    umm…
    1. cara lain? setau saya selain dibandingin sama captcha, bisa juga dengan cara dibandingin sama angka hasil operasi matematika sebuah bilangan. Misal: (Berapa 5×6). Tapi si bilangannya di random jg, jadi BOT susah deh bacanya… contohnya.. um.. pernah liat dulu, tapi lupa lagi, bentar googling dulu. :p

    2. cara kaya gitu kurang efektif deh klo menurut saya. Mungkin random huruf & angka nya tetep di PHP nya aja. Cuma yg bisa di ganti2 file imagenya (warna background & ilustrasinya mungkin). Kemudian cara si php nge-scratch(ngegores2in) tuh gambar lebih dipersulit lagi sehingga sulit dibaca.

    semoga bermanfaat.. ^__^v

  12. June 14, 2008 at 2:42 am | #12

    Wah thanks ya buat tipnya

  13. paul
    July 10, 2008 at 9:52 am | #13

    Fan… thanks banget atas bantuannya… kalo ga ada loe… tugas gw bisa GAGALLLLLLLL 100%……

    ada lagi yang ingin saya tanyain… :) … kebetulan udah captcha itu udah gw kembanging dengan ngac kode di tiap huruf. jadi yang ada kode dihurufnya yang terpilih…..

    pertanyaan gw :
    1. gimana cara c captcha itu bisa menghambat spam? (sebenarnya gw udah tau tapi hanya ingin mencocokkan jawabannya)
    2. gimana algoritmanya captcha itu? (hehehehe…gw ga tau apa itu algoritma)
    3.boleh minta alamat YM loe ga? biar interaksi langsung… online konsul…
    thanks before n after….

  14. July 11, 2008 at 6:54 am | #14

    YM: irfanroom

  15. tepan
    July 12, 2008 at 7:41 am | #15

    wah bro… aku maw tanya neh bikin form yang inputannya untuk tgl lahir, jadi waktu kita masukin bulan nanti tglnya bisa ngatur sendiri, misalnya kita masukin bulan maret berarti tglnya sampai 31, tapi klo kita masukin bulan april tglnya jadi 30 terus untuk bulan februari masalahnya sama tahun nah itu gimana caranya yah… jadi form itu lasung ngebaca untuk dirinya sendiri.. kalo bisa segera dijawab ya ntu buat jobtraining aku soalnya hehehe… thx bro

  16. July 12, 2008 at 3:52 pm | #16

    wah… harus seperti itu ya spesifikasinya? biasanya mah klo buat tanggalan, pake combobox untuk tanggal nya (diisi 1-31, min tgl 1 max tgl 31), klo buat bulan sudah pasti diisi jan-des. Nah klo tahunnya tinggal masukin aja pake textbox. Ato bisa juga di define, looping dari tahun terkecil (misal 1940 – tahun skr 2008).

    Tapi kalo speknya harus milih berdasarkan bulan.. umm.. okay ku coba bikinin deh. Btw, ntar liatnya di blog ku yg baru aja yah… Secepatnya ku bikin.Okay ;)

    http://satriadarma.webwae.com

  17. July 12, 2008 at 4:47 pm | #17

    nah tuh bang, dah dibikinin :D

  18. Lea
    July 25, 2008 at 6:59 am | #18

    kk, captcha nya koq ga bs yaahh?? gambarnya ga keluar.. plz bantuin donk

  19. July 29, 2008 at 7:55 am | #19

    ga keluarnya kenapa yah ??

  20. November 19, 2008 at 1:51 am | #20

    gambarnya ga bisa keluar ….

  21. November 24, 2008 at 7:35 am | #21

    mas, kok ga bisa keluar gambarnya ya? saya coba akses lgs php_captcha.php, munculnya spt ini:

    Warning: imagecreatefromjpeg(img.jpg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in /php_captcha.php on line 6

    Warning: imagecolorallocate(): supplied argument is not a valid Image resource in /php_captcha.php on line 8

    Warning: imagecolorallocate(): supplied argument is not a valid Image resource in /php_captcha.php on line 9

    Warning: imageline(): supplied argument is not a valid Image resource in /php_captcha.php on line 11

    Warning: imageline(): supplied argument is not a valid Image resource in /php_captcha.php on line 12

    Warning: imageline(): supplied argument is not a valid Image resource in /php_captcha.php on line 13

    Warning: imagestring(): supplied argument is not a valid Image resource in /php_captcha.php on line 15

    Warning: Cannot modify header information – headers already sent by (output started at /home/gobushba/public_html/php_captcha.php:6) in /php_captcha.php on line 18

    Warning: imagejpeg(): supplied argument is not a valid Image resource in /php_captcha.php on line 19

    kira2 salahnya apa ya mas?

  22. bontlover
    November 29, 2008 at 3:42 am | #22

    iya gambarnya ga keluar. adanya kotak ada tanda silang merahnya

  23. December 1, 2008 at 1:02 am | #23

    ada saran dari eri sk8ber untuk yg ga jalan pake imagecreate katanya ganti pake imagettftext($im, 22, 0, 10, 35, $black, $font, $ResultStr);

    tapi sy sendiri juga belum nyoba… ntar di cek dulu knp bisa eyyoy. kayaknya ada masalah sm createjpg nya.

  24. December 12, 2008 at 10:33 am | #24

    aaaaaaaaaaaaaaa………
    pucing aku………

  25. December 17, 2008 at 8:23 am | #25

    thank u…

  26. Simri
    January 2, 2009 at 6:57 am | #26

    Kepengen nyoba soale websiteku pernah kena spam sampe pusing 7 keliling..
    Kalo ada kesulitan boleh share nggak? Thnx ya…

  27. January 4, 2009 at 3:47 am | #27

    @omsiro:
    pusingnya kenapa om?

    @pinandita:
    sim2… bermanfaat ?

    @Simri:
    Ok. Siap. mungkin spam2 sekarang udah lebih canggih kali ya. dengan teknik Captcha seperti ini sy belum tau apa masih bisa ditembus ato ngga. tapi mudah2an bisa ya. :D

  28. rio sugarian
    January 9, 2009 at 10:28 am | #28

    Mau tanya nich knp background captcha pas di upload gk view , tapi di localhost tampil … kurang apanya …ya,

  29. Rivai
    January 30, 2009 at 2:35 am | #29

    Waduh! katanya udah valid kok masih eroor!

  30. January 30, 2009 at 2:20 pm | #30

    errornya di bagian mananya rivai? mungkin qt bisa bahas.

  31. XekaiForce
    January 31, 2009 at 2:34 am | #31

    Halo semua, salam kenal.

    Seneng banget nemu blog keq gini ^^. Kalo captchanya sendiri udah lama tau, cuma ga pernah pengen make soalnya blom butuh. Barusan sekitar 2 ato 3 hari lalu dosenku minta ada model scurity kayak captcha. Aku cari-cari dapetnya class melulu. Enak seh tinggal pake, tapi pengen ngerti konsepnya, dan sekarang dapat. Lah, koq ga liat konsepnya dari kelas yang ada?? Ah.. males.. udah terlalu banyak baris kode. Well.. Thanks banget bro..

    Nah sekarang mau bagi2 pengetahuan jg aku ^^. Pertama dari kode diatas, ada satu baris kode yang menurutku ga perlu fungsi berlebih. Pada file form.php baris yang berisi
    $key=substr($_SESSION['key'],0,5);
    Nah itu fungsi substr-nya dalam kasus ini ga perlu. Coz diawal udah diambil 5 huruf. Jadi cukup kayak gini bisa =)
    $key=$_SESSION['key'];

    Terus masalah fungsi yang dari library gdi-nya, yaitu imagecreatefromjpeg(string) itu adalah fungsi untuk membuat identifier image dari file yang sudah ada, jadi harus nyediain file img.jpg terlebih dulu untuk contoh :
    $NewImage = imagecreatefromjpeg(“img.jpg”);
    Tapi pas tak coba nyediain file img.jpg gambarnya ga berubah, jadi gw ganti fungsinya jadi
    $NewImage = imagecreate(100,20); // paramater = panjang, lebar.
    Fungsi diatas membuat identifier baru tanpa source image, jadi murni di memori server.

    Kemudian untuk kasus captcha yang minta hasil perhitungan ini aku kemarin coba buat yang sederharna, aku modifikasi dari contoh sebelumnya =)

    file = captcha.php

    Untuk file form.php sama, cuma ganti baris

    menjadi

    atau terserah sesuai file source image captchanya… Oh ya, hati2 untuk pembagian tak hingga semacam 1/3 yang hasilnya 0.3333333…. mending di kasih pembulatan. Atau di substr jg bisa.
    Terserah itu =)

    Tapi yang paling penting, dari penjelasan bang Irfan adalah konsepnya, thanks banget bro.

    @toetde :
    Itu libray gdi di PHP blom aktif bang.

  32. February 7, 2009 at 3:10 pm | #32

    @XekaiForce:
    wah, thx banged +annya. sim2. sangat membantu sekali penjelasan dan bagi2 pengetahuan teknisnya jadi lebih worth it lagi kodingnya. Tentang pembagian yg klo mau jadi pembualatan bisa juga pake fungsi ceil() nya php.

    ok bro thx juga dah mampir n share disini. mdh2an bisa tetep share ya.

    regards.

  33. March 9, 2009 at 1:54 am | #33

    makasi pak,, sedeng perlu ne…

  34. March 13, 2009 at 9:07 am | #34

    Bagi yang gagal masang captcha, yag gambarnya gak mau muncul….
    coba deh upload juga file img.jpg. anda bisa desain dulu pake adobe photoshop, baru di upload. pasti nantinya bisa…
    semoga bisa membantu bagi yang gagal

  35. April 13, 2009 at 5:10 pm | #35

    NI ntar ditaruh dimana ya…?

  36. April 13, 2009 at 5:12 pm | #36

    ditaruhnya di contact-form / form yg membutuhkan validasi captcha.

  37. July 1, 2009 at 1:16 pm | #37

    kok hasilnya tetap ga ada ya? n yang keluar tetap kotak dengan tanda silang merah ?
    ni errornya :
    Fatal error: Call to undefined function: imagecreatetruecolor() in c:\apache\htdocs\captcha\php_captcha.php on line 13
    kalau saya rubah begini :
    $NewImage =imagecreatefromjpeg(“img.jpg”)
    jadi :
    ga ada hasilnya …

  38. July 1, 2009 at 1:20 pm | #38

    tolong jalan keluarnya mas?

    • August 18, 2009 at 9:31 am | #39

      @kang sofyan:

      uda cek blm di php.ini?

      cek dulu deh apa di baris extension=php_gd2.dll
      ada tanda “;” di depan?
      -> kalo ada mohon dihilangin deh…. ;p
      -> kalo ga bs juga cek filenya ada ga?
      [lokasi filenya ditaruh tergantung sama package (xampp, phptriad, dll) yg anda pake]

  39. ami
    July 29, 2009 at 7:40 am | #40

    tes hallo!

  40. August 18, 2009 at 9:11 am | #41

    monggo mas, mangap numpang lewat…

    td ane cari2 di om google n ketemu posting ini…
    nice post and idea, gan…

    btw, cuma mau nambahin aja mungkin kalau dibuat create dari image jpg yg udah ada akan ribet (image ga muncul)… [atau mungkin bs ada terjadi exclusive locks untuk penggunanaan secara bersamaan. Cuma paranoia, ga bs ane buktikan ;p ]

    jadi, ane pake cara bang XekaiForce, tp ga pake imagecreate karena rada transparan gitu antara background ama tulisan… [ga sama kayak contoh]

    jadi, ane otak-atik dikit… [ijin yah gan...]

    cara kang irfan:
    $NewImage =imagecreatefromjpeg(“img.jpg”);

    cara bang XekaiForce
    $NewImage =imagecreate(100,20);

    cara ane
    $NewImage =imagecreatetruecolor(75, 30); //(Panjang, Tinggi)

    dan dipaling bawah file “php_captcha.php” setelah:

    imagejpeg($NewImage);//Output image to browser

    ane tambahin:

    imagedestroy($NewImage); //Clear output buffer. Added by Surya

    dua cara ini disarankan oleh phpmanual [ satu mang jelas2 di sebut gitu. kedua, tiap ada contoh ttg image selalu ada imagedestroy() ]

    [quote: phpmanual]
    resource imagecreate ( int $width, int $height )

    imagecreate() returns an image identifier representing a blank image of specified size.

    We recommend the use of imagecreatetruecolor().
    [/quote: phpmanual]

  41. September 18, 2009 at 8:28 am | #42

    Thanks bro atas artikelnya

  42. September 26, 2009 at 2:44 am | #43

    sama2 bang…

  43. September 27, 2009 at 3:01 pm | #44

    bro…uda g coba tapi koq script nya ga jalan sih ? tolong donk bantuannya…gw lagi pengen belajar capcai ne eh salah captcha…heheheh
    thank’s yach.

  44. September 28, 2009 at 3:14 am | #45

    ga bisanya gmn om ? ada keluar error atau gimandang.. siapa tw saya / temen2 yg lain bisa bantu

  45. Syaiful Amri
    October 20, 2009 at 3:09 am | #46

    @Surya Japutera

    Thanks bos, pake caranya bos Surya baru bisa jalan dengan bener nih script
    pake $NewImage =imagecreatetruecolor(75, 30);

    • Irfan Satriadarma
      October 20, 2009 at 3:05 pm | #47

      ok. sama2 bro.. your welcome. semoga berguna ya…

  1. July 12, 2008 at 4:33 pm | #1