Система авторизации пользователя - помогите разобраться.

Статус
В этой теме нельзя размещать новые ответы.

Batia

Новичок
Система авторизации пользователя - помогите разобраться.

Решил я тут "прокачаться" слегка - и наконец то заняться практическим применением ПХП в полную меру - благо время теперь позволяет.

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

Вот что у меня получилось:

PHP:
<?
// Стартуем сессию...
 session_start();	
 
// имя юзера и пароль админа
$admin_login="admin";
$admin_pass="123";

/*
Обработка данных POST массива.
Пока что без безопасных элементов.
*/
if(isset($_POST['login']) & isset($_POST['pasword']))
 {
   // Присвоим полученные данные - некоторым переменным.
   $user_name=$_POST['login'];
   $user_pass=$_POST['pasword'];
   
   // Если имя и пароль неверные - выход.
   if($user_name != $admin_login) { echo "Login - не верный <BR><a href='index.php'>Back</a>"; exit(); }
   if($user_pass != $admin_pass) { echo "Password - не верный <BR><a href='index.php'>Back</a>"; exit(); }
   
   // Независимо от того - есть ли у нас кука с логином или нет 
   // -записываем в нее новое значение.
   // Куку ставим на 
   SetCookie("user_name", $user_name, time() + 3600);
   
   // Кука поставлена, теперь при следующем входе - имя будет уже введено 
   // в поле login
   
   // Теперь займемся созданием сессии...
   
   // Если $_SESSION["auth_status"] не существует - то присвоим ей значение - "admin"
   if(!isset($_SESSION["auth_status"]))
    {
	  $_SESSION["auth_status"]="admin";
	}
 }
// Если в сессии есть значение
if(!isset($_SESSION["auth_status"]))
	 {
	   // Установим ключ - админ вы или нет - в положение - вывод формы ввода.
	   $key="form";
	 }
elseif($_SESSION["auth_status"]=="admin")
	 {
	   // Установим ключ - админ вы или нет - в положение - admin
	   $key="admin";
	 }

/*
Если пользователь не авторизировался - то выведем ему форму для 
авторизации пользователя. 

Проверять авторизирован или нет юзер будем при помощзи сессий.

Логин юзера будем сохранять в куках - на всякий случай.
*/

// Проверим - если существует кука с именем пользователя - значит присвоим 
// значение этой куки некоторой переменной, и вставим ее в тег <input name="login"...
if(isset($_COOKIE['user_name']))
 {
   $login=$_COOKIE['user_name'];
 }
else
 {
   $login="";
 }

?>

<? if($key=="form") { ?>
<form method="POST">
Login: <input type="text" name="login" value="<? echo $login ?>"><br>
Passw: <input type="password" name="pasword" value=""><br>
<input type="submit" value="Авторизация">
</form>
<? } ?>

<? if($key=="admin") { ?>
Ба!!! Я админ!!! 
<? } ?>
<br>
<br>
<a href="index.php">Back</a>
Хочется узнать у более опытных людей - насколько этот код правильный?
Можно ли его использовать для работающего сайта?
Нужно ли его как то обезопасить?
(наверное стоит сделать проверку вводимых данных, может быть подскажете нужные функции, чтобы я не перерывал весь мануал с ног до головы?)

В общем - очень хотелось бы услышать комментарии по улучшению.

Я же ведь велосипед изобрел :)
Писать код - тут 2 минуты не больше - а вот придумать его - это я часа полтора мучился - и в итоге - что вышло то вышло...

Жду коментариев....

(это мой первый подобный скрипт... так что - учтите этот факт при вашем ответе )
 

tf

крылья рулят

AmadMike

Новичок
if(!isset($_SESSION["auth_status"]))
{
// Установим ключ - админ вы или нет - в положение - вывод формы ввода.
$key="form";
}
elseif($_SESSION["auth_status"]=="admin")
{
// Установим ключ - админ вы или нет - в положение - admin
$key="admin";
}
А почему бы просто не спросить если статус "админ" - то админ, если нет - то форма.

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

20066temp

Новичок
Автор оригинала: tf
почему?
доказано на практике =)

IMHO у тебя слишком много комментариев в коде, по-моему, больше самого кода

и еще & - это операция над битами
 

phprus

Moderator
Команда форума
20066temp
Автор оригинала: tf
почему?

доказано на практике =)
Если ты не умеешь писать большие и безопасные программы, то это не значит, что остальные тоже не умеют писать большие и безопасные программы.
 

Фанат

oncle terrible
Команда форума
Batia
На первый взгляд - код нормальный. Хотя, конечно, если бы он был покороче раза в три, то можно было бы сказать поточнее.
AmadMike прав - чем компактнее код, тем проще заметить в нём косяк.

