Skip to content

emka.web.id

menulis pengetahuan – merekam peradaban

Menu
  • Home
  • Tutorial
  • Search
Menu

Belajar PHP: Membuat Captcha dengan Font dan Sudut Tulis Sendiri

Posted on March 21, 2011

CAPTCHA atau Captcha adalah suatu bentuk uji tantangan-tanggapan (challange-response test) yang digunakan dalam perkomputeran untuk memastikan bahwa jawaban tidak dihasilkan oleh suatu komputer. Proses ini biasanya melibatkan suatu komputer (server) yang meminta seorang pengguna untuk menyelesaikan suatu uji sederhana yang dapat dihasilkan dan dinilai oleh komputer tersebut. Karena komputer lain tidak dapat memecahkan CAPTCHA, pengguna manapun yang dapat memberikan jawaban yang benar akan dianggap sebagai manusia. Oleh sebab itu, uji ini kadang disebut sebagai uji Turing balik, karena dikelola oleh mesin dan ditujukan untuk manusia, kebalikan dari uji Turing standar yang biasanya dikelola oleh manusia dan ditujukan untuk suatu mesin. CAPTCHA umumnya menggunakan huruf dan angka dari citra terdistorsi yang muncul di layar.

Kali ini kita akan belajar membuat captcha dengan class SimpleCaptcha yang dibuat oleh Ver Pangonilo. Source code dari simplecaptcha ini sbb:
[sourcecode language=”php”]
<?php

class SimpleCaptcha {

function SimpleCaptcha( $params = null )
{
$this->BackgroundImage = $params[‘BackgroundImage’]; //background image
$this->BackgroundColor = $params[‘BackgroundColor’];
$this->Height = $params[‘Height’]; //image height
$this->Width = $params[‘Width’]; //image width
$this->FontSize = $params[‘Font_Size’]; //text font size
$this->Font = $params[‘Font’]; //text font style
$this->TextMinimumAngle = $params[‘TextMinimumAngle’];
$this->TextMaximumAngle = $params[‘TextMaximumAngle’];
$this->TextColor = $params[‘TextColor’];
$this->TextLength = $params[‘TextLength’];
$this->Transparency = $params[‘Transparency’];

$this->generateCode();
//initially, png is used
header("Content-type: image/png");
$this->generateImage($this->Code);

}
//Background Images
function getBackgroundImage()
{
return $this->BackgroundImage;
}

function setBackgroundImage( $background_image = null )
{
$this->BackgroundImage = $background_image;
}

//Backgroung Color
function getBackgroundColor()
{
return $this->BackgroundColor;
}

function setBackgroundColor( $background_color )
{
$this->BackgroundColor = $background_color;

}

//Image Height
function getHeight()
{
return $this->Height;
}

function setHeight( $height = null )
{
$this->Height = $height;
}
//Image Width
function getWidth()
{
return $this->Width;
}

function setWidth( $width = null )
{
$this->Width = $width;
}
//Font size
function getFontSize()
{
return $this->FontSize;
}

function setFontSize( $size = null )
{
$this->FontSize = $size;
}

//Font
function getFont()
{
return $this->Font;
}

function setFont( $font = null )
{
$this->Font = $font;
}

//Text Minimum Angle
function getTextMinimumAngle()
{
return $this->TextMinimumAngle;
}

function setTextMinimumAngle( $minimum_angle = null )
{
$this->TextMinimumAngle = $minimum_angle;
}

//Text Maximum Angle
function getTextMaximumAngle()
{
return $this->TextMaximumAngle;
}

function setTextMaximumAngle( $maximum_angle = null )
{
$this->TextMaximumAngle = $maximum_angle;
}

//Text Color
function getTextColor()
{
return $this->TextColor;
}

function setTextColor( $text_color )
{
$this->TextColor = $text_color;
}

//Text Length
function getTextLength()
{
return $this->TextLength;
}

function setTextLength( $text_length = null )
{
$this->TextLength = $text_length;
}

//Transparency
function getTransparency()
{
return $this->Transparency;
}

function setTransparency( $transparency = null )
{
$this->Transparency = $transparency;
}

//get Captcha Code
function getCode()
{
return $this->Code;
}

//Generate Captcha
function generateCode()
{
$length = $this->getTextLength();
$this->Code = "";
while(strlen($this->Code)<$length){
mt_srand((double)microtime()*1000000);
$random=mt_rand(48,122);
$random=md5($random);
$this->Code .= substr($random, 17, 1);
}

return $this->Code;
}

function generateImage($text = null)
{
$im = imagecreatefrompng( $this->getBackgroundImage() );
$tColor = $this->getTextColor();
$txcolor = $this->colorDecode($tColor);
$bcolor = $this->getBackgroundColor();
$bgcolor = $this->colorDecode($bcolor);
$width = $this->getWidth();
$height = $this->getHeight();
$transprency = $this->getTransparency();
$this->im = imagecreate($width,$height);
$imgColor = imagecolorallocate($this->im, $bgcolor[red], $bgcolor[green], $bgcolor[blue]);
imagecopymerge($this->im,$im,0,0,0,0,$width,$height,$transprency);
$textcolor = imagecolorallocate($this->im, $txcolor[red], $txcolor[green], $txcolor[blue]);
$font = $this->getFont();
$fontsize=$this->getFontSize();
$minAngle = $this->getTextMinimumAngle();
$maxAngle = $this->getTextMaximumAngle();
$length = $this->getTextLength();

for($i=0;$i<$length;$i++){
imagettftext(
$this->im,
$fontsize,
rand(-$minAngle,$maxAngle),
$i*15+10,
$this->FontSize*1.2,
$textcolor,
$font,
substr($text, $i, 1));
}

imagepng($this->im);
imagedestroy($this->im);
}

function colorDecode( $hex ){

if(!isset($hex)) return FALSE;

$decoded[red] = hexdec(substr($hex, 0 ,2));
$decoded[green] = hexdec(substr($hex, 2 ,2));
$decoded[blue] = hexdec(substr($hex, 4 ,2));

return $decoded;

}
}
?>
[/sourcecode]

