Вход Регистрация
Файл: captcha.php
Строк: 256
<?php

/**
* @package     JohnCMS
* @link        http://johncms.com
* @copyright   Copyright (C) 2008-2011 JohnCMS Community
* @license     LICENSE.txt (see attached file)
* @version     VERSION.txt (see attached file)
* @author      http://johncms.com/about
*
* Данный модуль построен на основе алгоритма и кода KCAPTCHA v.1.2.6
* KCAPTCHA PROJECT, Copyright by Kruglov Sergei, 2006, 2007, 2008
* www.captcha.ru, www.kruglov.ru
*/

class KCAPTCHA {
    
// generates keystring and image
    
function KCAPTCHA() {
        
////////////////////////////////////////////////////////////
        // Настройки CAPTCHA                                      //
        ////////////////////////////////////////////////////////////
        
$alphabet "0123456789abcdefghijklmnopqrstuvwxyz";
        
//$allowed_symbols = "0123456789";
        
$allowed_symbols "23456789abcdeghkmnpqsuvxyz"// Не ставить похожие символы (o=0, 1=l, i=j, t=f)
        
$fontsdir 'images/captcha';
        
$length mt_rand(45);
        
$width 100;
        
$height 50;
        
$fluctuation_amplitude 5;
        
$no_spaces true;
        
$show_credits false;
        
$credits '';
        
$foreground_color = array (
            
mt_rand(0100),
            
mt_rand(0100),
            
mt_rand(0100)
        );

        
$background_color = array (
            
mt_rand(200255),
            
mt_rand(200255),
            
mt_rand(200255)
        );

        
$jpeg_quality 90;
        
////////////////////////////////////////////////////////////
        
$fonts = array ();
        
$fontsdir_absolute dirname(__FILE__) . '/' $fontsdir;

        if ((
$handle opendir($fontsdir_absolute)) !== false) {
            while (
false !== ($file readdir($handle))) {
                if (
preg_match('/.png$/i'$file)) {
                    
$fonts[] = $fontsdir_absolute '/' $file;
                }
            }
            
closedir($handle);
        }
        
$alphabet_length strlen($alphabet);

        do {
            
// generating random keystring
            
while (true) {
                
$this->keystring '';
                for (
$i 0$i $length$i++) {
                    
$this->keystring .= $allowed_symbols{mt_rand(0strlen($allowed_symbols) - 1)};
                }
                if (!
preg_match('/cp|cb|ck|c6|c9|rn|rm|mm|co|do|cl|db|qp|qb|dp|ww/'$this->keystring))
                    break;
            }
            
$font_file $fonts[mt_rand(0count($fonts) - 1)];
            
$font imagecreatefrompng($font_file);
            
imagealphablending($fonttrue);
            
$fontfile_width imagesx($font);
            
$fontfile_height imagesy($font) - 1;
            
$font_metrics = array ();
            
$symbol 0;
            
$reading_symbol false;
            
// loading font
            
for ($i 0$i $fontfile_width && $symbol $alphabet_length$i++) {
                
$transparent = (imagecolorat($font$i0) >> 24) == 127;
                if (!
$reading_symbol && !$transparent) {
                    
$font_metrics[$alphabet{$symbol}] = array ('start' => $i);
                    
$reading_symbol true;
                    continue;
                }
                if (
$reading_symbol && $transparent) {
                    
$font_metrics[$alphabet{$symbol}]['end'] = $i;
                    
$reading_symbol false;
                    
$symbol++;
                    continue;
                }
            }
            
$img imagecreatetruecolor($width$height);
            
imagealphablending($imgtrue);
            
$white imagecolorallocate($img255255255);
            
imagefilledrectangle($img00$width 1$height 1$white);
            
// draw text
            
$x 1;
            for (
$i 0$i $length$i++) {
                
$m $font_metrics[$this->keystring{$i}];
                
$y mt_rand(-$fluctuation_amplitude$fluctuation_amplitude) + ($height $fontfile_height) / 2;
                if (
$no_spaces) {
                    
$shift 0;
                    if (
$i 0) {
                        
$shift 10000;
                        for (
$sy 7$sy $fontfile_height 20$sy += 1) {
                            for (
$sx $m['start'] - 1$sx $m['end']; $sx += 1) {
                                
$rgb imagecolorat($font$sx$sy);
                                
$opacity $rgb >> 24;
                                if (
$opacity 127) {
                                    
$left $sx $m['start'] + $x;
                                    
$py $sy $y;
                                    if (
$py $height)
                                        break;
                                    for (
$px min($left$width 1); $px $left 12 && $px >= 0$px -= 1) {
                                        
$color imagecolorat($img$px$py) & 0xff;
                                        if (
$color $opacity 190) {
                                            if (
$shift $left $px) {
                                                
$shift $left $px;
                                            }
                                            break;
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                        if (
$shift == 10000) {
                            
$shift mt_rand(46);
                        }
                    }
                } else {
                    
$shift 1;
                }
                
imagecopy($img$font$x $shift$y$m['start'], 1$m['end'] - $m['start'], $fontfile_height);
                
$x += $m['end'] - $m['start'] - $shift;
            }
        } while (
$x >= $width 10); // while not fit in canvas
        
$center $x 2;
        
// credits. To remove, see configuration file
        
$img2 imagecreatetruecolor($width$height + ($show_credits 12 0));
        
$foreground imagecolorallocate($img2$foreground_color[0], $foreground_color[1], $foreground_color[2]);
        
$background imagecolorallocate($img2$background_color[0], $background_color[1], $background_color[2]);
        
imagefilledrectangle($img200$width 1$height 1$background);
        
imagefilledrectangle($img20$height$width 1$height 12$foreground);
        
$credits = empty($credits) ? $_SERVER['HTTP_HOST'] : $credits;
        
imagestring($img22$width imagefontwidth(2) * strlen($credits) / 2$height 2$credits$background);
        
// periods
        
$rand1 mt_rand(7500001200000) / 10000000;
        
$rand2 mt_rand(7500001200000) / 10000000;
        
$rand3 mt_rand(7500001200000) / 10000000;
        
$rand4 mt_rand(7500001200000) / 10000000;
        
// phases
        
$rand5 mt_rand(031415926) / 10000000;
        
$rand6 mt_rand(031415926) / 10000000;
        
$rand7 mt_rand(031415926) / 10000000;
        
$rand8 mt_rand(031415926) / 10000000;
        
// amplitudes
        
$rand9 mt_rand(330420) / 110;
        
$rand10 mt_rand(330450) / 110;

        
//wave distortion
        
for ($x 0$x $width$x++) {
            for (
$y 0$y $height$y++) {
                
$sx $x + (sin($x $rand1 $rand5) + sin($y $rand3 $rand6)) * $rand9 $width $center 1;
                
$sy $y + (sin($x $rand2 $rand7) + sin($y $rand4 $rand8)) * $rand10;
                if (
$sx || $sy || $sx >= $width || $sy >= $height 1) {
                    continue;
                } else {
                    
$color imagecolorat($img$sx$sy) & 0xFF;
                    
$color_x imagecolorat($img$sx 1$sy) & 0xFF;
                    
$color_y imagecolorat($img$sx$sy 1) & 0xFF;
                    
$color_xy imagecolorat($img$sx 1$sy 1) & 0xFF;
                }
                if (
$color == 255 && $color_x == 255 && $color_y == 255 && $color_xy == 255) {
                    continue;
                } else if (
$color == && $color_x == && $color_y == && $color_xy == 0) {
                    
$newred $foreground_color[0];
                    
$newgreen $foreground_color[1];
                    
$newblue $foreground_color[2];
                } else {
                    
$frsx $sx floor($sx);
                    
$frsy $sy floor($sy);
                    
$frsx1 $frsx;
                    
$frsy1 $frsy;

                    
$newcolor = ($color $frsx1 $frsy1 $color_x $frsx $frsy1 $color_y $frsx1 $frsy $color_xy $frsx $frsy);
                    if (
$newcolor 255)
                        
$newcolor 255;
                    
$newcolor $newcolor 255;
                    
$newcolor0 $newcolor;
                    
$newred $newcolor0 $foreground_color[0] + $newcolor $background_color[0];
                    
$newgreen $newcolor0 $foreground_color[1] + $newcolor $background_color[1];
                    
$newblue $newcolor0 $foreground_color[2] + $newcolor $background_color[2];
                }
                
imagesetpixel($img2$x$yimagecolorallocate($img2$newred$newgreen$newblue));
            }
        }
        
ob_start();
        
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
        
header('Cache-Control: no-store, no-cache, must-revalidate');
        
header('Cache-Control: post-check=0, pre-check=0'FALSE);
        
header('Pragma: no-cache');
        
$ext '';
        if (
function_exists("imagejpeg")) {
            
header("Content-Type: image/jpeg");
            
imagejpeg($img2null$jpeg_quality);
            
$ext 'jpg';
        } else if (
function_exists("imagegif")) {
            
header("Content-Type: image/gif");
            
imagegif($img2);
            
$ext 'gif';
        } else if (
function_exists("imagepng")) {
            
header("Content-Type: image/x-png");
            
imagepng($img2);
            
$ext 'png';
        }
        
header('Content-Disposition: inline; filename=' . ((rand(109999))) . '.' $ext);
        
header('Content-Length: ' ob_get_length());
        
ob_end_flush();
    }

    
// returns keystring
    
function getKeyString() { return $this->keystring; }
}

// Обрабатываем запрос на картинку CAPTCHA
session_name('SESID');
session_start();
$captcha = new KCAPTCHA();
$_SESSION['code'] = $captcha->getKeyString();
?>
Онлайн: 0
Реклама