|
|
|
| Пишу себе блог. Решил начать с админки.
Возник вопрос: как защитить админку от посторонних, т.е. сделать так, чтобы вход в нее выполнялся после проверки логина/пароля. И только после ввода логина и пароля нужно отобразить страницу добавления новой записи.
Подскажите, пожалуйста, как лучше мне сделать защищенную админку.
Я попытался написать код, но думаю что я написал бред, который нельзя использовать для блога :)
<?php
session_start();
//Подключаю конфигурационный файл для доступа к БД
require_once("config.php");
$logged = 0;
if ($logged == 0)
{
echo '<form action="test.php" method="post">';
echo '<p><input name="login"></p>';
echo '<p><input name="passw"></p>';
echo '<p><input name="submit" type="submit" value="Войти"></p>';
}
if (!isset($_POST['login']) && ($_POST['passw']))
{
$logged = 0;
}
else
{
$login = preg_replace("/[^0-9a-zA-Z]/i", "", $_POST['login']);
$passw = preg_replace("/[^0-9a-zA-Z]/i", "", $_POST['passw']);
//Шифрую логин
$login = md5($_POST['login']);
//Шифрую пароль
$passw = md5($_POST['passw'].$salt);
//Запрашиваю логин и пароль из БД
$query = "SELECT user, pass FROM rule";
$lst = mysql_query($query);
$log_pass = @mysql_fetch_array($lst);
//Сравниваю логин и пароль
if ($login != $log_pass['user'] && $val2 != $log_pass['passw'])
{
$logged = 0;
}
else
{
$logged = 1;
}
}
if ($logged == 1)
{
echo "Enter";
//Здесь нужно выводить форму для добавления заметки
//Либо реализовать ее в другом файле
}
?>
|
| |
|
|
|
|
|
|
|
для: hxt
(12.01.2011 в 20:34)
| | Хм... а у вас в таблице rule будет лишь одна запись? Кроме того, не понятно, как вы будете фиксировать факт входа на страницу. Обычно, в сессию помещают какой-то флаг, чтобы после аутентификации не проходить её по-новой на каждой странице.
Вы также можете воспользоваться готовой системой аутентификации по ссылке http://softtime.ru/info/authorization.php | |
|
|
|
|
|
|
|
для: cheops
(12.01.2011 в 21:43)
| | Благодарю за ссылку.
Кстати, буквально вчера купил вашу книгу "Самоучитель PHP 5 / 6". Буду заново учиться хорошему стилю программирования. | |
|
|
|
|
|
|
|
для: hxt
(12.01.2011 в 20:34)
| | Вы умеете работать с сессиями?
А теперь пару пунктиков.. при этом вопрос о сессиях имеет больший приоритет, чем написано ниже.
1. Пока ниче не говорим про флаг $logged = 0; ибо он напрямую относится к вопросу работы сессий, которую вам надо освоить и применить.
2. Но что вы имели ввиду здесь:
if (!isset($_POST['login']) && ($_POST['passw']))
|
?
3. Зачем два регулярных выражения, если они все равно хэшируются в md5?
4. И сразу же вытекает следующий вопрос - зачем хэшируется логин?
5. Судя по запросу
$query = "SELECT user, pass FROM rule";
|
Вы храните настройки по горизонтале. Что вы будете делать, когда их станет сотня?
Лучше создать в таблице два поля - name и value, где певрое - имя опции (является первичным ключем), а второе - его значение.
6. Чем вы объясните постановку @ в следующем коде:
$log_pass = @mysql_fetch_array($lst);
|
7.
if ($login != $log_pass['user'] && $val2 != $log_pass['passw'])
|
Что-то я упустил.. откуда здесь $val2?
8. Я посмотрю на вас, как вы будете пихать обработчики в эти фигурные скобки
<?php
if ($logged == 1)
{
echo "Enter";
//Здесь нужно выводить форму для добавления заметки
//Либо реализовать ее в другом файле
}
|
Я бы посоветовал для логина использовать файл, который бы подключался к основному (если работа идет через один файл - и это предпочительнее) или во все рабочие файлы, и который при отсуствии доступа заканчивался бы die; Соответственно, если до остального кода интерпритатор вообще дошел - значит доступ у пользователя есть.
И еще одно.. так, рекомендация.
Выберите себе другой стиль расставления фигурных скобок в условном операторе - выбранный вами довольно непопулярным, и, как мне кажется, по вполне объективным причинам - нечитабельно.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2011 в 21:49)
| | Я недавно начал изучать PHP и чтобы хоть как то закрепить знания, пробую писать корявый блог :).
>Зачем два регулярных выражения, если они все равно хэшируются в md5?
Не подумал. Я начитался в учебниках, что все переданные параметры нужно проверять, поэтому написал два регулярных выражения.
>И сразу же вытекает следующий вопрос - зачем хэшируется логин?
Про хеширование логина тоже начитался. Советуют что так будет безопаснее, если хакер доберется до таблицы.
>Вы храните настройки по горизонтале. Что вы будете делать, когда их станет сотня?
Не совсем понял, что значит в "горизонтале". В этой таблице я думал хранить только логин и пароль от админки.
>Выберите себе другой стиль расставления фигурных скобок в условном операторе - выбранный вами довольно непопулярным, и, как мне кажется, по вполне объективным причинам - нечитабельно.
Может быть. Наверно мне нужно было учиться по книгам более компетентных авторов. | |
|
|
|
|
|
|
|
для: hxt
(12.01.2011 в 22:50)
| | Ну, я, не дай бог, не возьмусь судить о компетентности авторов. Но все-таки - что за книжка и какие авторы?
> Не подумал. Я начитался в учебниках, что все переданные параметры нужно проверять, поэтому написал два регулярных выражения.
По сути, верное утверждение. Правда, несколько неточное. Не думаю, что в книге просто так кинули фразу и пошли дальше.
> Про хеширование логина тоже начитался. Советуют что так будет безопаснее, если хакер доберется до таблицы.
В моих админках логин всегда один - admin. Но поверьте, ее запарятся ломать :) Так что хэшировать логины не надо.
> Не совсем понял, что значит в "горизонтале". В этой таблице я думал хранить только логин и пароль от админки.
Возможно, такую информацию есть смысл хранить в файле. А то целая таблица, да в два поля, да ради одной строки.. Хотя, может, это я маразматик.
> Может быть.
Да нет, сто процентов. Вообще прочитайте про стандраты оформления кода. Вы должны выработать для себя единый стиль, которому будете всегда следовать.
Например, вот.
Правда, меня она не совсем устраивает и я на ее основе сделал свое. | |
|
|
|
|
|
|
|
|
для: hxt
(12.01.2011 в 23:22)
| | Хм.. почитайте Тима Конверса - "PHP 5 и MySQL. Библия пользователя".
А по поводу html - я в свое время учился на этом. | |
|
|
|