Ограничение на вход по IP в админку Joomla

2014-01-13
4.3 / 5 (3 голоса)

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

Задача: Сделать дополнительную проверку ip любого юзверя, будь-то обычный пользователь, менеджер или администратор.

Нужно это прежде всего для контроля доступа менеджеров к сайту, что бы могли редактировать и создавать статьи только с офисных ip.

И так, что нам для этого понадобится.

1. Необходимо добавить новое поле "IP" в профиль пользователя (administrator\components\com_users\models\user.xml)

<?xml version="1.0" encoding="utf-8"?>	
<form>	
        <params>	
                <param name="admin_language" type="languages" client="administrator" default="" label="Back-end Language" description="paramAdminLanguage" />	
                <param name="language" type="languages" client="site" default="" label="Front-end Language" description="paramLanguage" />	
                <param name="editor" type="editors" default="" label="User Editor" description="WYSIWYG Editor for this User" />
                <param name="helpsite" type="helpsites" default="" label="Help Site" description="Help Site for this User" />	
                <param name="timezone" type="timezones" default="" label="Time Zone" description="Time Zone for this User" />	
                <param name="ip" type="text" default="" label="IP" description="User IP" />
        </params>
</form>

2. Отредактировать плагин авторизации (plugins\user\joomla.php)

2.1 Редактируется функция onLoginUser

                $users_data = $instance->_params->_registry['_default']['data'];
                $user_real_ip = $this->get_user_ip();
                if ($users_data->ip) {
                        if ($user_real_ip != $users_data->ip) {
                                return JError::raiseWarning('SOME_ERROR_CODE', JText::_('IP не совпадает. Вход запрещен.'));
                        }
                }

 2.2 Добавить функцию корректного получения ip пользователя

function get_user_ip(){
                if ( getenv('REMOTE_ADDR') ) $user_ip = getenv('REMOTE_ADDR');
                elseif ( getenv('HTTP_FORWARDED_FOR') ) $user_ip = getenv('HTTP_FORWARDED_FOR');
                elseif ( getenv('HTTP_X_FORWARDED_FOR') ) $user_ip = getenv('HTTP_X_FORWARDED_FOR');
                elseif ( getenv('HTTP_X_COMING_FROM') ) $user_ip = getenv('HTTP_X_COMING_FROM');
                elseif ( getenv('HTTP_VIA') ) $user_ip = getenv('HTTP_VIA');
                elseif ( getenv('HTTP_XROXY_CONNECTION') ) $user_ip = getenv('HTTP_XROXY_CONNECTION');
                elseif ( getenv('HTTP_CLIENT_IP') ) $user_ip = getenv('HTTP_CLIENT_IP');
                $user_ip = trim($user_ip);
                if ( empty($user_ip) ) return false;
                if ( !preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $user_ip) ) return false;
                return $user_ip;
        }

В итоге, что получается? Если у пользователя в профиле заполнено поле ip, то перед тем как его авторизировать, содержимое сверяется с его реальным ip. Если оно совпадает, то пользователь авторизируется, если нет, то выдаётся ошибка. 

Скриншоты и отредактированные файлы смотрите ниже.

Прочитано 1279 раз Последнее изменение 2015-10-17

Оставить комментарий

Все поля отмеченные (*) обязательны для заполнения