0 Пользователей и 1 Гость просматривают эту тему.
  • 2 Ответов
  • 2431 Просмотров
*

linykc

  • Осваиваюсь на форуме
  • 30
  • 13 / 0
Всем доброго времени суток!
Думаю многим разработчикам и админам приходилось не раз вычищать сайты от злобных шеллов, вирей и прочей грязи залитой на наши драгоценные сайты, всякими турецкими борцами за свободу, ливанскими кибер террористами и прочими надоедливыми ахламонами...
Скажу честно,  как они меня уже зае задолбали!

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

В связи с этим пришло в голову мне такое: а почему бы не поставить капчу на авторизацию в админку? тогда ведь бот не сможет подобрать пароль (ну я на это надеюсь ;D).

В общем к делу:

Задача: повысить безопасность от взлома админки добавлением 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

« Последнее редактирование: 26.08.2013, 23:36:24 от linykc »
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
Извиняюcь не по теме реCAPTCHA, но по моему мнению эффективнее решение у плагина backendtoken
Смысл его что он выдаст приглашение на авторизацию если в урле будет введен правильный токен с секретным словом типа /administrator/index.php?token=MySecretKey
Я его еще упростил и если введен неправильный токен, то идет не редирект а просто пустая страница 404
так серверу легче пусть стучатся сколько угодно. По логам вообще нет попыток подбора потому что адрес /administrator выдает 404 в этом еще и некоторое запутывание на предмет выявление принадлежности к CMS
*

linykc

  • Осваиваюсь на форуме
  • 30
  • 13 / 0
Извиняюcь не по теме реCAPTCHA, но по моему мнению эффективнее решение у плагина backendtoken
Смысл его что он выдаст приглашение на авторизацию если в урле будет введен правильный токен с секретным словом типа /administrator/index.php?token=MySecretKey

да о подобном решении я знаю, сам пользуюсь плагином adminexile- делает тоже самое.
но имхо переборщить с безопасностью невозможно... я бы и амбарный замок на админку навесил если бы мог... =)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться