Captcha – изменение настроек (2.8)

Материал из Umicms
Перейти к:навигация, поиск

Изменить настройки основной каптчи нет возможности, т.к. они жестко прописаны в системном файле, но можно подключить свой кастомный файл каптчи, который можно было бы отредактировать без опасения, что изменения затрутся при обновлении системы. В конфигурационном файле config.ini присутствует блок 'anti-spam' с переменной captcha.drawer = "default". Изменим значение переменной на 'mycaptha', т.е. запишем:

captcha.drawer = "mycaptha"

Далее в папке /classes/system/utils/captcha/drawers/ сделаем копию файла default.php и переименуем новый файл в mycaptcha.php. Изменим содержимое файла mycaptcha.php, допустим, изменим названием класса, добавим метод генерации строки для каптчи (getRandomCode), изменим набор и количество символов в переменных $length и $alphas, а также $length в методе render(). В итоге получим следующий рабочий класс:

<?php
	class mycaptchaCaptchaDrawer extends captchaDrawer {
	
		public function getRandomCode() {
			$length = 4; $code = ''; $alphas = '123456789'; $c = strlen($alphas) - 1;
			for($i = 0; $i < $length; $i++) {
				$code .= $alphas{rand(0, $c)};
			}
			return $code;
		}
		public function draw($randomCode) {
			header('Content-type: image/jpeg');
			header('Etag: ' . sha1($randomCode));
			
			$this->render($randomCode);
			exit;
		}
		
		private function render($str) {
			$length = 5;
			$charWidth = 15;
			$imagewidth = $imagelength = $length * $charWidth + 16;
			$imageheight = 35;
		
			$image = imagecreate($imagelength, $imageheight);
			$bgcolor = imagecolorallocate($image, 255, 255, 255);
		
			$stringcolor = imagecolorallocate($image, 0, 0, 0);
			$linecolor   = imagecolorallocate($image, 0, 0, 0);
		
			$chars = str_split($str);
			$sz = sizeof($chars);
		
			$left = 20;
			for($i = 0; $i < $sz; $i++) {
				$rx = (rand() % 6) - 3;
				$ry = (rand() % 6) - 3;
		
				imagestring($image, 25, ($left + $rx), (8 + $ry), $chars[$i], $stringcolor);
				$left += $charWidth;
			}
		
			$linecolor = imagecolorallocate($image, 204, 204, 204);
		
			$c = 10 + (rand() % 10);
			for($i = 0; $i < $c; $i++) {
				$y1 = 0;
				$y2 = $imageheight;
		
				$x1 = rand() % ($imagewidth + $imagewidth * 0.2);
				$x2 = $x1 - $imageheight;
		
				imageline($image, $x1, $y1, $x2, $y2, $linecolor);
			}
			imagejpeg($image, '', 65);
		}
	};
?>

При таких настройках каптчи, она будет формироваться только из цифр, длина строки равна четырем символам.

Также в config.ini можно подключить kcaptcha, с более усиленной защитой:

captcha.drawer = "kcaptcha"

необходимой код для работы данной каптчи уже присутствует в системе.