Несколько замечаний. Не стоит сообщать хакеру, что именно он ввёл неправильно - логин или пароль.

Сессию стартовать имеет смысл только тем, кто ввёл пароль. причём - правильный пароль.

Непонятен смысл проверки "Если $_SESSION["auth_status"] не существует". А что изменится, если её не будет?

-~{}~ 18.11.06 10:05:

прекратили дискуссию про объём кода.
 

Batia

Новичок
спасибо.

Сейчас попробую переделать....

tf
посмотри на синтаксис php5 (Глава 15. Операторы)
Подскажете хороший мануал в сети по PHP5 ?

а то я какой то нашел - но там половина на английском :(

-~{}~ 19.11.06 18:47:

На первый взгляд - код нормальный. Хотя, конечно, если бы он был покороче раза в три, то можно было бы сказать поточнее.
Как это раза в три?
Я сейчас конечно попробую - но неуверен что получится раза в 3 - максимум в 2...

-~{}~ 19.11.06 18:49:

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

phprus

Moderator
Команда форума

Batia

Новичок
вот что получилось на этот раз...
PHP:
<?
# Настройки доступа.
$admin_login="admin";
$admin_pass="123";

session_start();

	if(isset($_SESSION['auth'])) 
	{ 
	   $_POST['login']=$admin_login;
	   $_POST['pasword']=$admin_pass;
	} 
	
if( isset($_POST['login']) || isset($_POST['pasword']) )
 {
 // Проверяем введенные данные - удаляем из них HTML и PHP код
 $user_login=strip_tags($_POST['login']);
 $user_pass=strip_tags($_POST['pasword']);
 
	if(($user_login==$admin_login) && ($user_pass==$admin_pass))
	{
	  SetCookie("login",$user_login, time()+3600);
	  $_SESSION["auth"]="admin";
	  echo"Пароль верный! Куки выставлены! Можем юзать админпанель :)";
	}
	else 
	{
	  echo"pass or login - incorrect";
	}
 }
else
 {
 	if(isset($_COOKIE['login'])) { $login=$_COOKIE['login']; }
	else { $ligin=""; }
	 	  echo'
	<form method="POST">
	Login: <input type="text" name="login" value="'.$login.'"><br>
	Passw: <input type="password" name="pasword" value=""><br>
	<input type="submit" value="Авторизация">
	</form>';
 }
?>
<br>
<br>
<a href="index.php">Back</a>
Соответственно дальше подгружаем через include файл админки и работаем...
а еще можно везде в файлах админки проверить переменную
PHP:
$_SESSION['auth']=="admin"
-~{}~ 19.11.06 21:05:

и таким оразом определить пользователя.

-~{}~ 19.11.06 21:11:

кстати - может быть кто то поделится кодом чего то подобного - чтобы я посмотрел как это делают другие...?

Буду очень благодарен за помощь.
 

tf

крылья рулят
echo"Пароль верный! Куки выставлены! Можем юзать админпанель <img src="images/smilies/smile.gif" border="0" alt="">";
ответь плиз на измученный вопрос, как нам ищбавится от критичности кражи кук?
Как это раза в три?
Я сейчас конечно попробую - но неуверен что получится раза в 3 - максимум в 2...
не в уменьшении кода его защищенность

PHP:
if(isset($_SESSION['auth']))  
{  
       $_POST['login']=$admin_login; 
       $_POST['pasword']=$admin_pass; 
}  
     
if( isset($_POST['login']) || isset($_POST['pasword']) )
ты проверяеш вставляеш данные при сесии а потом их же проверяеш на существовании

-~{}~ 19.11.06 21:16:

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

AmadMike

Новичок
ты проверяеш вставляеш данные при сесии а потом их же проверяеш на существовании
Это он таким образом хочет объединить проверку сессии если пользователь уже зашел и проверку отправленных данных если он отправлял их из формы. Не лучший вариант на самом деле.
Куки с логином ставить тоже не нужно, вообще хранить в куках что-либо относящееся к приватной информации небезопасно, храни там id сессии, а все остальное храни в ней.
Примеры есть в интернете, юзай google ;)
 

AnToXa

