Membuat Captcha Code Sendiri Menggunakan Php
Jurnalcode.com


Jurnalcode : Tutorial kali ini saya akan menulis bagaimana membuat captcha sendiri menggunakan php. nah captcha ini berguna untuk menangkal serangan spam. captcha biasa digunakan di sebuah form yang diakses secara umum oleh banyak orang sebagai contoh form kontak. tanpa perlundungan captcha form kontak biasanya dibanjiri oleh ribuah spam yang masuk .

Oke langsung saja kita bahas bagaimana membuat captcha Code Sendiri Dengan Php. Pertama Kita buat fungsi captcha terlebih dahulu . perhatikan code berikut :

<?php
class fungsi_captcha 
{
    
    var $word = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    var $length = 5;
    var $img_width = 160;
    var $img_height = 50;
    var $font_path = '';
    var $font_size = 25;
    var $expiration = 7200;
    var $bg_color = '#ffffff';
    var $border_color = '#996666';
    var $text_color = '#cc9999';
    var $grid_color = '#ffb6b6';
    var $shadow_color = '#fff0f0';
    
    public function __construct($config = array()){
        ob_start();
        session_start();
        if (count($config) > 0){
            foreach ($config as $key => $val){
                if (isset($this->$key)){
                    $method = 'set_'.$key;
                    if (method_exists($this, $method)){
                        $this->$method($val);
                    }else{
                        $this->$key = $val;
                    }
                }
            }
        }
        
        if ( ! extension_loaded('gd')){
            return FALSE;
        }
    }
    
    public function createCaptcha(){
        $str = '';
        for ($i = 0; $i < $this->length; $i++){
            $str .= substr($this->word, mt_rand(0, strlen($this->word) -1), 1);
        }
        $word = $str;

       
        $length = strlen($word);
        $angle  = ($length >= 6) ? rand(-($length-6), ($length-6)) : 0;
        $x_axis = rand(6, (360/$length)-16);
        $y_axis = ($angle >= 0 ) ? rand($this->img_height, $this->img_width) : rand(6, $this->img_height);

       
        if (function_exists('imagecreatetruecolor')){
            $im = imagecreatetruecolor($this->img_width, $this->img_height);
        }else{
            $im = imagecreate($this->img_width, $this->img_height);
        }

       
        $bgColorRgb     = $this->hexToRgb($this->bg_color);
        $borderColorRgb = $this->hexToRgb($this->border_color);
        $textColorRgb   = $this->hexToRgb($this->text_color);
        $gridColorRgb   = $this->hexToRgb($this->grid_color);
        $shadowColorRgb = $this->hexToRgb($this->shadow_color);
        $bg_color       = imagecolorallocate ($im, $bgColorRgb[0], $bgColorRgb[1], $bgColorRgb[2]);
        $border_color   = imagecolorallocate ($im, $borderColorRgb[0], $borderColorRgb[1], $borderColorRgb[2]);
        $text_color     = imagecolorallocate ($im, $textColorRgb[0], $textColorRgb[1], $textColorRgb[2]);
        $grid_color     = imagecolorallocate($im, $gridColorRgb[0], $gridColorRgb[1], $gridColorRgb[2]);
        $shadow_color   = imagecolorallocate($im, $shadowColorRgb[0], $shadowColorRgb[1], $shadowColorRgb[2]);

       
        ImageFilledRectangle($im, 0, 0, $this->img_width, $this->img_height, $bg_color);

       
        $theta   = 1;
        $thetac  = 7;
        $radius  = 16;
        $circles = 20;
        $points  = 32;

        for ($i = 0; $i < ($circles * $points) - 1; $i++){
            $theta = $theta + $thetac;
            $rad   = $radius * ($i / $points );
            $x     = ($rad * cos($theta)) + $x_axis;
            $y     = ($rad * sin($theta)) + $y_axis;
            $theta = $theta + $thetac;
            $rad1  = $radius * (($i + 1) / $points);
            $x1    = ($rad1 * cos($theta)) + $x_axis;
            $y1    = ($rad1 * sin($theta )) + $y_axis;
            imageline($im, $x, $y, $x1, $y1, $grid_color);
            $theta = $theta - $thetac;
        }

       
        $use_font = ($this->font_path != '' AND file_exists($this->font_path) AND function_exists('imagettftext')) ? TRUE : FALSE;

        $x = rand(0, $this->img_width/($length/1.5));
        $y = $this->font_size+2;

        for ($i = 0; $i < strlen($word); $i++)
        {
            if ($use_font == FALSE){
                $y = rand(0 , $this->img_height/2);
                imagestring($im, $this->font_size, $x, $y, substr($word, $i, 1), $text_color);
                $x += ($this->font_size);
            }else{
                $y = rand($this->img_height/2, $this->img_height-3);
                imagettftext($im, $this->font_size, $angle, $x, $y, $text_color, $this->font_path, substr($word, $i, 1));
                $x += $this->font_size;
            }
        }

        
        imagerectangle($im, 0, 0, $this->img_width-1, $this->img_height-1, $border_color);

       
        imagejpeg($im,NULL,90);
        header('Content-Type: image/jpeg');
        imagedestroy($im);
        
       
        if(empty(session_id()))
        unset($_SESSION['captchaCode']);
        $_SESSION['captchaCode'] = $word;
    }
    
