Всем доброго времени суток!
Думаю многим разработчикам и админам приходилось не раз вычищать сайты от злобных шеллов, вирей и прочей грязи залитой на наши драгоценные сайты, всякими турецкими борцами за свободу, ливанскими кибер террористами и прочими надоедливыми ахламонами...
Скажу честно, как они меня уже
зае задолбали!
очень часто на взломанных сайтах в логах находились явные признаки наглого брутфорса...(подбора пароля)
да и софта для сего злодеяния на просторах интернетов навалом...
В связи с этим пришло в голову мне такое: а почему бы не поставить капчу на авторизацию в админку? тогда ведь бот не сможет подобрать пароль (ну я на это надеюсь
).
В общем к делу:
Задача: повысить безопасность от взлома админки добавлением reCaptha к форме авторизации в панель управления сайта. (пошарив по сусекам интернета, решения готового я так и не нашел - пришлось мудрить "свое" - в кавычках потому как все же способы подключения реCAPTCHA к компонентам и пр. найти вполне реально.)
Решение:1) включаем сам плагин реCAPTCHA, получаем у Google ключики для своего домена, включаем в настройках плагина тему "white" (сие по желанию, просто сочетается лучше с видом страницы авторизации bluestork)
2) редактируем файл/добавляем в папку HTML самго шаблона админки темплейт модуля mod_login - в нем выводится форма авторизации
/administrator/templates/bluestork/html/mod_login/default.php или
/administrator/modules/mod_login/tmpl/default.php(прикладываю уже готовый код, думаю что тут добавлять будет понятно)
// No direct access.
defined('_JEXEC') or die;
JHtml::_('behavior.keepalive');
// recaptcha start`s here - подключаем плагин
JPluginHelper::importPlugin('captcha');
$dispatcher = JDispatcher::getInstance();
$dispatcher->trigger('onInit','dynamic_recaptcha_1');
// recaptcha end`s here
?>
<form action="<?php echo JRoute::_('index.php', true, $params->get('usesecure')); ?>" method="post" id="form-login">
<fieldset class="loginform">
<label id="mod-login-username-lbl" for="mod-login-username"><?php echo JText::_('JGLOBAL_USERNAME'); ?></label>
<input name="username" id="mod-login-username" type="text" class="inputbox" size="15" />
<label id="mod-login-password-lbl" for="mod-login-password"><?php echo JText::_('JGLOBAL_PASSWORD'); ?></label>
<input name="passwd" id="mod-login-password" type="password" class="inputbox" size="15" />
<label id="mod-login-language-lbl" for="lang"><?php echo JText::_('MOD_LOGIN_LANGUAGE'); ?></label>
<?php echo $langs; ?>
<?php // recaptcha start`s here - здесь выводим капчу ?>
<div id="dynamic_recaptcha_1" style="clear: both;"></div>
<?php // recaptcha end`s here ?>
<div class="button-holder">
<div class="button1">
<div class="next">
<a href="#" onclick="document.getElementById('form-login').submit();">
<?php echo JText::_('MOD_LOGIN_LOGIN'); ?></a>
</div>
</div>
</div>
<div class="clr"></div>
<input type="submit" class="hidebtn" value="<?php echo JText::_( 'MOD_LOGIN_LOGIN' ); ?>" />
<input type="hidden" name="option" value="com_login" />
<input type="hidden" name="task" value="login" />
<input type="hidden" name="return" value="<?php echo $return; ?>" />
<?php echo JHtml::_('form.token'); ?>
</fieldset>
</form>
3) редактируем оверрайд-файл login.php самого шаблона админки, точнее его часть ( впринципе это не обязательно, и делается лишь для наведения марафета в отображении формы логина)
<?php // ищем div ID "lock" - это картинка с замочком. вставляем сразу после него div с классом "clr" - без него все смотрится очень криво ?>
<div id="lock"></div>
<div class="clr"></div>
4) правим функцию
login в компоненте com_login (
/administrator/components/com_login/controller.php) - здесь происходит проверка валидности логина/пароля
public function login()
{
// Check for request forgeries.
JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN'));
$app = JFactory::getApplication();
$model = $this->getModel('login');
$credentials = $model->getState('credentials');
$return = $model->getState('return');
// recaptcha start`s here
$post = JRequest::get('post');
JPluginHelper::importPlugin('captcha');
$dispatcher = JDispatcher::getInstance();
$res = $dispatcher->trigger('onCheckAnswer',$post['recaptcha_response_field']);
if(!$res[0]){
$app->redirect($return);
}
// recaptcha end`s here
$result = $app->login($credentials, array('action' => 'core.login.admin'));
if (!($result instanceof Exception)) {
$app->redirect($return);
}
parent::display();
}
5) проверяем работу.
Результат: в форме авторизации красуется своими каракулями reCaptcha. при неверном вводе проверочного кода, происходит редирект назад на страницу логина, даже при правильно введенных паре логин-пароль.
P.S.
решение требует тестирования, поэтому прошу всех желающих отписываться в этой теме. ( в аттаче все редактируемые файлы)
Хорошо бы конечно написать системный плагин, чтоб не редактировать файлы после каждого обновления, но тут у меня к сожалению опыта очень мало, так что если кто поможет с написанием плагина - буду рад. Думаю доп защита админ части никогда не будет лишней.
P.P.S. Работал я с последней на текущий момент версией Joomla 2.5.14