Source for file RECaptcha.class.php

Documentation is available at RECaptcha.class.php

  1. <?php
  2. /**
  3.  * Módosítva: 2010.03.29.
  4.  *
  5.  * <b>Szerző weboldala:</b> {@link http://rimelek.hu/}<br />
  6.  * <b>Captcha weblapja:</b> {@link http://rimelek.hu/php-ellenorzo-kod-r-e-captcha-v1-0/ R.E. Captcha v1.0}
  7.  *
  8.  * Két féle üzemmódot felváltva használó Captcha.<br />
  9.  * 1. Random karakterek felismerése<br />
  10.  * 2. Egyszerű matematikai művelet megoldása.<br />
  11.  * Ezen kívül két féle módon jeleníthető meg. Egy részt kép típusú fájlban
  12.  * {@example examples/image.php}
  13.  * Más részt html kódba ágyazva, a kép forrását base64 kódolással
  14.  * az img tag src tulajdonságába helyezve
  15.  * {@example examples/html.php}
  16.  *
  17.  * @author Takács Ákos (Rimelek), programmer [at] rimelek [dot] hu
  18.  * @copyright Copyright (C) 2010, Takács Ákos
  19.  * @version 1.0
  20.  * @package RECaptcha
  21.  */
  22.  
  23.  
  24. /**
  25.  * Két féle üzemmódot felváltva használó Captcha.
  26.  * 1. Random karakterek felismerése
  27.  * 2. Egyszerű matematikai művelet megoldása
  28.  *
  29.  * @author Takács Ákos (Rimelek), programmer [at] rimelek [dot] hu
  30.  * @copyright 2008
  31.  * @package RECaptcha
  32.  */
  33.  
  34. class RECaptcha
  35. {
  36.     /**
  37.      * A kép típusa (jpeg, png, gif)
  38.      *
  39.      * @var string 
  40.      */
  41.     protected $type = 'jpeg';
  42.  
  43.     /**
  44.      * A kép szélessége
  45.      *
  46.      * @var int 
  47.      */
  48.     protected $width = 200;
  49.  
  50.     /**
  51.      * A kép magassága
  52.      *
  53.      * @var int 
  54.      */
  55.     protected $height = 50;
  56.  
  57.     /**
  58.      * Háttérszín RGB összetevői: R,G,B formátumban
  59.      *
  60.      * @var string 
  61.      */
  62.     protected $bgcolor = '255,255,255';
  63.  
  64.     /**
  65.      * Háttérszín azonosítója
  66.      *
  67.      * @var int 
  68.      */
  69.     protected $_bgcolor;
  70.  
  71.     /**
  72.      * Betűtípus ttf fájljának útvonala
  73.      *
  74.      * @var string 
  75.      */
  76.     protected $fonttype = 'fonts/arial.ttf';
  77.  
  78.     /**
  79.      * Háttérzavarás intenzitásának beállítása
  80.      *
  81.      * @var int 
  82.      */
  83.     protected $bgintensity = 10;
  84.  
  85.     /**
  86.      * A karakterek előttizavaró jelek intenzitása
  87.      *
  88.      * @var int 
  89.      */
  90.     protected $fgintensity = 5;
  91.  
  92.     /**
  93.      * Betűméret
  94.      *
  95.      * @var int 
  96.      */
  97.     protected $fontsize = 17;
  98.  
  99.     /**
  100.      * A Captcha által megjelenített képre adandó válasz értéke.
  101.      * Matematikai művelet esetén annak megoldása, karakterek
  102.      * esetén a megjelenített karakterek.
  103.      *
  104.      * @var string 
  105.      */
  106.     protected $text;
  107.  
  108.     /**
  109.      * {@link __toString()} -ben generált html img tag plusz paraméterei<br />
  110.      * Például:
  111.      * <code>
  112.      * $params = array('style'='width: 300px;', 'onclick'=>'eventHandler();');
  113.      * </code>
  114.      *
  115.      * @var array 
  116.      */
  117.     protected $params = array();
  118.  
  119.     /**
  120.      * Ezen nevű session változóba teszi be a captcha -ra adandó válasz értékét.
  121.      * Ezt lehet majd felhasználni az ellenőrzésnél.
  122.      *
  123.      * @var string 
  124.      */
  125.     protected $session_name = 'captcha_code';
  126.  
  127.     /**
  128.      * Karakterek közti minimális és maximális távolság pixelben
  129.      * A tömb első és második elemei sorrendben.
  130.      *
  131.      * @var array 
  132.      */
  133.     protected $spacerange = array(6,8);
  134.  
  135.     /**
  136.      * Captcha létrehozása különböző opciókkal. Az opciókról részletesebben a
  137.      * {@link setProperties()} metódus dokumentációjánál.
  138.      *
  139.      * @param array $options 
  140.      */
  141.     public function __construct($options=array())
  142.     {
  143.         $this->setProperties($options);
  144.     }
  145.  
  146.     /**
  147.      * Captcha opcióinak beállítása
  148.      *
  149.      * @param array $options Opciók asszociatív tömbje. Az opciók a következők
  150.      *         lehetnek:<br />
  151.      *         <ul>
  152.      *             <li><b>session_name:</b> {@link $session_name} </li>
  153.      *             <li><b>params:</b> {@link $params}</li>
  154.      *             <li><b>type:</b> {@link $type}</li>
  155.      *             <li><b>width:</b> {@link $width}</li>
  156.      *             <li><b>height:</b> {@link $height}</li>
  157.      *             <li><b>bgcolor:</b> {@link $bgcolor}</li>
  158.      *             <li><b>fonttype:</b> {@link $fonttype}</li>
  159.      *             <li><b>bgintensity:</b> {@link $bgintensity}</li>
  160.      *             <li><b>fgintensity:</b> {@link $fgintensity}</li>
  161.      *             <li><b>fontsize:</b> {@link $fontsize}</li>
  162.      *             <li><b>spacerange:</b> {@link $spacerange}</li>
  163.      *         </ul>
  164.      */
  165.     protected function setProperties(&$options)
  166.     {
  167.         if (isset($options['session_name']))
  168.         {
  169.             $this->session_name = $options['session_name'];
  170.         }
  171.         if (isset($options['params']))
  172.         {
  173.             $this->params = $options['params'];
  174.         }
  175.         if (isset($options['type']))
  176.         {
  177.             $this->type = $options['type'];
  178.         }
  179.         if (isset($options['width']))
  180.         {
  181.             $this->width = (int)$options['width'];
  182.         }
  183.         if (isset($options['height']))
  184.         {
  185.             $this->height = $options['height'];
  186.         }
  187.         if (isset($options['bgcolor']))
  188.         {
  189.             $this->bgcolor = $options['bgcolor'];
  190.         }
  191.         if (isset($options['fonttype']))
  192.         {
  193.             $this->fonttype = $options['fonttype'];
  194.         }
  195.         else
  196.         {
  197.             $this->fonttype = dirname(__FILE__).'/fonts/arial.ttf';
  198.         }
  199.         if (isset($options['bgintensity']))
  200.         {
  201.             $this->bgintensity = (int)$options['bgintensity'];
  202.         }
  203.         if (isset($options['fgintensity']))
  204.         {
  205.             $this->fgintensity = (int)$options['fgintensity'];
  206.         }
  207.         if (isset($options['fontsize']))
  208.         {
  209.             $this->fontsize = (int)$options['fontsize'];
  210.         }
  211.         if (isset($options['spacerange']and
  212.                 is_array($options['spacerange']and count($options['spacerange']))
  213.         {
  214.             $this->spacerange[0= (int)array_shift($options['spacerange']);
  215.             $this->spacerange[1count($options['spacerange'])
  216.                 ? array_shift($options['spacerange'])
  217.                 : $this->spacerange[0];
  218.  
  219.         }
  220.  
  221.     }
  222.  
  223.     /**
  224.      * Kép kimenetre küldése.
  225.      *
  226.      * @param bool $bool ha true, akkor nem küld Content-type header-t.
  227.      *             Ez a {@link __toString()} metódusnál lényeges.
  228.      */
  229.     public function flush($bool=false)
  230.     {
  231.         //kép típus beállítása
  232.         $type strtolower($this->type);
  233.         if($type == 'jpg'$type 'jpeg'}
  234.         if($type != 'jpeg' and $type != 'gif' and $type != 'png'{
  235.             $type 'jpeg';
  236.         }
  237.         //kép létrehozása
  238.         $this->source imageCreateTrueColor($this->width,$this->height);
  239.         $this->type = $type;
  240.         $color explode(',',$this->bgcolor);
  241.         $this->setBackground($color[0],$color[1],$color[2]);
  242.  
  243.         $this->randomBg($this->bgintensity);
  244.  
  245.         $_SESSION[$this->session_name$this->text = $this->codeGenerator($this->fontsize);
  246.  
  247.         $this->randomBg($this->fgintensity);
  248.  
  249.         $create_image 'image'.$this->type;
  250.  
  251.         //kép típus fejléce
  252.         if (!$bool)
  253.         {
  254.             header("Content-type: image/$type");
  255.         }
  256.         $create_image($this->source);
  257.     }
  258.  
  259.     /**
  260.      *
  261.      * @param mixed $bgcolor Ha a második két paraméter is meg van adva,
  262.      *             akkor az RGB színösszetevők vörös komponense. egyébként
  263.      *             2 formátum engedélyezett.
  264.      *             <ul>
  265.      *                 <li><b>Decimális:</b> R,G,B</li>
  266.      *                 <li><b>Hexa:</b> #RGB</li>
  267.      *             </ul>
  268.      *
  269.      * @param int $greenc RGB zöld komponense (decimális)
  270.      * @param int $bluec RGB kék komponense (decimális)
  271.      */
  272.     protected function setBackground($bgcolor,$greenc=null,$bluec=null)
  273.     {
  274.         //ha mind a három paraméter meg van adva
  275.         if(!is_null($bluecand !is_null($greenc)) {
  276.             $red $bgcolor;
  277.             $green $greenc;
  278.             $blue $bluec;
  279.         //ha csak az első paraméter van megadva
  280.         else {
  281.             //akkor ha # jellel kezdődik
  282.             if(substr($bgcolor,0,1== '#'{
  283.                 //hexadecimális formátumnak tekinti.
  284.                 //felbontja 3 részre és decimálisba váltja a részeket
  285.                 $red_hex substr($bgcolor,1,2);
  286.                 $green_hex substr($bgcolor,3,2);
  287.                 $blue_hex substr($bgcolor,5,2);
  288.                 $red hexdec($red_hex);
  289.                 $green hexdec($green_hex);
  290.                 $blue hexdec($blue_hex);
  291.             //egyébként
  292.             else {
  293.                 //vesszök mentén 3 részre vágja a színt (rgb)
  294.                 $bgcolor explode(',',$bgcolor);
  295.                 $red $bgcolor[0];
  296.                 $green $bgcolor[1];
  297.                 $blue $bgcolor[2];
  298.             }
  299.         }
  300.         //háttér szín generálása
  301.         $bgcolor imageColorAllocate($this->source,$red,$green,$blue);
  302.         //szín kitöltés
  303.         imagefill($this->source,1,1,$bgcolor);
  304.         $this->_bgcolor = $bgcolor;
  305.     }
  306.  
  307.     /**
  308.      * Random kép torzítás
  309.      *
  310.      * @param int $intensity Torzítás erőssége
  311.      */
  312.     protected function randomBg($intensity)
  313.     {
  314.         //torzítás
  315.         for($i=1;$i<=$intensity;$i++{
  316.             $func mt_rand(1,2);
  317.             //ha a $func 1
  318.             if($func == 1{
  319.                 //akkor elipsziseket rajzol a háttérbe
  320.                 //elipszis közepének X koordinátája
  321.                 $cx mt_rand(1,$this->width);
  322.                 //elipszis közepének Y koordinátája
  323.                 $cy mt_rand(1,$this->height);
  324.                 //szélessége
  325.                 $width mt_rand(1,$this->width);
  326.                 //magassága
  327.                 $height mt_rand(1,$this->height);
  328.                 //elipszis színének random választása
  329.                 $ellipse_red mt_rand(0,255);
  330.                 $ellipse_green mt_rand(0,255);
  331.                 $ellipse_blue mt_rand(0,255);
  332.                 $color imageColorAllocate($this->source,$ellipse_red,$ellipse_green,$ellipse_blue);
  333.                 //elipszis kirajzolása
  334.                 imageellipse($this->source,$cx,$cy,$width,$height,$color);
  335.             //de ha a $func nem 1
  336.             else {
  337.                 //akkor vonalakat rajzol
  338.                 //színek ranfom választása
  339.                 $line_blue mt_rand(0,255);
  340.                 $line_green mt_rand(0,255);
  341.                 $line_red mt_rand(0,255);
  342.                 $color imageColorAllocate($this->source,$line_red,$line_green,$line_blue);
  343.                 //koordináták
  344.                 $x1 mt_rand(1,$this->width);
  345.                 $x2 mt_rand(1,$this->width);
  346.                 $y1 mt_rand(1,$this->height);
  347.                 $y2 mt_rand(1,$this->height);
  348.                 //vonal rajzolása
  349.                 imageline($this->source,$x1,$x2,$y1,$y2,$color);
  350.             }
  351.         }
  352.     }
  353.  
  354.     /**
  355.      * Captcha kód generálása a képre
  356.      *
  357.      * @param int $fontsize Betűméret
  358.      * @return string A szükséges válasz {@link $text}
  359.      */
  360.     protected function codeGenerator($fontsize)
  361.     {
  362.         if (!file_exists($this->fonttype))
  363.         {
  364.             exit('<b>'.$this->fonttype.'</b> not found!');
  365.         }
  366.         //ha a generált szám 0
  367.         if(mt_rand(0,1== 0{
  368.             //akkor karaktersorozatot generál
  369.  
  370.             //generálható karakterek listája
  371.             $chars array_merge(range('A','Z'),range(0,9));
  372.             shuffle($chars);
  373.             //karakterek generálása
  374.             $keys array_rand($chars,7);
  375.             foreach($keys as $key=>$value{
  376.                 $text[$chars[$value];
  377.             }
  378.  
  379.             $max_height 0;
  380.  
  381.             $maxleftx 0;
  382.             $rightx 0;
  383.             $space 0;
  384.             $textLength count($text);
  385.             $angles array_rand(array_fill(0,200,''),$textLength);
  386.  
  387.             //karakterek generálása ciklusban
  388.             for($i=0;$i$textLength;$i++{
  389.                 //karakter szögelfordulása
  390.                 $angles[$i$angles[$i20;//mt_rand(1,20);
  391.                 //ha páros, akkor negatívra állítja
  392.                 if($angles[$i== 0$angles[$i0-$angles[$i]}
  393.                 //karakter által elfoglalt terület koordinátái
  394.                 $ttfbox[$iimagettfbbox($fontsize,$angles[$i],$this->fonttype,$text[$i]);
  395.                 //karakter magassága
  396.                 $height abs($ttfbox[$i][1]abs($ttfbox[$i][7]);
  397.                 $leftx max(abs($ttfbox[$i][0]),abs($ttfbox[$i][6]));
  398.                 $maxleftx += $leftx+$rightx+$space;
  399.                 $rightx max(abs($ttfbox[$i][2]),abs($ttfbox[$i][4]));
  400.                 //karakter X koordinátájának megadása
  401.                 $x[$i$maxleftx;
  402.                 //betüköz megadása ha nem az utolsó betűrúl van szó
  403.                 $space (($i $textLength-1)  mt_rand($this->spacerange[0],$this->spacerange[1]0);
  404.                 //legmagasabb betű meghatározása
  405.                 $max_height ($height $max_height$height $max_height;
  406.             }
  407.             //betük középre igazítása függőlegesen
  408.             $y (($this->height - $max_height2$max_height;
  409.             //karaktersorozat középre igazítása vizszintesen
  410.             $offset ($this->width - (end($x)+$rightx)) 2;
  411.             //karakterek kiirása
  412.             for($i=0$i<$textLength;$i++{
  413.                 //véletlen színgenerálás
  414.                 $color imageColorAllocate($this->source,mt_rand(0,255),255-mt_rand(170,255),255);
  415.                 //szöveg kiirása
  416.                 imagettftext($this->source,$this->fontsize,$angles[$i],$offset+$x[$i],$y,$color,$this->fonttype,$text[$i]);
  417.             }
  418.             //visszaadja a kiiírt szöveget
  419.             return strtolower(implode('',$text));
  420.         //ha a generált szám nem 0
  421.         else {
  422.             //akkor számolni kell
  423.  
  424.             //első operandus
  425.             $operandus1 mt_rand(40,300);
  426.             //müveletek listája
  427.             $operators array('x'=>'0','+'=>'1','-'=>'2');
  428.             //művelet meghatározása
  429.             $operator array_rand($operators,1);
  430.             //ha a művelet szorzás,
  431.             if($operator == 'x'{
  432.                 //és az első operandus 100-nál kisebb
  433.                 if($operandus1 100{
  434.                     //a második operandus max
  435.                     $maxop2 2;
  436.                 //egyébként
  437.                 else {
  438.                     //második operandus max
  439.                     $maxop2 1;
  440.                 }
  441.             //de ha összeadás van
  442.             else if($operator == '+'{
  443.                 //a második operandus lehet 10 is
  444.                 $maxop2 10;
  445.             //kivonásnál
  446.             else if($operator == '-'{
  447.                 //a második operandus max 5 lehet
  448.                 $maxop2 5;
  449.             }
  450.             //második operandus megadása
  451.             $operandus2 mt_rand(1,$maxop2);
  452.  
  453.             //szorzás
  454.             if($operator == 'x'{
  455.                 $eredmeny $operandus1 $operandus2;
  456.             //összeadás
  457.             else if($operator == '+'{
  458.                 $eredmeny $operandus1 $operandus2;
  459.             //kivonás
  460.             else if($operator == '-'{
  461.                 $eredmeny $operandus1 $operandus2;
  462.             }
  463.  
  464.             //a megjelenítendő szöveg összerakása
  465.             $text $operandus1 .' '$operator .' '$operandus2 .' = ? ';
  466.             //befoglaló téglalap koordinátái
  467.             $ttfbox imagettfbbox($fontsize,0,$this->fonttype,$text);
  468.             //középre állítás vizszintesen
  469.             $x (($this->width - (abs($ttfbox[0]abs($ttfbox[2])) ) abs($ttfbox[0]);
  470.             //középre állítás függőlegesen
  471.             $y (($this->height - (abs($ttfbox[1]abs($ttfbox[7])) ) 2abs($ttfbox[7]);
  472.             //szín
  473.             $color imageColorAllocate($this->source,255,0,255);
  474.             //szöveg megjelenítése
  475.             imagettftext($this->source,$this->fontsize,0,$x,$y,$color,$this->fonttype,$text);
  476.             //visszaadja a beirandó eredményt
  477.             return (string)$eredmeny;
  478.         }
  479.     }
  480.  
  481.     /**
  482.      * A kép html img tagba helyezve base64 encode-olással.
  483.      *
  484.      * @return string 
  485.      */
  486.     public function __toString()
  487.     {
  488.         ob_start();
  489.         $this->flush(true);
  490.         $src ob_get_clean();
  491.         $params '';
  492.         foreach ($this->params as $key=>&$param)
  493.         {
  494.             $params .= $key.'="'.$param.'" ';
  495.         }
  496.         return '<img src="data:image/'.$this->type .';base64,'.base64_encode($src).'" '.$params .' />';
  497.     }
  498. }
  499. ?>

Documentation generated on Sun, 04 Apr 2010 22:43:49 +0200 by phpDocumentor 1.4.1