    public function hexToRgb($hex){
        $hex = str_replace("#", "", $hex);
        if(strlen($hex) == 3) {
           $r = hexdec(substr($hex,0,1).substr($hex,0,1));
           $g = hexdec(substr($hex,1,1).substr($hex,1,1));
           $b = hexdec(substr($hex,2,1).substr($hex,2,1));
        } else {
           $r = hexdec(substr($hex,0,2));
           $g = hexdec(substr($hex,2,2));
           $b = hexdec(substr($hex,4,2));
        }
        $rgb = array($r, $g, $b);
        return $rgb;
    }
}

?>

 

Langkah selanjutnya mari kita buat form nya . perhatikan code berikut :

<?php
session_start();
if(isset($_POST['submit']) && !empty($_POST['submit'])){
    if(!empty($_POST['captcha_code'])){
        
        $captchaCode = $_SESSION['captchaCode'];
        $enteredcaptchaCode = $_POST['captcha_code'];
        if($enteredcaptchaCode === $captchaCode){
            $succMsg = 'Berhasil , captcha cocok.';
        }else{
            $errMsg = 'captcha Tidak Cocok Silahkan coba Kembali.';
        }
        
    }else{
        $errMsg = 'Silahkan Masukan Code captcha .';
    }
}
?>

<?php if(!empty($errMsg)) echo '<p style="color:#EA4335;">'.$errMsg.'</p>';?>
<?php if(!empty($succMsg)) echo '<p style="color:#34A853;">'.$succMsg.'</p>';?>

<img src="captcha.php" id="capImage"/>
<br/>refresh jika captcha tidak muncul <a href="javascript:void(0);" onclick="javascript:$('#capImage').attr('src','captcha.php');">refresh</a>.
<form method="post">
    Masukan code: <input name="captcha_code" type="text" value="">
    <input type="submit" name="submit" value="SUBMIT">
</form>

 

Nah disini kita juga memerlukan bantuk jqury untuk reload image captcha  saat captcha tidak muncul . silahkan tambahkan code berikut :

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

 

Untuk Penerapannya adalah sebagai berikut :

<?php
include 'fungsi_captcha.php';
$captchaConfig = array(
     'img_width' => '200',
     'img_height' => '50',
     'font_size' => '30',
     'font_path' => 'fonts/monofont.ttf',
 );
$captcha = new fungsi_captcha($captchaConfig);
$captcha->createCaptcha();
?>

 

Selamat Mencoba . Jika ada pertanyaan silahkan komentar dibawah .. terimakasih

 

 

.

Ayo Komentar