11 августа 2009

Интеграция KCAPTCHA с Joomla 1.5. Часть 1: Компонент com_user

Joomla настолько демократичная cms, что в базовый поставке не имеет никакой защиты от спам-ботов, хотя имеет формы ввода данных в которые эти спам-боты могут нагадить. Для избавления от такой напасти будем использовать отечественную разработку под названием KCAPTCHA, написанную на php «для защиты от спама и флуда». В первой части я расскажу об интеграции с компонентом com_user, а во-второй сделаю интеграцию с com_contact. Интеграция будет проделана с Joomla 1.5.14.

Скачаем KCAPTCHA и распакуем архив в директорию «libraries» дистрибутива Joomla.

Теперь приступим к интеграции:
1) В корневом файле Joomla index.php после 17 строки добавим:
// BEGIN PATCH
session_start();
if(isset($_SESSION['captcha_keystring'])&&($_SESSION['captcha_keystring']==$_POST['captcha']))
   $_POST['captcha']=1;
else
   $_POST['captcha']=0;
session_destroy();
// END PATCH

и после 92 строки:
$mainframe->triggerEvent('onAfterRender');

// BEGIN PATCH
JSession::close();
// END PATCH

/**
 * RETURN THE RESPONSE
 */


2) Добавим проверку и показ защитного изображения в форму регистрации. В файле /components/com_user/controller.php после строки 331 добавим:
$document   =& JFactory::getDocument();

// BEGIN PATCH
if ($_POST['captcha'] !== 1) {
	JError::raiseWarning( 403, JText::_( 'You need to enter the code shown' ));
	$this->setRedirect('index.php?option=com_user&task=register');
	return false;
}
// END PATCH

// If user registration is not allowed, show 403 not authorized.

и в файле /components/com_user/views/register/tmpl/default.php после 73 строки:
<input class="inputbox required validate-passverify" type="password" id="password2" name="password2" size="40" value="" /> *
	</td>
</tr>
<!-- BEGIN PATCH -->
<tr>
	<td height="60">
		<label for="captcha">
			<?php echo JText::_( 'Enter text shown below' ); ?>:
		</label>
	</td>
	<td>
		<input type="text" name="captcha" class="inputbox" size="20" id="captcha" /> *
		<img src="<?php JURI::base() ?>libraries/kcaptcha/index.php?<?php echo session_name(); ?>=<?php echo session_id(); ?>" alt="Captcha" style="vertical-align:-25px;" />
	</td>
</tr>
<!-- END PATCH -->
<tr>
	<td colspan="2" height="40">


3) Добавим переводы созданных нами языковых констант в файл локализации. Открываем /language/ru-RU/ru-RU.ini и добавляем в любое место следующие строки:
# BEGIN PATCH
ENTER TEXT SHOWN BELOW=Введите код
YOU NEED TO ENTER THE CODE SHOWN=Вы должны ввести правильный код, указанный на картинке.
# END PATCH


Ну вот теперь всё готово! Можно поднастроить KCAPTCHA, делается это через файл kcaptcha_config.php:
$allowed_symbols — доступные символы для картинок
$length — количество символов для проверки
$width $height — ширина и высота картинки
$show_credits — показ ссылки на авторов, чтобы убрать — поставить false
$jpeg_quality — качество генерируемого изображения


Продолжение: интеграция KCAPTCHA с компонентом com_contact.
0

Комментарии:12

avatar
  • alex
  • 12 августа 2009, 10:41
  • 0
Жду продолжения!!!
avatar
avatar
  • NPC
  • 07 сентября 2009, 11:36
  • 0
Спасибо за статью!

