Скрипт фотогалереи, версия 0.10

Saturday, 20 February 2010 | Автор: programmer

Это очередное обновление скрипта фотогалереи принесло нам 2 изменения. Также как и в гостевой книге, в этой версии мы создадим модуль обновления скрипта, а также добавим новый модуль в backend сайта (админку) - менеджер пользователей. Модуль даст возможность добавлять пользователей, которые могут иметь доступ к админке. Данный механизм создаем средставами работы с файлами конфигурации apache: .htpasswd и .htaccess.

 

Описывать работу скрипта обновления не буду, Вы можете посмотреть как он работает в этой статье. А вот на создании второго модуля остановимся немного подробнее. Описывать все директивы дополнительных файлов конфигурации .htaccess и .htpasswd не буду, рассмотрю только те, которые я использовал:

 

.htaccess

DirectoryIndex admin.php
AuthType Basic
AuthName "Admin PhotoGallery"
AuthUserFile d:webservershometest6.ruwwwadmin.htpasswd
require valid-user

 

1 строка: указывает, что если мы обращаемся к корню директории admin, т.е., например, http://phpprogs.ru/test/photogallery/admin/, то идет перенаправление на http://phpprogs.ru/test/photogallery/admin/admin.php.

2 строка: указывает, что мы будем использовать базовую http-аутентификацию.

3 строка: указываем какой текст должен быть выдан в диалоговом окне при вводе логина и пароля для доступа к папке.

4 строка: указывам имя файла с полным путем до файла с паролями.

и 5 строка воспринимается apache как выдача доступа к папке тем пользователям, которые ввели связку логина и пароля из файла AuthUserFile.

 

.htpasswd

admin:$apr1$Nl4.....$L02jyJtBCEraLs6p1tYNb0
a:1$nkwRIV7NHqA

 

Собственно структура файла .htpasswd проста "Логин:Зашифрованный_пароль"

 

Т.к. .htpasswd является текстовым файлом, собственно вся работа этого модуля будет сводиться к чтению и записи данного файла.

Вывод и удаление связок "логин:пароль" не составляет труда, остановимся непосредственно на сохранение новых пользователей (изменение паролей уже у существующих):

                        $fp = fopen(".htpasswd", "r");
                        if ($fp) {
                            while (!feof($fp)) {
                                $temp = str_replace("n", "", str_replace("r", "", fgets($fp)));
                                if (strpos($temp, ":") !== false)
                                    $result[] = split(":", $temp);
                            }
                            fclose($fp);
                        }

                        $fp = fopen(".htpasswd", "w");
                        foreach ($result as $row) {
                            if ($row[0] != trim($_POST['login']))
                                fwrite($fp, implode(":", $row)."n");
                        }
                        fwrite($fp, trim($_POST['login']).":".crypt($_POST['pass'],CRYPT_MD5)."n");
                        fclose($fp);

 

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

 

Теперь Вы можете защитить работу админки от посторонних глаз и рук.

 

P.S.: я в скрипте сделал, чтобы нельзя было изменить и удалить пользователя admin, попробуйте найти сами это в коде и убрать.

 

Пример работы скрипта: http://phpprogs.ru/test/photogallery/

Скачать проект Вы можете по ссылке: [attachment=5]

Обсуждение скрипта: http://phpprogs.ru/forum/
 
Tweet


Категория(и): Изучаем PHP, Скрипты, MySQL

Комментарии


Saturday, 20 February 2010 | 23:12:51 | Автор: Phoenix
А вот какой вопрос. Каким методом получается и шифруется пароль для пользователей? В файле .htpasswd есть запись
admin:$apr1$Nl4.....$L02jyJtBCEraLs6p1tYNb0
то что до и после двоеточия стоит понятно. Но не понятно что за метод шифрования. Судя по записи
fwrite($fp, trim($_POST['login']).":".crypt($_POST['pass'],CRY
PT_MD5)."n");
используется метод MD5, но тогда пароль "admin" должен бы был иметь следующую запись
21232f297a57a5a743894a0e4a801fc3
Будьте добры, проясните пожалуйста.
Saturday, 20 February 2010 | 23:38:31 | Автор: programmer
Phoenix,
Тут такой конфуз вышел, что для формирования htpasswd в начальном варианте я использовал другую функцию и она работала на *nix-сервере, а вот на винде созданные этой функцией пароли не работали.

Из-за этого метод шифрования я сменил, а пароль админа остался старый просто. Но Вы все правильно подметили
Saturday, 20 February 2010 | 23:52:06 | Автор: Phoenix
Но если используется метод MD5, то почему когда заводим ради эксперимента нового пользователя например root, и пароль ставим тоже root, то после в файле .htpasswd появляется запись
root:1$gF3BQziHh6Q
а если бы было MD5, то должно было бы выйти
root:63a9f0ea7bb98050796b649e85481845

Или я где-то не догоняю?
Sunday, 21 February 2010 | 00:13:13 | Автор: Phoenix
после уточнения некоторых моментов по справочнику и методом научного тыка стоку
fwrite($fp, trim($_POST['login']).":".crypt($_POST['pass'],CRY
PT_MD5)."n");
переписал в
fwrite($fp, trim($_POST['login']).":".md5($_POST['pass']).&quo;
t;n");

Теперь на выходе получил чистый MD5
Wednesday, 24 February 2010 | 00:09:43 | Автор: Phoenix
И всё-равно что-то не выходит. Хотя и на выходе в файле получили MD5, в админку попасть после добавления пользователя и входе под логином и паролем нового пользователя не получается. То же самое если ничего не менять. Добавляю пользователя, затем закрываю браузер, запускаю браузер, и под правами нового пользователя попасть в админку не получается. Под правами admin/admin без вопросов.
Где копать, подскажите?
Wednesday, 24 February 2010 | 06:38:06 | Автор: programmer
Phoenix,
сам копаю эту проблему и эта проблема называется Windows. На *nix все нормально, а вот в винде фигня. Придется наверное переделать эту аутентификацию без использования htpasswd и htaccess, сделать просто через БД
Добавить комментарий
Чтобы оставить комментарий, Вам необходимо зарегистрироваться или авторизироваться