Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Написание админки для блога
 
 автор: hxt   (12.01.2011 в 20:34)   письмо автору
 
 

Пишу себе блог. Решил начать с админки.
Возник вопрос: как защитить админку от посторонних, т.е. сделать так, чтобы вход в нее выполнялся после проверки логина/пароля. И только после ввода логина и пароля нужно отобразить страницу добавления новой записи.

Подскажите, пожалуйста, как лучше мне сделать защищенную админку.

Я попытался написать код, но думаю что я написал бред, который нельзя использовать для блога :)


<?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";
    
//Здесь нужно выводить форму для добавления заметки
    //Либо реализовать ее в другом файле
    
}

?>

  Ответить  
 
 автор: cheops   (12.01.2011 в 21:43)   письмо автору
 
   для: hxt   (12.01.2011 в 20:34)
 

Хм... а у вас в таблице rule будет лишь одна запись? Кроме того, не понятно, как вы будете фиксировать факт входа на страницу. Обычно, в сессию помещают какой-то флаг, чтобы после аутентификации не проходить её по-новой на каждой странице.

Вы также можете воспользоваться готовой системой аутентификации по ссылке http://softtime.ru/info/authorization.php

  Ответить  
 
 автор: hxt   (12.01.2011 в 22:57)   письмо автору
 
   для: cheops   (12.01.2011 в 21:43)
 

Благодарю за ссылку.
Кстати, буквально вчера купил вашу книгу "Самоучитель PHP 5 / 6". Буду заново учиться хорошему стилю программирования.

  Ответить  
 
 автор: neadekvat   (12.01.2011 в 21:49)   письмо автору
 
   для: 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; Соответственно, если до остального кода интерпритатор вообще дошел - значит доступ у пользователя есть.

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

[поправлено модератором]

  Ответить  
 
 автор: hxt   (12.01.2011 в 22:50)   письмо автору
 
   для: neadekvat   (12.01.2011 в 21:49)
 

Я недавно начал изучать PHP и чтобы хоть как то закрепить знания, пробую писать корявый блог :).

>Зачем два регулярных выражения, если они все равно хэшируются в md5?
Не подумал. Я начитался в учебниках, что все переданные параметры нужно проверять, поэтому написал два регулярных выражения.

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

>Вы храните настройки по горизонтале. Что вы будете делать, когда их станет сотня?
Не совсем понял, что значит в "горизонтале". В этой таблице я думал хранить только логин и пароль от админки.

>Выберите себе другой стиль расставления фигурных скобок в условном операторе - выбранный вами довольно непопулярным, и, как мне кажется, по вполне объективным причинам - нечитабельно.
Может быть. Наверно мне нужно было учиться по книгам более компетентных авторов.

  Ответить  
 
 автор: neadekvat   (12.01.2011 в 23:03)   письмо автору
 
   для: hxt   (12.01.2011 в 22:50)
 

Ну, я, не дай бог, не возьмусь судить о компетентности авторов. Но все-таки - что за книжка и какие авторы?

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

> Про хеширование логина тоже начитался. Советуют что так будет безопаснее, если хакер доберется до таблицы.
В моих админках логин всегда один - admin. Но поверьте, ее запарятся ломать :) Так что хэшировать логины не надо.

> Не совсем понял, что значит в "горизонтале". В этой таблице я думал хранить только логин и пароль от админки.
Возможно, такую информацию есть смысл хранить в файле. А то целая таблица, да в два поля, да ради одной строки.. Хотя, может, это я маразматик.

> Может быть.
Да нет, сто процентов. Вообще прочитайте про стандраты оформления кода. Вы должны выработать для себя единый стиль, которому будете всегда следовать.
Например, вот.
Правда, меня она не совсем устраивает и я на ее основе сделал свое.

  Ответить  
 
 автор: hxt   (12.01.2011 в 23:22)   письмо автору
 
   для: neadekvat   (12.01.2011 в 23:03)
 

Я учился по книге Владимира Дронова http://vgi.volsu.ru:8000/~Vladimir.Dronov/books/phpmysqldreamweavercs4.html
А HTML изучал по книге Дунаева http://www.ozon.ru/context/detail/id/2572399/

  Ответить  
 
 автор: neadekvat   (12.01.2011 в 23:40)   письмо автору
 
   для: hxt   (12.01.2011 в 23:22)
 

Хм.. почитайте Тима Конверса - "PHP 5 и MySQL. Библия пользователя".
А по поводу html - я в свое время учился на этом.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования