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

Documentation generated on Mon, 29 Mar 2010 19:52:11 +0200 by phpDocumentor 1.4.1