BC/NW 2014 2 (25):10.2

 

ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ ПРИ СОЗДАНИИ И ИСПОЛЬЗОВАНИИ ЛИЧНЫХ КАБИНЕТОВ ИНТЕРНЕТ-САЙТОВ

Хорев П.Б.

(ФГБОУ ВПО  "Национальный исследовательский университет "МЭИ", Москва, Россия)

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

В данном труде будут рассматриваться задачи, возникающими перед разработчиком личного кабинета, языковые и инструментальные средства, которые могут использоваться разработчиком, угрозы безопасности информации при использовании личного кабинета, методы и средства защиты от этих угроз.

Информация по данному вопросу, имеющаяся в различных источниках, носит достаточно разрозненный характер и, как правило, не затрагивает всю проблему обеспечения безопасности при создании личного кабинета. В связи с тем, что электронные образовательные ресурсы (в частности, используемые в системах дистанционного обучения) должны включать в свой состав личный кабинет обучающегося, данный труд будет достаточно актуальным.

Для создания личного кабинета пользователь Интернет-сайта должен выполнить процедуру регистрации. Для добавления на сайт функции регистрации пользователя разработчик личного кабинета должен, прежде всего, создать базу данных (БД) зарегистрированных пользователей. При использовании разработчиком языка программирования PHP и системы управления базами данных (СУБД) MySQL эта БД может быть создана с помощью phpMyAdmin – веб-приложения с открытым кодом, написанного на PHP и предоставляющего веб-интерфейс для администрирования СУБД MySQL [1].

Программа phpMyAdmin позволяет в обозревателе Интернета осуществлять администрирование сервера MySQL, выполнять SQL-запросы и просматривать содержимое таблиц базы данных. С помощью phpMyAdmin разработчик личного кабинета создает новую базу данных и добавляет в нее новую таблицу с необходимым количеством пустых полей.

Обязательными полями будут являться целочисленный идентификатор учетной записи зарегистрированного пользователя, указанное им при регистрации имя (так называемый «логин»), адрес электронной почты пользователя, адрес его сайта в сети Интернет и выбранный пользователем при регистрации пароль.

После создания БД также с помощью программы phpMyAdmin она экспортируется на компьютер (разработчику отображается обозревателем Интернета окно с SQL-кодом, который нужно скопировать и сохранить в файле с расширением .SQL).

Следующим шагом в создании личного кабинета является добавление на Интернет-сайт кода для регистрации и авторизации пользователя. На Web-сервере, на котором размещается сайт, создаются каталоги для создания и использования форм регистрации и авторизации, а также каталог для файлов на языке JavaScript для защиты сайта от спама.

Каталог для формы регистрации должен содержать конфигурационный файл для соединения с Web-сервером и БД, файл с созданной базой данных зарегистрированных пользователей, файл с созданием формы для регистрации и файл для обработки сообщений от этой формы.

В коде для обработки сообщений от формы регистрации необходимо предусмотреть проверку правильности заполнения всех полей формы (отсутствие пустых обязательных полей, корректность адреса электронной почты и т.п.) и, при отсутствии ошибок, добавление учетной записи пользователя в БД. Если при добавлении учетной записи выяснится, что пользователь с таким именем уже зарегистрирован на сайте, то пользователю необходимо будет предложить выбрать другое имя.

Для защиты от спама при добавлении на сайт личного кабинета пользователя может применяться библиотека JQuery функций на языке программирования JavaScript, обеспечивающих удобное взаимодействие между кодом на JavaScript и Web-страницей на языке HTML [2]. Для подключения библиотеки JQuery в php-файл с созданием регистрационной формы нужно добавить код:

<script type="text/javascript" src="js/jquery-1.11.1.min.js"></script>

<script type="text/javascript" src="js/mytool.js"> </script>

В этом примере js – имя каталога на Web-сервере с файлами на языке JavaScript, jquery-1.11.1.min.js – имя файла с используемой версией библиотеки Jquery, mytool.js – имя файла с кодом разработчика личного кабинета для использования функций библиотеки JQuery при защите от спама (например, отправки регистрационных данных только при правильном ответе пользователя на контрольный вопрос).

Каталог для авторизации должен содержать php-файлы для создания формы для авторизации зарегистрированного пользователя и для обработки сообщений от этой формы. В коде для обработки сообщений от формы авторизации требуется включить проверку правильности имени пользователя (его адреса электронной почты) и пароля. При отсутствии ошибок пользователю личного кабинета нужно предоставить доступ к его настройкам, персональным данным и той части информации сайта, которая ему доступна в соответствии с политикой безопасности.

Для исключения угроз, связанных с похищением паролей зарегистрированных пользователей сайта непосредственно из БД на Web-сервере, пароли должны храниться в БД в хешированном виде. Для этого в языке PHP существуют функции md5() (реализует алгоритм хеширования MD5, создающий хеш-значение длиной 128 бит), sha1() (реализует алгоритм хеширования SHA1, создающий хеш-значение пароля длиной 160 бит), hash(alg, pass) (хеширование пароля pass по алгоритму alg, значением alg может быть ″sha256″, ″sha512″, ″ripemd160″ или строка с именем другого доступного алгоритма хеширования).

Все перечисленные выше функции возвращают в качестве результата строку с шестнадцатеричным хеш-значением.

Дополнительной защитой от подбора пароля по его похищенному хеш-значению может быть добавление к хешированию пароля случайной примеси [3]. Эта примесь может быть вычислена при регистрации пользователя с помощью выражения на языке PHP uniqid (rand(), true), позволяющего получить случайное число с помощью показаний системного таймера и генератора псевдослучайных чисел с дополнительно увеличенной вероятностью уникальности результата.

Примесь добавляется к паролю при его хешировании с помощью операции конкатенации (.) и сохраняется в дополнительном поле таблицы БД зарегистрированных пользователей.

Вместо использования алгоритмов хеширования в PHP хеш-значение пароля может быть вычислено и с помощью алгоритма симметричного шифрования. Для этого предназначена функция crypt (str, salt), при вызове которой строка str используется в качестве ключа шифрования некоторой константы по алгоритму, определяемому аргументом salt. Например, для получения хеш-значения пароля с помощью алгоритма шифрования Blowfish, необходимо для аргумента salt указать значение, являющееся конкатенацией "$2a$", весового параметра из двух цифр, "$" и 22 цифр из алфавита "./0-9A-Za-z". Весовой параметр из двух цифр является двоичным логарифмом количества итераций алгоритма хеширования, основанного на алгоритме шифрования Blowfish, и должен быть в диапазоне 04-31. Увеличение этого параметра сделает подбор пароля по его хеш-значению еще более сложным.

Результат функции crypt включает в себя случайную примесь, поэтому ее не нужно отдельно сохранять в регистрационной базе данных (при проверке пароля в качестве второго параметра функции crypt надо будет указать хеш-значение пароля из БД). Для проверки реализации в системе алгоритма Blowfish можно использовать константу CRYPT_BLOWFISH:

if (defined(CRYPT_BLOWFISH) && CRYPT_BLOWFISH)

В PHP 5.5 используются дополнительные функции для хеширования паролей password_hash (вычисление хеш-значения пароля по алгоритму по умолчанию или алгоритму Blowfish), password_verify (проверка правильности введенного пароля по его хешу), password_needs_rehash (проверка необходимости сменить пароль, если используется недостаточно стойкий алгоритм или пароль опознан системой как уязвимый к подбору), password_get_info (получение информации об алгоритме и дополнительных опциях хеширования паролей).

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

Для исключения подбора (угадывания) пароля пользователя в интерактивном режиме необходимо предусмотреть в коде личного кабинета ограничения на выбор и использование паролей: минимальную длину пароля (рекомендуется 8-9 знаков), сложность пароля (обязательное наличие в нем не менее трех групп символов), максимальный срок использования пароля (рекомендуется 30-60 дней), невозможность использования одного из «старых» паролей (обеспечение неповторяемости паролей одного пользователя).

Для определения длины пароля используется функция strlen языка PHP.

При проверке сложности пароля может использоваться функция PHP count_chars, возвращающая информацию о символах, входящих в строку, которая задана первым аргументом функции, в формате, определяемом вторым аргументом. Например, если значением второго аргумента будет 1, то результатом функции count_chars будет массив, индексами которого являются ASCII-коды символов пароля, а значениями - число вхождений соответствующего символа в строку, причем информация о символах с нулевым числом вхождений не включается в массив.

Для проверки, не истек ли срок действия пароля, введенного пользователем при входе в личный кабинет, потребуется добавить в таблицу БД зарегистрированных пользователей дополнительное поле с датой последнего изменения пароля. Для операций с датами (вычитания из текущей даты максимально возможного срока действия пароля и сравнения полученной даты с датой последнего изменения пароля) можно использовать функции PHP mktime и date.

Для исключения возможности использования пользователем сайта одного из своих «старых» паролей потребуется добавление в БД зарегистрированных пользователей таблицы, включающей поля с именем пользователя и хеш-значением каждого его пароля. Поиск в этой таблице поможет проверить уникальность нового пароля пользователя сайта.

При передаче пароля пользователя сайта на Web-сервер (в ходе регистрации или авторизации владельца личного кабинета) желательно предусмотреть и защиту от его перехвата и последующего воспроизведения нарушителем. Для этого может использоваться асимметричная криптография (например, библиотека php-OpenSSL [4]). Пароль в этом случае будет перед отправкой на сервер шифроваться открытым ключом Интернет-сайта (используется функция openssl_public_encrypt библиотеки php-OpenSSL), а перед проверкой на сервере – расшифровываться с помощью закрытого ключа сайта (с помощью функции openssl_private_decrypt).

Вместо библиотеки php-OpenSSL можно использовать и другие библиотеки, содержащие функции для использования в программах на PHP асимметричной криптографии, например, библиотеку phpseclib, содержащую реализацию асимметричной криптосистемы RSA [5] в виде класса rsa, имеющего методы encrypt и decrypt.

Альтернативой передачи многоразового пароля пользователя личного кабинета Интернет-сайта с использованием асимметричного шифрования является использование более сложных протоколов аутентификации при удаленном доступе, основанных на одноразовых паролях (S/Key) или модели «рукопожатия» (CHAP) [3]. Но в этом случае потребуется (для генерации очередного одноразового пароля или отклика на случайный запрос Web-сервера) использование базового (главного) пароля пользователя, который, например, может быть сгенерирован сайтом и передан пользователю на указанный им при регистрации адрес электронной почты.

 В заключение необходимо отметить, что безопасность при использовании личного кабинета существенно зависит и от соблюдения самим пользователем сайта элементарных правил, исключающих запись пароля в общедоступном месте или передачу своего пароля другим лицам. С этими правилами безопасности каждый пользователь должен быть ознакомлен при создании своего личного кабинета.

Труд посвящен вопросам обеспечения информационной безопасности при создании и использовании личных кабинетов различных Интернет-сайтов, в том числе и применяемых в системах дистанционного обучения. Рассматриваются различные методы защиты от угроз безопасности информации и возможности их применения в программах на языке PHP.

Литература

1.     Bringing MySQL to the web. phpMyAdmin. http://www.phpmyadmin. net/home_page/index.php.

2.     JQuery. http://jquery.com/.

3.     Хорев П.Б. Программно-аппаратная защита информации. М.: ФОРУМ, 2013.

4.     PHP Manual. OpenSSL. http://ru.php.net/manual/en/book.openssl.php.

5.     PHPseclib: RSA Feature List. http://phpseclib.sourceforge.net/rsa/ intro.html.