prodigy-одаренный ребенок
phprus
tf
кстати, насчет размеров кода, интересная тема, насколько я читал и слышал про всякие исследования на эту тему получается, что количество дефектов на единицу изменения количества кода (functional points или kloc, других не встречал) примерно постоянно вне зависимости от применяемого инструмента разработки и технологии.
т.е. вывод - уменьшение количества кода приводит к уменьшению ошибок, большие приложения содержат больше ошибок.
причем где-то еще были исследования количества ошибок на строки кода в зависимости от количества этих строк в модуле, график где по x - строки кода в модуле, а по y - количество ошибок выглядит как парабола с "рогами" вверх. соответственно при линейном увеличении размера модуля после некоторого предела начинается взрывообразный рост количества ошибок, так что утверждение о том, что кто-то умеет писать большие программы без ошибок - довольно спорное с точки зрения этихз исследований и, имхо, здравого смысла.
по исследованиям ссылок нету прямо сейчас к сожалению, если кто-то действительно заинтересуется - могу поискать и сюда запостить наверное.
да, исследования Carnegie Mellon University www.cmu.edu/
 

tf

крылья рулят
так что утверждение о том, что кто-то умеет писать большие программы без ошибок - довольно спорное с точки зрения
ошибки созданы для того чтобы их исправлять ;)
в разумных пределах, создавая новые ошибки :)
ну а если код оттестить и потом не ломать то все нормально будет, имхо
AnToXa, давай
 

AnToXa

prodigy-одаренный ребенок
ну а если код оттестить и потом не ломать то все нормально будет, имхо
тесты не гарантируют отсутсвие ошибок, очевидно. даже в самом оттестированом софте находят ошибки, т.е. лучше меньше кода все же, тестировать меньше придется опять же :)

что-то плохо у меня получается это дело находить, вот пара занятных и не очень ссылок пока что
Cyclomatic complexity : http://www.sei.cmu.edu/str/descriptions/cyclomatic_body.html, тут неявно подразумевается, что чем больше программа - тем больше ошибок и рисков, плюс нелинейность роста.
вот отсюда еще можно по ссылкам походить еще: http://www.ece.cmu.edu/~koopman/des_s99/sw_reliability/

если найдете более релевантные ссылки - будет интересно почитать.
 

Batia

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

ты проверяеш вставляеш данные при сесии а потом их же проверяеш на существовании
ОГО! Это подметил - исправлю...

а общеобразовательный толк будет?
Несомненно будет... :хоть гляну как делать "правильно"

Куки с логином ставить тоже не нужно, вообще хранить в куках что-либо относящееся к приватной информации небезопасно, храни там id сессии, а все остальное храни в ней.
Это вот что то не очень понял...
ПРо хранение id сессий...

Может быть у вас есть ссылка на какую нибудь статью где это описано поподробнее? Или если вам не сложно - может быть вы подскажете как это делается? Я так еще не пробывал ни разу...
 

Фанат

oncle terrible
Команда форума
чувак просто не въехал в тему. он сам ещё чайник.
не парься, все у тебя нормально.
 

AmadMike

Новичок
Ну елки, сессии как устроены? Если разрешено - в куках сохраняется id сессии. А каким образом тогда пользователя то идентифицировать еще?
 

Batia

Новичок
AmadMike
гм... возможно я плохо знаю - что такое сессии... (не откажусь от ссылки на хорошую инструкцию)

но помойму у меня все нормально получилось.

Юзер заходит на страничку - вводит логин и пароль.

После чего логин сохраняется в куке - чтобы при следующем заходе на эту страничку - его можно было бы уже не вводить... он сам появится.

После захода на страничку администрирования - проверяется существует ли сессия или нет.

--------------------


ты проверяеш вставляеш данные при сесии а потом их же проверяеш на существовании
Тут подвох немного в другом.
Если переменная $_SESSION['auth'] существует - значит юзер точно админ - и значит нет смысла проверять POST переменные - мы сразу присвоим им значения
PHP:
$_POST['login']=$admin_login;
	   $_POST['pasword']=$admin_pass;
-~{}~ 20.11.06 22:38:

Вот как это сделано:
PHP:
	if(isset($_SESSION['auth'])) 
	{ 
	   $_POST['login']=$admin_login;
	   $_POST['pasword']=$admin_pass;
	}
- объясню принцып...
Если пользователь - админ - значит присваиваем переменным POST правильные значения:
PHP:
# Настройки доступа.
$admin_login="admin";
$admin_pass="123";
-~{}~ 20.11.06 22:49:

Вот еще решил добавить это:
PHP:
	if(isset($_SESSION['auth']) && $_SESSION['auth']=='admin') 
	{ 
	   $_POST['login']=$admin_login;
	   $_POST['pasword']=$admin_pass;
	}
Вместо этого:
PHP:
	if(isset($_SESSION['auth'])) 
	{ 
	   $_POST['login']=$admin_login;
	   $_POST['pasword']=$admin_pass;
	}
Посути добавил тока
PHP:
&& $_SESSION['auth']=='admin')
(* кстати - вопрос - почему нужно писать && - а не один значок & ??? Или можно все же писать один значек & ? может быть меня дезинформировали и в ПХП можно один знак ставить?)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху