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

Форум PHP

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

 

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

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

тема: Организация админки
 
 автор: Ванек2010   (31.07.2010 в 23:09)   письмо автору
 
 

Подскажите, как лучше всего организовывать админку?

  Ответить  
 
 автор: neadekvat   (31.07.2010 в 23:18)   письмо автору
 
   для: Ванек2010   (31.07.2010 в 23:09)
 

Что вы ожидаете увидеть в ответ?

  Ответить  
 
 автор: Рома   (01.08.2010 в 00:44)   письмо автору
 
   для: Ванек2010   (31.07.2010 в 23:09)
 

Почему бы рядом с кнопкой ответить, в зависимости от полномочий конечно, не поставить кнопки редактировать/удалить/переименовать/и т.д.? Тогда и организовывать почти ничего не надо, разве что полномочия.

  Ответить  
 
 автор: neadekvat   (01.08.2010 в 01:44)   письмо автору
 
   для: Рома   (01.08.2010 в 00:44)
 

Ага, а двойной щелчок на контентной области открывает глобальные настройки типа доступов к бд и кол-ва записей на страницу :)

  Ответить  
 
 автор: Ванек2010   (02.08.2010 в 10:01)   письмо автору
 
   для: neadekvat   (01.08.2010 в 01:44)
 

Например, что скажите на счет этого скрипта авторизации? Я его чуток доделал, с md5 и логирование, кто зашел, кто пытается зайти и т.д.
<?php
if (!isset($_SERVER['PHP_AUTH_USER']))
{
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        
Header ("HTTP/1.0 401 Unauthorized");
        
table_error("Вход в Админ-Панель"); // Логирование
        
exit();
}
else 
{
        if (!
get_magic_quotes_gpc()) {
        
                
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
                
$_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
        
$password md5("$_SERVER[PHP_AUTH_PW]"); 
}
        
$query "SELECT password FROM admins_m WHERE login='".$_SERVER['PHP_AUTH_USER']."'";
        
$lst = @mysql_query($query);

        if (!
$lst)
        {
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        
Header ("HTTP/1.0 401 Unauthorized");
        exit();
        }

        if (
mysql_num_rows($lst) == 0)
        {
           
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           
Header ("HTTP/1.0 401 Unauthorized");
           
table_error("Не верный логин или пароль"); // Логирование
           
exit(); 
        }
        
$pass =  @mysql_fetch_array($lst);
        if (
$password != $pass['password'])
        {
           
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           
Header ("HTTP/1.0 401 Unauthorized");
           
table_error("Не верный логин или пароль"); // Логирование
           
exit();
        }

?>

  Ответить  
 
 автор: neadekvat   (02.08.2010 в 10:23)   письмо автору
 
   для: Ванек2010   (02.08.2010 в 10:01)
 

1.
> Я его чуток доделал
То есть не вы это писали?
Выкиньте и пишите с нуля.

2.
> if (!get_magic_quotes_gpc())
Раньше я делал также. Вы не представляете, насколько облегчается жизнь, когда не надо вспоминать об это фигне.
В .htaccess выставьте
php_flag magic_quotes_gpc Off

И на случай, если .htaccess не поддерживается, сначала (например, у меня это файл, который подключается в начале каждого скрипта) обрабатывайте данные подобным образом:
<?php
function OwnStripSlashes($data)      
{
    if(
is_array($data))
        
$data array_map('OwnStripSlashes'$data);
    else
        
$data stripslashes($data);

    return 
$data;
}

if (
get_magic_quotes_gpc()) {
    
$_GET OwnStripSlashes($_GET);
    
$_POST OwnStripSlashes($_POST);
    
$_COOKIE OwnStripSlashes($_COOKIE);
}


3.
> mysql_escape_string
Эта функция помечена как устаревшая и будет удалена в следующей версии PHP, используйте mysql_real_escape_string

4.
> $_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
В суперглобальных массивах желательно хранить исходные данные, чтобы далее всегда можно было к ним обратиться, а для обработанных данных создавать новую переменную.

5.
Грубейшая ошибка, вы экранируете пароль, а потом хэшируеете его. Но ведь хэш вычисляется уже не от пароля, а от пароля, в котором экранированы символы. Экранировать пароль не нужно.
<?php
$_SERVER
['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']); 
$password md5("$_SERVER[PHP_AUTH_PW]"); 


6.
> @mysql_query
Зачем здесь и далее по скрипту подавление ошибок?
Вы знаете, когда mysql_query или mysql_fetch_array начинают сами по себе выводить на экран ошибки? Когда есть ошибки в синтаксисе или когда во вторую функцию подставлен не ресурс, указывающий на ответ бд.
Поэтом убирайте все эти собачки, выставляйте уровень ошибок E_ALL, откатывайте скрипт так, чтобы никаких нотайсов даже не было. А на рабочем проекте ставьте уровень ошибок в 0.

