Membuat Captcha Sederhana dengan PHP

Tutorial103 Views

Captcha sering kita temui di berbagai website saat melakukan login, registrasi, atau mengisi formulir online. Fungsinya sederhana tapi vital: memastikan bahwa yang mengakses memang manusia, bukan bot otomatis. Dengan adanya captcha, penyalahgunaan seperti spam atau brute force attack bisa diminimalisir. Menariknya, kita tidak perlu library yang kompleks untuk membuat captcha, cukup dengan PHP dasar, GD Library, dan sedikit logika. Mari kita bedah langkah-langkahnya.


Kenapa Harus Membuat Captcha Sendiri?

Sebelum masuk ke kode, ada pertanyaan penting: kenapa repot-repot membuat captcha sendiri kalau sudah ada layanan siap pakai seperti Google reCAPTCHA? Jawabannya tergantung kebutuhan.

Jika kamu mengelola website kecil atau sekadar belajar, captcha buatan sendiri lebih ringan dan tidak bergantung pada layanan pihak ketiga. Selain itu, kamu bisa bebas mengatur tampilan sesuai gaya desain websitemu. Namun, tentu saja captcha sederhana tidak sekuat reCAPTCHA dalam menghadapi serangan bot canggih.


Persiapan: Apa yang Dibutuhkan?

Untuk membuat captcha sederhana dengan PHP, ada beberapa hal yang perlu disiapkan:

  1. Web server dengan PHP aktif (misalnya XAMPP, Laragon, atau hosting online).
  2. GD Library di PHP, karena kita akan memanfaatkan fungsi imagecreate(), imagestring(), hingga imagettftext() untuk membuat gambar captcha.
  3. Folder project dengan file PHP untuk menampilkan captcha, dan satu file form untuk mengujinya.

Begitu semua siap, kita bisa mulai membuatnya.


Membuat File Generator Captcha

Langkah pertama adalah membuat file PHP yang bertugas menghasilkan gambar captcha. Anggap saja kita buat file captcha.php.

Kode sederhananya bisa seperti ini:

<?php
session_start();

// Membuat string random
$random_num = substr(md5(mt_rand()), 0, 6);
$_SESSION['captcha'] = $random_num;

// Membuat gambar kosong
$image = imagecreate(120, 40);

// Warna background dan teks
$bg_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 0, 0, 0);

// Menulis teks ke gambar
imagestring($image, 5, 30, 10, $random_num, $text_color);

// Header untuk gambar
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);
?>

Kode ini menghasilkan gambar PNG dengan tulisan angka/teks acak sepanjang 6 karakter. Nilainya disimpan di session agar bisa divalidasi saat form dikirim.


Membuat Form dengan Captcha

Setelah punya generator gambar, sekarang kita butuh form untuk menampilkan captcha sekaligus tempat pengguna memasukkan jawaban. Misalnya kita buat form.php:

<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
    <title>Form dengan Captcha</title>
</head>
<body>
    <form method="post" action="validate.php">
        <label>Nama:</label>
        <input type="text" name="nama" required><br><br>
        
        <label>Captcha:</label><br>
        <img src="captcha.php" alt="captcha"><br>
        <input type="text" name="captcha" required><br><br>
        
        <input type="submit" value="Kirim">
    </form>
</body>
</html>

Form ini akan memanggil gambar dari captcha.php. Pengguna harus mengetik ulang teks yang muncul agar bisa melanjutkan.


Validasi Captcha di Server

Bagian terpenting adalah memvalidasi input pengguna. File validate.php akan mengecek apakah nilai yang dimasukkan sama dengan session captcha yang disimpan.

<?php
session_start();

if($_POST['captcha'] == $_SESSION['captcha']) {
    echo "Captcha benar! Form berhasil dikirim.";
} else {
    echo "Captcha salah! Silakan coba lagi.";
}
?>

Validasi dilakukan secara server-side, sehingga meskipun pengguna mencoba mengutak-atik HTML, hasil akhirnya tetap akan diperiksa di PHP.


Membuat Captcha Lebih Menarik dengan Efek

Captcha sederhana dengan teks hitam di atas background putih mungkin terlalu mudah ditebak. Agar sedikit lebih sulit bagi bot, kita bisa menambahkan efek seperti garis acak, noise, atau font TTF.

Contoh menambahkan garis acak:

// Menambahkan garis acak
for ($i = 0; $i < 5; $i++) {
    $line_color = imagecolorallocate($image, rand(100,255), rand(100,255), rand(100,255));
    imageline($image, 0, rand()%50, 200, rand()%50, $line_color);
}

Dengan cara ini, teks akan tercampur dengan garis-garis acak sehingga tidak terlalu polos.


Menggunakan Font TTF untuk Tampilan Lebih Realistis

Supaya captcha lebih mirip dengan yang sering kita lihat di website besar, kita bisa menggunakan font khusus. PHP menyediakan fungsi imagettftext() untuk menuliskan teks dengan font TTF.

Contoh:

$font = __DIR__ . '/arial.ttf'; // pastikan file font ada
imagettftext($image, 20, rand(-10,10), 20, 30, $text_color, $font, $random_num);

Fungsi ini memungkinkan kita mengatur ukuran font, rotasi, dan posisi teks. Hasilnya tentu lebih variatif dibanding imagestring().


Menyimpan dan Menggunakan Captcha

Captcha tidak hanya berguna di form pendaftaran. Kamu bisa menggunakannya di berbagai skenario lain:

  • Login form, untuk mencegah brute force.
  • Komentar artikel, agar tidak dibanjiri spam bot.
  • Survey online, memastikan responden manusia.

Namun, jangan lupa: semakin penting aplikasi atau data yang dilindungi, semakin baik juga mekanisme captcha yang digunakan. Captcha buatan sendiri cocok untuk pembelajaran dan website kecil, tapi untuk aplikasi besar lebih aman menggunakan solusi seperti Google reCAPTCHA.


Tips Tambahan Agar Captcha Tidak Mudah Dibaca Bot

Selain menambahkan garis atau menggunakan font acak, ada beberapa trik tambahan:

  • Acak posisi huruf supaya tidak sejajar.
  • Gunakan warna berbeda untuk setiap karakter.
  • Tambahkan noise titik-titik pada background.
  • Rotasi teks sedikit supaya bot lebih sulit mengenali.

Trik-trik ini tidak akan membuat captcha jadi mustahil dipecahkan, tapi setidaknya meningkatkan tingkat kesulitannya.


Alternatif: Captcha Angka Matematika

Selain captcha berbasis gambar, kamu juga bisa membuat captcha berupa soal matematika sederhana. Misalnya:

<?php
session_start();
$a = rand(1,9);
$b = rand(1,9);
$_SESSION['captcha'] = $a + $b;
echo "Berapakah hasil dari $a + $b?";
?>

Captcha jenis ini lebih ringan, tidak perlu gambar, dan tetap efektif melawan bot sederhana.

Leave a Reply

Your email address will not be published. Required fields are marked *