Untuk menggunakannya, silakan buat satu file php baru (misalnya: img.php) dan isi dengan source sbb:
[sourcecode language=”php”]
<?php
session_start();
require_once(‘class.simplecaptcha.php’);
/*
*****CONFIGURATION STARTS*****
*/
//Background Image
$config[‘BackgroundImage’] = "white.png";

//Background Color- HEX
$config[‘BackgroundColor’] = "F5F5F5";

//image height – same as background image
$config[‘Height’]=30;

//image width – same as background image
$config[‘Width’]=100;

//text font size
$config[‘Font_Size’]=23;

//text font style
$config[‘Font’]="arial.ttf";

//text angle to the left
$config[‘TextMinimumAngle’]=5;

//text angle to the right
$config[‘TextMaximumAngle’]=15;

//Text Color – HEX
$config[‘TextColor’]=’000000′;

//Number of Captcha Code Character
$config[‘TextLength’]=6;

//Background Image Transparency
$config[‘Transparency’]=50;

/*
*******CONFIGURATION ENDS******
*/

//Create a new instance of the captcha
$captcha = new SimpleCaptcha($config);

//Save the code as a session dependent string
$_SESSION[‘string’] = $captcha->Code;

?>
[/sourcecode]

Untuk menggunakan captcha ini, silakan load sebagai image:
[sourcecode language=”html”]
<img src="http://localhost/latihan/img.php" />
[/sourcecode]

atau contoh lengkapnya dalam satu form:
[sourcecode language=”php”]
<?php
session start();
<html>
<head>
<title>Simple CAPTCHA Class Application</title>
</head>
<body>
<?php
if (!$_POST[‘code’])
{
?>
<form id="demo" action="<?php echo $_SERVER[‘PHP_SELF’]; ?>?goto=login" method="POST">

Message:
<br/>
<textarea name="message" cols="25" rows="5" id="message" ></textarea>
<br/>
Validation Code:
<br/>
<img src="./captcha.php" alt="CAPTCHA">
<br>
<input type="text" name="code" size="30">
<br>
<input type="submit" value="Go">
</form>
<?php
}else{

//Check if userinput and CAPTCHA Code are equal
if ($_SESSION[‘string’] == $_POST[‘code’])
{
echo ‘<script>alert("Correct Code.");history.go(-1);</script>’;
}
else
{
echo ‘<script>alert("Incorrect Code.");history.go(-1);</script>’;
}
}
?>
</body>

</html>
[/sourcecode]

Menggunakan Custom Font

Dengan class ini, secara default font yang digunakan untuk dirender pada image captcha adalah font Arial. Kita bisa mengganti jenis font tersebut dengan mengganti pada parameter $config[‘font’] dengan (misalnya) calibri.ttf. Untuk mendapatkan file font tersebut, silakan browse ke C:\windows\fonts\ atau download dari internet.

Mengubah sudut tulis (angle) dari Font Captcha

Untuk mengubah sudut tulis dari huruf/angka captcha, silakan ubah variabel $config[‘TextMinimumAngle’] atau $config[‘TextMaximumAngle’].

