Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>First, it's bad idea to store captcha in cookies because right captcha can be easily read from cookies by bot. Better use session or some storage instead.</p> <p>Second, there are some variables initialized in kcaptcha_config.php file, you need to move required variables initialization to your functions</p> <p>Get text function:</p> <pre><code>function make_text() { // generating random keystring while(true){ $keystring=''; for($i=0;$i&lt;$length;$i++){ $keystring.=$allowed_symbols{mt_rand(0,strlen($allowed_symbols)-1)}; } if(!preg_match('/cp|cb|ck|c6|c9|rn|rm|mm|co|do|cl|db|qp|qb|dp|ww/', $keystring)) break; } return $keystring; } </code></pre> <p>$length and $allowed_symbols are defined in kcaptcha_config.php</p> <p>I did not check all the variables in next function, but i'm sure there will be a lot of errors.</p> <pre><code>function make_captcha($keystring){ $fonts=array(); $fontsdir_absolute=dirname(__FILE__).'/'.$fontsdir; if ($handle = opendir($fontsdir_absolute)) { while (false !== ($file = readdir($handle))) { if (preg_match('/\.png$/i', $file)) { $fonts[]=$fontsdir_absolute.'/'.$file; } } closedir($handle); } $alphabet_length=strlen($alphabet); do{ $font_file=$fonts[mt_rand(0, count($fonts)-1)]; $font=imagecreatefrompng($font_file); imagealphablending($font, true); $fontfile_width=imagesx($font); $fontfile_height=imagesy($font)-1; $font_metrics=array(); $symbol=0; $reading_symbol=false; // loading font for($i=0;$i&lt;$fontfile_width &amp;&amp; $symbol&lt;$alphabet_length;$i++){ $transparent = (imagecolorat($font, $i, 0) &gt;&gt; 24) == 127; if(!$reading_symbol &amp;&amp; !$transparent){ $font_metrics[$alphabet{$symbol}]=array('start'=&gt;$i); $reading_symbol=true; continue; } if($reading_symbol &amp;&amp; $transparent){ $font_metrics[$alphabet{$symbol}]['end']=$i; $reading_symbol=false; $symbol++; continue; } } $img=imagecreatetruecolor($width, $height); imagealphablending($img, true); $white=imagecolorallocate($img, 255, 255, 255); $black=imagecolorallocate($img, 0, 0, 0); imagefilledrectangle($img, 0, 0, $width-1, $height-1, $white); // draw text $x=1; $odd=mt_rand(0,1); if($odd==0) $odd=-1; for($i=0;$i&lt;$length;$i++){ $m=$font_metrics[$keystring{$i}]; $y=(($i%2)*$fluctuation_amplitude - $fluctuation_amplitude/2)*$odd + mt_rand(-round($fluctuation_amplitude/3), round($fluctuation_amplitude/3)) + ($height-$fontfile_height)/2; if($no_spaces){ $shift=0; if($i&gt;0){ $shift=10000; for($sy=3;$sy&lt;$fontfile_height-10;$sy+=1){ for($sx=$m['start']-1;$sx&lt;$m['end'];$sx+=1){ $rgb=imagecolorat($font, $sx, $sy); $opacity=$rgb&gt;&gt;24; if($opacity&lt;127){ $left=$sx-$m['start']+$x; $py=$sy+$y; if($py&gt;$height) break; for($px=min($left,$width-1);$px&gt;$left-200 &amp;&amp; $px&gt;=0;$px-=1){ $color=imagecolorat($img, $px, $py) &amp; 0xff; if($color+$opacity&lt;170){ // 170 - threshold if($shift&gt;$left-$px){ $shift=$left-$px; } break; } } break; } } } if($shift==10000){ $shift=mt_rand(4,6); } } }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&gt;=$width-10); // while not fit in canvas //noise $white=imagecolorallocate($font, 255, 255, 255); $black=imagecolorallocate($font, 0, 0, 0); for($i=0;$i&lt;(($height-30)*$x)*$white_noise_density;$i++){ imagesetpixel($img, mt_rand(0, $x-1), mt_rand(10, $height-15), $white); } for($i=0;$i&lt;(($height-30)*$x)*$black_noise_density;$i++){ imagesetpixel($img, mt_rand(0, $x-1), mt_rand(10, $height-15), $black); } $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($img2, 0, 0, $width-1, $height-1, $background); imagefilledrectangle($img2, 0, $height, $width-1, $height+12, $foreground); $credits=empty($credits)?$_SERVER['HTTP_HOST']:$credits; imagestring($img2, 2, $width/2-imagefontwidth(2)*strlen($credits)/2, $height-2, $credits, $background); // periods $rand1=mt_rand(750000,1200000)/10000000; $rand2=mt_rand(750000,1200000)/10000000; $rand3=mt_rand(750000,1200000)/10000000; $rand4=mt_rand(750000,1200000)/10000000; // phases $rand5=mt_rand(0,31415926)/10000000; $rand6=mt_rand(0,31415926)/10000000; $rand7=mt_rand(0,31415926)/10000000; $rand8=mt_rand(0,31415926)/10000000; // amplitudes $rand9=mt_rand(330,420)/110; $rand10=mt_rand(330,450)/100; //wave distortion for($x=0;$x&lt;$width;$x++){ for($y=0;$y&lt;$height;$y++){ $sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1; $sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10; if($sx&lt;0 || $sy&lt;0 || $sx&gt;=$width-1 || $sy&gt;=$height-1){ continue; }else{ $color=imagecolorat($img, $sx, $sy) &amp; 0xFF; $color_x=imagecolorat($img, $sx+1, $sy) &amp; 0xFF; $color_y=imagecolorat($img, $sx, $sy+1) &amp; 0xFF; $color_xy=imagecolorat($img, $sx+1, $sy+1) &amp; 0xFF; } if($color==255 &amp;&amp; $color_x==255 &amp;&amp; $color_y==255 &amp;&amp; $color_xy==255){ continue; }else if($color==0 &amp;&amp; $color_x==0 &amp;&amp; $color_y==0 &amp;&amp; $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=1-$frsx; $frsy1=1-$frsy; $newcolor=( $color*$frsx1*$frsy1+ $color_x*$frsx*$frsy1+ $color_y*$frsx1*$frsy+ $color_xy*$frsx*$frsy); if($newcolor&gt;255) $newcolor=255; $newcolor=$newcolor/255; $newcolor0=1-$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, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue)); } } 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'); if(function_exists("imagejpeg")){ header("Content-Type: image/jpeg"); imagejpeg($img2, null, $jpeg_quality); }else if(function_exists("imagegif")){ header("Content-Type: image/gif"); imagegif($img2); }else if(function_exists("imagepng")){ header("Content-Type: image/x-png"); imagepng($img2); } } </code></pre> <p>Hope i helped you.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload