Аутентификация пользователей через Web интерфейс.
Про аутентификацию пользователей написано масса статей и для оной процедуры изготовлено сотни скриптов.
Однако, в большинстве своем все эти методы рассчитаны на хранение логинов/паролей в отдельном файле, или на аутентификацию пользователей с помошью апачесвкого .htaccess.
Здесь же речь пойдет про аутентификацию реальных пользователей Unix сервера через веб-интерфейс.
Есть довольно много методов для решения этой задачи, но используют в основном два способа:
Первый метод весьма скользкий, ибо его реализация требует прав суперпользователя (root) для открытия файла зашифрованных паролей (shadow), и, как следствие, является дырой в безопасности сервера. Он реализуется путем исполнения cgi-скрипта с правами root (suid).
Вообщем, алгоритм простой:
- взять пару логин/пароль с Web-формы;
- зашифровать пароль тем же алгоритмом, что и на сервере;
- открыть файл shadow для сравнения пароля, там хранящегося с полученным с web-формы.
- Ежели результат сравнения положителен, аутентификация прошла успешна и увы в противном случае.
- Не забыть позакрывать все файлы.
Все вообщем-то довольно просто.
Открыли файл, прочитали в буфер, нашли нужную нам строчку, закриптовали пароль, сравнили с тем, что в файле и по делам ихним воздаем аутентифицирующемуся юзеру.
В Unix системах шифрование происходит в одну сторону - к зашифрованному паролю добаваляется хорошая порция избыточной информации (salt - соли), и выдернуть пароль назад оттуда не представляется возможным. Так что, "взлом" паролей возможен лишь методом подбора оного. Ну, а если пользователь легальный и пароль действительный, то зашифруя его, мы сразу же успешно проходим аутентификацию.
За что мне нравится Perl, так это ненужность изобретать велосипеды.
проверка пароля сводится к вызову стандартной системной функции crypt($text,$salt). Действует она так :
в качестве параметров подается пароль в "чистом" виде и зашифрованный, на выходе она должна выдать тот же зашифрованный пароль. Если этого не произошло, значит пароль в виде простого текста был неправильный.