110 lines
3.6 KiB
PHP
110 lines
3.6 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* WP Captcha
|
||
|
* https://getwpcaptcha.com/
|
||
|
* (c) WebFactory Ltd, 2022 - 2023, www.webfactoryltd.com
|
||
|
*/
|
||
|
|
||
|
class WPCaptcha_Captcha {
|
||
|
// convert HEX(HTML) color notation to RGB
|
||
|
static function hex2rgb($color) {
|
||
|
if ($color[0] == '#') {
|
||
|
$color = substr($color, 1);
|
||
|
}
|
||
|
|
||
|
if (strlen($color) == 6) {
|
||
|
list($r, $g, $b) = array($color[0].$color[1],
|
||
|
$color[2].$color[3],
|
||
|
$color[4].$color[5]);
|
||
|
} elseif (strlen($color) == 3) {
|
||
|
list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
|
||
|
} else {
|
||
|
return array(255, 255, 255);
|
||
|
}
|
||
|
|
||
|
$r = hexdec($r);
|
||
|
$g = hexdec($g);
|
||
|
$b = hexdec($b);
|
||
|
|
||
|
return array($r, $g, $b);
|
||
|
} // html2rgb
|
||
|
|
||
|
|
||
|
// output captcha image
|
||
|
static function generate() {
|
||
|
$a = rand(0, (int) 10);
|
||
|
$b = rand(0, (int) 10);
|
||
|
$color = @$_GET['color'];
|
||
|
$color = urldecode($color);
|
||
|
if(isset($_GET['id'])){
|
||
|
$captcha_cookie_name = 'wpcaptcha_captcha_' . intval($_GET['id']);
|
||
|
} else{
|
||
|
$captcha_cookie_name = 'wpcaptcha_captcha';
|
||
|
}
|
||
|
|
||
|
if ($a > $b) {
|
||
|
$out = "$a - $b";
|
||
|
$captcha_value = $a - $b;
|
||
|
|
||
|
} else {
|
||
|
$out = "$a + $b";
|
||
|
$captcha_value = $a + $b;
|
||
|
}
|
||
|
|
||
|
setcookie($captcha_cookie_name, $captcha_value, time() + 60 * 5, '/');
|
||
|
|
||
|
$font = 5;
|
||
|
$width = ImageFontWidth($font) * strlen($out);
|
||
|
$height = ImageFontHeight($font);
|
||
|
$im = ImageCreate($width, $height);
|
||
|
|
||
|
$x = imagesx($im) - $width ;
|
||
|
$y = imagesy($im) - $height;
|
||
|
|
||
|
$white = imagecolorallocate ($im, 255, 255, 255);
|
||
|
$gray = imagecolorallocate ($im, 66, 66, 66);
|
||
|
$black = imagecolorallocate ($im, 0, 0, 0);
|
||
|
$trans_color = $white; //transparent color
|
||
|
|
||
|
if ($color) {
|
||
|
$color = self::hex2rgb($color);
|
||
|
$new_color = imagecolorallocate ($im, $color[0], $color[1], $color[2]);
|
||
|
imagefill($im, 1, 1, $new_color);
|
||
|
} else {
|
||
|
imagecolortransparent($im, $trans_color);
|
||
|
}
|
||
|
|
||
|
imagestring ($im, $font, $x, $y, $out, $black);
|
||
|
|
||
|
// always add noise
|
||
|
if (1 == 1) {
|
||
|
$color_min = 100;
|
||
|
$color_max = 200;
|
||
|
$rand1 = imagecolorallocate ($im, rand($color_min,$color_max), rand($color_min,$color_max), rand($color_min,$color_max));
|
||
|
$rand2 = imagecolorallocate ($im, rand($color_min,$color_max), rand($color_min,$color_max), rand($color_min,$color_max));
|
||
|
$rand3 = imagecolorallocate ($im, rand($color_min,$color_max), rand($color_min,$color_max), rand($color_min,$color_max));
|
||
|
$rand4 = imagecolorallocate ($im, rand($color_min,$color_max), rand($color_min,$color_max), rand($color_min,$color_max));
|
||
|
$rand5 = imagecolorallocate ($im, rand($color_min,$color_max), rand($color_min,$color_max), rand($color_min,$color_max));
|
||
|
|
||
|
$style = array($rand1, $rand2, $rand3, $rand4, $rand5);
|
||
|
imagesetstyle($im, $style);
|
||
|
imageline($im, rand(0, $width), 0, rand(0, $width), $height, IMG_COLOR_STYLED);
|
||
|
imageline($im, rand(0, $width), 0, rand(0, $width), $height, IMG_COLOR_STYLED);
|
||
|
imageline($im, rand(0, $width), 0, rand(0, $width), $height, IMG_COLOR_STYLED);
|
||
|
imageline($im, rand(0, $width), 0, rand(0, $width), $height, IMG_COLOR_STYLED);
|
||
|
imageline($im, rand(0, $width), 0, rand(0, $width), $height, IMG_COLOR_STYLED);
|
||
|
}
|
||
|
|
||
|
header('Cache-Control: no-cache, must-revalidate');
|
||
|
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
|
||
|
header('Content-type: image/gif');
|
||
|
imagegif($im);
|
||
|
die();
|
||
|
} // create
|
||
|
} // WPCaptcha_Captcha
|
||
|
|
||
|
|
||
|
if (isset($_GET['wpcaptcha-generate-image'])) {
|
||
|
WPCaptcha_Captcha::generate();
|
||
|
}
|