7.
Для интерпритатора что !$var, что $var == 0 - это одно и то же. Поэтому вы, фактически, два раза одно и то же проверяете. Один блок лишний.
<?php
        
if (!$lst
        { 
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); 
        
Header ("HTTP/1.0 401 Unauthorized"); 
        exit(); 
        } 

        if (
mysql_num_rows($lst) == 0
        { 
           
Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); 
           
Header ("HTTP/1.0 401 Unauthorized"); 
           
table_error("Не верный логин или пароль"); // Логирование 
           
exit();  
        }


8.
> mysql_fetch_array
Используйте лучше mysql_fetch_assoc, ибо первая функция возвращает на один ненужный массив больше.
Кстати говоря, чтобы вернуть один столбец, есть функция mysql_result:
<?php
$pass 
=  mysql_result($lst0); 
if (
$password != $pass)

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

9.
С именованием переменных у вас проблемы.
Для запросов, например, принято использовать $query или $result - так просто проще ориентироваться в чужом коде. Сравнение двух паролей, тем более, если использовать приведенный мной вариант, вообще может вызвать когнитивный диссонанс.

Вот такие дела, если в двух словах.

  Ответить  
 
 автор: Ванек2010   (02.08.2010 в 11:17)   письмо автору
 
   для: neadekvat   (02.08.2010 в 10:23)
 

Ух, спасибо за такую информацию

  Ответить  
 
 автор: Ирбис   (02.08.2010 в 11:55)   письмо автору
 
   для: neadekvat   (02.08.2010 в 10:23)
 

Реализация вот этой функции очень понравилась:

<?php 
function OwnStripSlashes($data)       

    if(
is_array($data)) 
        
$data array_map('OwnStripSlashes'$data); 
    else 
        
$data stripslashes($data); 

    return 
$data


if (
get_magic_quotes_gpc()) { 
    
$_GET OwnStripSlashes($_GET); 
    
$_POST OwnStripSlashes($_POST); 
    
$_COOKIE OwnStripSlashes($_COOKIE); 
}


У меня тоже во всех скриптах подлючается подобная, но не такая изящная.

  Ответить  
 
 автор: neadekvat   (02.08.2010 в 13:46)   письмо автору
 
   для: Ирбис   (02.08.2010 в 11:55)
 

Этот принцип есть в открытом доступе, я тут ничего не придумал :)

  Ответить  
 
 автор: Ирбис   (02.08.2010 в 21:56)   письмо автору
 
   для: neadekvat   (02.08.2010 в 13:46)
 

Но зато открыли для меня такую полезную функцию. Возьму на вооружение. Спасибо!

  Ответить  
 
 автор: tvv123456   (02.08.2010 в 18:33)   письмо автору
 
   для: neadekvat   (02.08.2010 в 10:23)
 

Не согласен вот с этим пунктом:

7.
Для интерпритатора что !$var, что $var == 0 - это одно и то же. Поэтому вы, фактически, два 
раза одно и то же проверяете. Один блок лишний.

 <?php 
        
if (!$lst)         {  
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");  
        
Header ("HTTP/1.0 401 Unauthorized");  
        exit();  
        }  

        if (
mysql_num_rows($lst) == 0)         {  
           
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");  
           
Header ("HTTP/1.0 401 Unauthorized");  
           
table_error("Не верный логин или пароль"); // Логирование  
           
exit();   
        }  


В первом случае проверяеться прошел ли запрос к базе и если он прошел но вернул 0 строк то $lst все равно примет значение истины, а вот mysql_num_rows($lst - позволяет подсчитать сколько именно строк пришло с запросом.

  Ответить  
 
 автор: neadekvat   (02.08.2010 в 18:37)   письмо автору
 
   для: tvv123456   (02.08.2010 в 18:33)
 

Да, точно, !$lst сработает только в случаи какой-то ошибки, а не пустого результата.
Спасибо, что поправили.

  Ответить  
 
 автор: tvv123456   (02.08.2010 в 18:18)   письмо автору
 
   для: Ванек2010   (02.08.2010 в 10:01)
 

А у вас очень серьезная дыра в коде:

<?
if (!get_magic_quotes_gpc()) { 
         
                
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']); 

...........................

_gpc это абривиатура от GET/POST/COOKIE, и сюда как видите не входит $_SERVER. следовательно когда включены магические кавычки не факт что будет обрабатываться $_SERVER, а следовательно дырка

  Ответить  
 
 автор: Рома   (02.08.2010 в 17:56)   письмо автору
 
   для: neadekvat   (01.08.2010 в 01:44)
 

Это вы к чему?

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

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