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

Форум PHP

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

 

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

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

тема: Логика системы авторизации пользователя
 
 автор: Manwen   (07.04.2011 в 15:20)   письмо автору
 
 

Верна ли логика скрипта авторизации (файл index.php):


<?php
session_start
();

if (!empty(
$_POST['login']) && !empty($_POST['passw']))
{
        if (!
get_magic_quotes_gpc())
        {
            
$_POST['login'] = mysql_escape_string($_POST['login']);
            
$_POST['passw'] = mysql_escape_string($_POST['passw']);
        }
        
        
$query "SELECT user, pass FROM auth WHERE id=1";
        
$usr mysql_query($query);
        if (!
$usr) exit('Ошибка авторизации');
        
        if (
$_POST['login'] == mysql_result($usr0'user'))
        {
            
$pass mysql_result($usr0'pass');
            
$result md5($_POST['passw']);
            
            if (
$result == mysql_result($usr0'pass'))
            {
                
$_SESSION['id'] = md5(mysql_result($usr0'user').$result);
                
header('Location: edit.php');
            }
            else
                echo 
"Ошибка";
        }
        else
            echo 
"Ошибка";
}
else
    echo 
"Ошибка";
?>


В файле edit.php примерно будет так:
1. начать сессию
2. проверить, совпадает ли хеш логина и пароля. Если нет, то функцией exit() прерываем работу скрипта. Если все правильно, то пускаем дальше.

  Ответить  
 
 автор: cheops   (07.04.2011 в 15:29)   письмо автору
 
   для: Manwen   (07.04.2011 в 15:20)
 

Хм... а у вас будет только один пользователь (c id = 1)?

  Ответить  
 
 автор: Manwen   (07.04.2011 в 15:30)   письмо автору
 
   для: cheops   (07.04.2011 в 15:29)
 

Да. Это небольшой блог. Думаю не нужно будет много записей, поэтому я вбил в базу одного пользователя.

  Ответить  
 
 автор: cheops   (07.04.2011 в 16:22)   письмо автору
 
   для: Manwen   (07.04.2011 в 15:30)
 

Может тогда вообще id исключить из системы (и пользоваться LIMIT 1)?

Нарушений логики вроде нет, но не понятно зачем хэш пароля в сессии (вы же не будете его нигде на странице подставлять)?

  Ответить  
 
 автор: Manwen   (07.04.2011 в 16:41)   письмо автору
 
   для: cheops   (07.04.2011 в 16:22)
 

Хеш в сессии наверно плохая идея, но лучше я ничего пока не придумал, чтобы на другой странице определить авторизован ли админ или нет.

Я пробовал подставлять константу при успешной авторизации, к примеру так: if(!defined("IN_ADMIN")) die; , но другой файл не видит что я авторизовался и прерывает выполнение.

  Ответить  
 
 автор: cheops   (07.04.2011 в 17:08)   письмо автору
 
   для: Manwen   (07.04.2011 в 16:41)
 

Сессия только вам доступна для редактирования - поместите в неё флаг, просто цифру 1. Без авторизации этот флаг не получить и хэш храниться не будет, а то мало ли где выведется случайно.

  Ответить  
 
 автор: Manwen   (07.04.2011 в 19:17)   письмо автору
 
   для: cheops   (07.04.2011 в 17:08)
 

А можно в сессию константу загнать? Например, в этой статье http://www.softtime.ru/info/articlephp.php?id_article=34 используется константа define("IN_ADMIN", TRUE); и она проверяется в каждом файле.
Вот только как бы мне эту проверку "элегантней" реализовать.

  Ответить  
 
 автор: cheops   (07.04.2011 в 19:37)   письмо автору
 
   для: Manwen   (07.04.2011 в 19:17)
 

Константу нет, но можно использовать переменную. Присвойте ей любое значение, хотя бы тоже true и проверяйте.

  Ответить  
 
 автор: Manwen   (07.04.2011 в 21:42)   письмо автору
 
   для: cheops   (07.04.2011 в 19:37)
 

Если я в таблице сделаю еще одно поле, например "code" и при успешной проверке я буду в $_SESSION['id'] загонять хеш поля "code", а в другом фале буду проверять: есть ли этот хеш в $_SESSION['id'].

Это будет глупо или можно прибегнуть даже к такому способу?

  Ответить  
 
 автор: cheops   (07.04.2011 в 22:32)   письмо автору
 
   для: Manwen   (07.04.2011 в 21:42)
 

А зачем такие сложности? Злоумышленники все-равно до значений внутри сессии добраться не смогут.

  Ответить  
 
 автор: Manwen   (07.04.2011 в 22:59)   письмо автору
 
   для: cheops   (07.04.2011 в 22:32)
 

Думал как лучше :)
Спасибо Игорь Вячеславович за помощь. Буду теперь дальше двигаться.

  Ответить  
 
 автор: tvv123456   (07.04.2011 в 18:29)   письмо автору
 
   для: Manwen   (07.04.2011 в 15:20)
 

Вот этот блок я все-таки считаю лишним,


<?php

        
if (!get_magic_quotes_gpc())
        {
            
$_POST['login'] = mysql_escape_string($_POST['login']);
            
$_POST['passw'] = mysql_escape_string($_POST['passw']);
        }


так как вы в запросе не используете ни
$_POST['login'] ни $_POST['passw']
, более того если вы храните в базе какой-нибудь не стандартный логин(d'artanyan, допустим) и будете в форме указывать его, то в $_POST['login'] вы получите d\'artanyan, а из базы вытащите d'artanyan, и в итоге долго будете мучаться и думать почему не срабатывает условие
<?
 
if ($_POST['login'] == mysql_result($usr0'user')) 


Думаю это можно считать ошибкой в логике

Есть еще пару замечаний, но они не очень существенные

  Ответить  
 
 автор: Manwen   (07.04.2011 в 21:23)   письмо автору
 
   для: tvv123456   (07.04.2011 в 18:29)
 

Да, точно. Я же базе данных не передаю значения из полей ввода. Хотя эта проверка не помешает, мало ли.
А какие замечания?

  Ответить  
 
 автор: tvv123456   (07.04.2011 в 23:30)   письмо автору
 
   для: Manwen   (07.04.2011 в 21:23)
 

>Да, точно. Я же базе данных не передаю значения из полей ввода.
> Хотя эта проверка не помешает, мало ли.
Ну, я написал какая пакость может быть от этого "мало ли", и вообще когда составляете запросы к базе лучше в этом запросе и обрабатывать все входящие данные(предварительно почистив от маг. кавычек)

<?
//чистим POST от маг. кавычек если такие включены
//так как ПОСТ чистый, то спокойно можем делать всякие проверки
$sql "SELECT * FROM table WHERE filed1=".(int)$_POST['integer']."
 OR filed2="
.mysql_real_escape_string($_POST["string"]);
$query mysql_query($sql);
//и дальше можем использовать ПОСТы так как они не захламлены экранирующими слешами

-и никогда не будет конфликта при сравнении(то что я выше написал)
>А какие замечания?
Несущественные:
mysql_escape_string уже вроде как устарел
Очень много else подряд: для меня привычней, если условие не выполняеться(сравнение логинов вернуло false), то просто формируем отчет об ошибочке и завершаем работу скрипта. И не будет ни одного else и проще логику проследить. Но это мое субъективное мнение

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

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