Только вот у меня похожие строки в файле /components/com_user/controller.php находятся не со строки 331, а со строки 231… туда и вставил, но пока что регистрация вырубилась совсем — каптча показывается, ввожу все данные, но система на нажатие кнопки «Зарегистрироваться» вообще не реагирует :( Может, у меня в темплейте что-то не так намудрено… к кому лучше обращаться за помощью? Других изменений, кроме описанных, не делал. До них регистрация работала.

Посмотреть можете здесь: aomegaonline.org/ru/component/user/?task=register
avatar
  • NPC
  • 07 сентября 2009, 14:05
  • 0
Прошу прощения, порылся глубже, оказывается у меня не было стиля для invalid, и ошибка была вызвана не полем с капчей. Теперь всё работает прекрасно, спасибо большое ещё раз. Надеюсь, капча сможет остановить бандерлогов…
avatar
  • Igoreha
  • 12 октября 2009, 17:25
  • 0
ОГРРРомное спасибо за материал! вот задумался о кнопке «обновить», бывают случаи, когда есть сомнения, то ли буква, то ли цифра. в общем, вещь полезная и известная. но вот с реализацией пока не выходит. с сайта разработчика взят следующий код:

<button onclick="document.getElementById('imageid').src='/kcaptcha/?rnd='+Math.random();return false;" >Обновить</button>


и вставлен в форму регистрации после
<img src="..." />

но при нажатии на кнопку Обновить происходит полная перезагрузка страницы, далее сообщение о том, что введенный код не является правильным. видимо дело заключается в сессии, но я пока еще не большой спец. подскажите, в чем может быть дело. хотелось бы вот как у автора www.captcha.ru/captchas/multiwave/ в самом низу, те хочется обновления только картинки, а не всей страницы и уж тем более не сообщения об ошибке.
avatar
  • vircat
  • 27 марта 2010, 11:06
  • 0
Надо картинке присвоить ID например «kcaptcha» и немного изменить обработчик события.
onclick="document.getElementById('kcaptcha').src='<?php JURI::base() ?>libraries/kcaptcha/?rnd='+Math.random();return false;"
avatar
Все здорово написано и отлично работает. Большое спасибо.
Вот бы еще вход в админку обкаптчить :)
avatar
  • alex50
  • 13 июля 2010, 17:50
  • 0
Весьма неплохо, но советую посмотреть на KeyCAPTCHA.com
буквально «убойный» и бесплатный продукт российской разработки
теперь с ботами и китайцами покончено навсегда! Я конечно не имел ввиду наших правнуков…
avatar
Небольшая поправка для Joomla 1.5.22 все тоже самое за одним но!

в файле components/com_user/controller.php код нужно указывать не после 331 строки а после 237.
Для добавления captcha в регистрацию.
Примерно так:
// Get required system objects
		$user 		= clone(JFactory::getUser());
		$pathway 	=& $mainframe->getPathway();
		$config		=& JFactory::getConfig();
		$authorize	=& JFactory::getACL();
		$document   =& JFactory::getDocument();
		
		// BEGIN PATCH
if ($_POST['captcha'] !== 1) {
        JError::raiseWarning( 403, JText::_( 'You need to enter the code shown' ));
        $this->setRedirect('index.php?option=com_user&task=register');
        return false;
}
// END PATCH

		// If user registration is not allowed, show 403 not authorized.
		$usersConfig = &JComponentHelper::getParams( 'com_users' );
		if ($usersConfig->get('allowUserRegistration') == '0') {
			JError::raiseError( 403, JText::_( 'Access Forbidden' ));
			return;
		}

Если сделать как указывает авто сего текста, то при регистрации в поле код можно ввести любой набор символов и captcha вас пропустит.
avatar
Ошибся в предидущем комменте:

в файле components/com_user/controller.php код нужно указывать не после 331 строки а после231.
avatar
Спасибо!
avatar
  • antant
  • 05 марта 2011, 22:43
  • 0
Joomla 1.5.22
Сделал все точно по вашей инструкции. 4 раза заново систему ставил, но все равно при вводе неправильного или пустого кода перенаправляет на index.php?option=com_user и пишет Зона зарегистрированных пользователей.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.