Terbaru

  • Ini Trik Supaya Pengunjung Toko Online Kalian Jadi Pembeli Setia Pakai Omnisend!
  • 3 Strategi AI Terbukti Biar Bisnis E-Commerce Kalian Makin Cuan 2026!
  • Inilah 6 Langkah Tembus 5.000 Follower di X, Gini Caranya Supaya Akun Kalian Nggak Stuck Lagi!
  • SEO LinkedIn: Inilah Alasan Kenapa LinkedIn Ads Lebih Efektif Buat Bisnis B2B Dibanding Platform Lain
  • Inilah Alasan Kenapa Kolom Komentar YouTube Kalian Sering Menghilang Secara Misterius!
  • Cara Kelola Auto-Posting Semua Media Sosial Kalian Pakai Metricool
  • Studi Kasus Sukses Instagram Maria Wendt Dapat 12 Juta View Instagram Per Bulan
  • ZenBook S16, Vivobook Pro 15 OLED, ProArt PX13, dan ROG Zephyrus G14, Laptop Bagus dengan Layar OLED!
  • Caranya Ngebangun Website Directory dengan Traffic Tinggi dalam Seminggu!
  • Cara Mengembangkan Channel YouTube Shorts Tanpa Wajah
  • Inilah Cara Menghitung Diskon Baju Lebaran Biar Nggak Bingung Saat Belanja di Mall!
  • Cara Jitu Ngebangun Bisnis SaaS di Era AI Pakai Strategi Agentic Workflow
  • Inilah Rincian Gaji Polri Lulusan Baru 2026, Cek Perbedaan Jalur Akpol, Bintara, dan Tamtama Sebelum Daftar!
  • Inilah 5 Channel YouTube Membosankan yang Diam-diam Menghasilkan Banyak Uang
  • Inilah Cara Pakai Google Maps Offline Biar Mudik Lebaran 2026 Nggak Nyasar Meski Tanpa Sinyal!
  • Inilah Alasan Mahkamah Agung Tolak Kasasi Google, Denda Rp202,5 Miliar Resmi Menanti Akibat Praktik Monopoli
  • Inilah Cara Daftar dan Syarat SPMB SMK Boarding Jawa Tengah 2026, Sekolah Gratis Sampai Lulus!
  • Inilah Daftar Sekolah Kedinasan 2026 untuk Lulusan SMK, Bisa Kuliah Gratis dan Berpeluang Besar Langsung Jadi CPNS!
  • Inilah Pajak TER: Skema Baru PPh 21 yang Nggak Bikin Pusing, Begini Cara Hitungnya!
  • Inilah Jadwal Resmi Jam Buka Tol Jogja-Solo Segmen Prambanan-Purwomartani Saat Mudik Lebaran 2026
  • Inilah Cara Mendapatkan Witherbloom di Fisch Roblox, Rahasia Menangkap Ikan Paling Sulit di Toxic Grove!
  • Kenapa Indomart Point Bisa Kalahkan Bisnis Kafe?
  • Inilah Cara Mendapatkan Rotten Seed di Fisch Roblox, Lokasi Rahasia di Toxic Grove Buat Unlock Toxic Lotus!
  • Inilah Cara Zakat Crypto Kalian Bisa Jadi Pengurang Pajak Berdasarkan Aturan Resmi Pemerintah!
  • Inilah Perbandingan Airwallex vs Payoneer 2026: Jangan Sampai Profit Kalian Ludes Gara-Gara Biaya Admin!
  • Inilah Roadmap 7 Tahap Bangun Bisnis Digital dari Nol Biar Nggak Cuma Putar-Putar di Tempat!
  • Inilah Cara Tetap Gajian dari YouTube Meski View Masih Ratusan, Penasaran?
  • Inilah Alasan Akun TikTok Affiliate GMV 270 Juta Kena Banned Permanen!
  • Inilah Bahaya Astute Beta Server APK, Jangan Sembarang Klik Link Download FF Kipas 2026!
  • Inilah Bahaya Nonton Film di LK21 dan IndoXXI, Awas Data Pribadi dan Saldo Rekening Kalian Bisa Ludes!
  • Why is Your Laptop Touchpad Overheating? Here are the Causes and Fixes
  • How to Disable All AI Features in Chrome Using Windows 11 Registry
  • How to Avoid Problematic Windows Updates: A Guide to System Stability
  • What is Microsoft Visual C++ Redistributable and How to Fix Common Errors?
  • What is the 99% Deletion Bug? Understanding and Fixing Windows 11 File Errors
  • How to Use Orbax Checkpointing with Keras and JAX for Robust Training
  • How to Automate Any PDF Form Using the Power of Manus AI
  • How to Training Your Own YOLO26 Object Detection Model!
  • How to Build a Full-Stack Mobile App in Minutes with YouWare AI
  • How to Create Consistent Characters and Cinematic AI Video Production with Seedance
  • Apa itu Spear-Phishing via npm? Ini Pengertian dan Cara Kerjanya yang Makin Licin
  • Apa Itu Predator Spyware? Ini Pengertian dan Kontroversi Penghapusan Sanksinya
  • Mengenal Apa itu TONESHELL: Backdoor Berbahaya dari Kelompok Mustang Panda
  • Siapa itu Kelompok Hacker Silver Fox?
  • Apa itu CVE-2025-52691 SmarterMail? Celah Keamanan Paling Berbahaya Tahun 2025

©2026 emka.web.id | Design: Newspaperly WordPress Theme