Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Авторизауия и проверка авторизации..
Форумы портала PHP.SU » PHP » Программирование на PHP » Авторизауия и проверка авторизации..

Страниц (2): [1] 2 »
 

1. magistr - 15 Сентября, 2010 - 21:33:57 - перейти к сообщению
Всем доброе время суток...
Вот пытаюсь сделать небольшой сайт и столкнулся с такой проблемой, а именно авторизации пользователей.
Кто как проверяет авторизованный пользователь или нет?
Вот что получилось у меня.
Это код формы авторизации:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $login_post =  mysql_escape_string($_POST['login']);
  4. $pass_post =   mysql_escape_string(md5($_POST['pass']));
  5. $submit = $_POST['submit'];
  6. if (isset($login_post) AND  isset($pass_post) AND isset($submit))
  7. {
  8.    $result = mysql_query("SELECT * FROM user WHERE login='$login_post' AND pass ='$pass_post'",$db);
  9.    $result_login = mysql_num_rows($result);
  10.          if($result_login == 0)
  11.           {
  12.                  SetCookie("avtorizirt","0",time()+360000,"/");
  13.                  SetCookie("login","");
  14.                  SetCookie("pass","");
  15.                  $avtorizirt = 0;
  16.                  header('Location:http://www.*.ru/no_avtorizirt.php?error=1');
  17.                  exit();
  18.                  
  19.           }
  20.           else
  21.           {
  22.                  
  23.                   SetCookie("avtorizirt","1",time()+360000000,"/");
  24.                   $avtorizirt = 1;
  25.                   SetCookie("login",$login_post,time()+36000000,"/");
  26.                   SetCookie("pass",$pass_post,time()+36000000,"/");
  27.                   header('Location:http://www.*.ru/settings_catalog.php');
  28.           exit();
  29.           }    
  30. }
  31. else
  32. {
  33.  header('Location:http://www.*.ru/no_avtorizirt.php?error=1');
  34.  exit();
  35. }
  36. ?>
  37.  


это проверки авторизованный пользователь или нет:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. include("db.php");
  3. $avtorizirt = $_COOKIE['avtorizirt'];
  4. $login  = mysql_escape_string($_COOKIE['login']);
  5. $pass  = mysql_escape_string($_COOKIE['pass']);
  6. if ( $avtorizirt != 1)
  7. {
  8.         SetCookie("avtorizirt","0",time()+360000,"/");
  9.         $avtorizirt = 0;
  10. }
  11. else
  12. {
  13.   $zapros = mysql_query("SELECT * FROM user WHERE login='$login' AND pass ='$pass'",$db);
  14.   $user_array =  mysql_fetch_array($zapros);
  15.   if(mysql_num_rows($zapros) == 0)
  16.   {
  17.          SetCookie("avtorizirt","0",time()+360000,"/");
  18.          SetCookie("login","");
  19.          SetCookie("pass","");
  20.          $avtorizirt = 0;
  21.   }
  22.   else
  23.   {
  24.           SetCookie("avtorizirt","1",time()+360000000,"/");
  25.           $id_user = $user_array['id'];
  26.           $name_user = $user_array['login'];
  27.           $status_user = $user_array['status'];
  28.           $avtorizirt = 1;
  29.   }    
  30. }
  31. ?>


это код для проверки авторизованный пользователь или нет для закрытых частей сайт т.е. для тех страниц куда можно войти авторизированным ( в случае если не авторизован отправляет на другую страницу) :

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. include("db.php");
  4. $avtorizirt = $_COOKIE['avtorizirt'];
  5. $login  = mysql_escape_string($_COOKIE['login']);
  6. $pass  = mysql_escape_string($_COOKIE['pass']);
  7. $key = $_COOKIE['key'];
  8. if ( $avtorizirt != 1)
  9. {
  10.         SetCookie("avtorizirt","0",time()+360000,"/");
  11.         $avtorizirt = 0;
  12.         header('Location:http://www.*.ru/no_avtorizirt.php');
  13.     exit();
  14. }
  15. else
  16. {
  17.   $zapros = mysql_query("SELECT * FROM user WHERE login='$login' AND pass ='$pass'",$db);
  18.   $user_array =  mysql_fetch_array($zapros);
  19.   if(mysql_num_rows($zapros) == 0)
  20.   {
  21.          SetCookie("avtorizirt","0",time()+360000,"/");
  22.          SetCookie("login","");
  23.          SetCookie("pass","");
  24.          $avtorizirt = 0;
  25.          header('Location:http://www.*.ru/no_avtorizirt.php');
  26.      exit();
  27.   }
  28.   else
  29.   {
  30.           SetCookie("avtorizirt","1",time()+360000000,"/");
  31.           $id_user = $user_array['id'];
  32.           $name_user = $user_array['login'];
  33.           $status_user = $user_array['status'];
  34.           $avtorizirt = 1;
  35.   }    
  36. }
  37. ?>
  38.  

Все ли я правильно сделал? (может и вообще не правильно Недовольство, огорчение )
Что то может надо было делать по другому?
2. Uchkuma - 15 Сентября, 2010 - 21:42:14 - перейти к сообщению
Жесть. Вы там что, все в печеньках храните? Используйте сессии.
3. binders - 15 Сентября, 2010 - 22:40:55 - перейти к сообщению
вот моя недавняя тема по этому вопросу
http://forum.php.su/topic.php?fo...1&topic=4804
4. magistr - 15 Сентября, 2010 - 22:50:14 - перейти к сообщению
Uchkuma пишет:
Жесть. Вы там что, все в печеньках храните? Используйте сессии.
а чем печеньки плохо?
а так в основном как?
(Добавление)
особенно в плане безопасности как?
5. Uchkuma - 16 Сентября, 2010 - 09:42:20 - перейти к сообщению
magistr пишет:
а чем печеньки плохо?
magistr пишет:
особенно в плане безопасности как?
Вот в плане безопасности и плохо.
Почитайте, пожалуйста про сессии http://www.php.su/articles/?cat=...amp;page=070#use .
6. magistr - 16 Сентября, 2010 - 14:23:01 - перейти к сообщению
Ну а там и написано что для авторизации использовать печеньки! Так почему тут плохо с безопасностью?
7. Uchkuma - 16 Сентября, 2010 - 14:40:44 - перейти к сообщению
magistr, в куках сохраняется только уникальный идентификатор, который необходим для работы сессий. Но никак не логин и пароль. Читайте внимательней.
8. magistr - 16 Сентября, 2010 - 15:18:26 - перейти к сообщению
а можно пример или алгоритм? ( а желательно то и то Улыбка)
9. Uchkuma - 16 Сентября, 2010 - 22:51:18 - перейти к сообщению
magistr пишет:
а можно пример или алгоритм? ( а желательно то и то)
...
Что некто не знает?
Знают, просто коротко это об этом не рассказать, да еще и с примерами. Тем более в инетах есть статьи. Если у кого появится время, обязательно расскажут. Не поднимайте тему неинформативными сообщениями.
Вам сказали, что нужно использовать сессии, туда и копайте.
10. magistr - 19 Сентября, 2010 - 15:57:26 - перейти к сообщению
я по читал статьи...и там дже есть примеры на аторизации на печеньках...
Но суть ошибки мне подсказали...в том что нельзя передавать пароль в них...
а лучше генировать ключ во время авторизации.
11. AdMeen - 19 Сентября, 2010 - 18:19:59 - перейти к сообщению
magistr пишет:
я по читал статьи...и там дже есть примеры на аторизации на печеньках...
Но суть ошибки мне подсказали...в том что нельзя передавать пароль в них...
а лучше генировать ключ во время авторизации.


Как бы сохраняя пароль в кукисах, вы даете возможность злоумышленнику выкрасть эти самые куки и простой их подменой авторизироваться на сайте
12. magistr - 19 Сентября, 2010 - 20:41:28 - перейти к сообщению
А как будто индификатор сессия нельзя подменить?
И такой еще возник вопрос- как вы относитесь к дополнительной привязки к ip?
13. Uchkuma - 19 Сентября, 2010 - 23:05:53 - перейти к сообщению
magistr пишет:
А как будто индификатор сессия нельзя подменить?
Что значит подменить? Подобрать его практически невозможно. Можно выкрасть. Но это уже безопаснее, чем хранить в куках логин и пароль, т.к. идентификатор для каждой сессии назначается каждый раз разный, а логин и пароль - одни и те же. А для гарантированной защиты делается (вы правильно начали мыслить) дополнительная привязка к ip и юзер-агенту. Тогда с другого компьютера пользователь не сможет воспользоваться вашим идентификатором.

Сейчас вгляделся в ваш код. По сути, при каждом обращении к сайту, у вас пользователь авторизуется снова и снова, каждый раз отправляя в куках логин и пароль.
14. magistr - 20 Сентября, 2010 - 18:00:59 - перейти к сообщению
Вот переделал...
Код проверки авторизации...
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. include("db.php");
  4. $avtorizirt = mysql_escape_string(trim($_COOKIE['avtorizirt']));
  5. $key_user = mysql_escape_string(trim($_COOKIE['key_user']));
  6. $ip = $_SERVER['REMOTE_ADDR'];
  7. $user_agent  = $_SERVER['HTTP_USER_AGENT'];
  8. $date = date("Y-m-d");
  9. if ( $avtorizirt != 1)
  10. {
  11.         SetCookie("avtorizirt","0",time()+360000,"/");
  12.         $avtorizirt = 0;
  13. }
  14. else
  15. {
  16.   $test_avtorizirt = mysql_query("SELECT * FROM authorization WHERE key_user='$key_user' AND ip='$ip' AND user_agent = '$user_agent' ",$db);
  17.   $test_avtorizirt_a =  mysql_fetch_array($test_avtorizirt);
  18.   if(mysql_num_rows($test_avtorizirt) == 0)
  19.   {
  20.          SetCookie("avtorizirt","0",time()+360000,"/");
  21.          SetCookie("login","");
  22.          SetCookie("pass","");
  23.          echo $avtorizirt = 0;
  24.   }
  25.   else
  26.   {
  27.           SetCookie("avtorizirt","1",time()+360000000,"/");
  28.           echo $id_user = $test_avtorizirt_a['id_user'];
  29.           echo $avtorizirt = 1;
  30.   }    
  31. }              
  32. ?>
  33.  


И сама авторизация...
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. include("db.php");
  4. $telefon_post =  mysql_escape_string(trim($_POST['telefon']));
  5. $pass_post =   mysql_escape_string(trim(md5($_POST['pass'])));
  6. $submit = $_POST['submit'];
  7. if (isset($telefon_post) AND  isset($pass_post))
  8. {
  9.    $authorization  = mysql_query("SELECT id FROM user WHERE telefon='$telefon_post' AND pass ='$pass_post'",$db);
  10.    $result_login = mysql_num_rows($authorization);
  11.          if($result_login == 0)
  12.           {
  13.                  SetCookie("avtorizirt","0",time()+360000,"/");
  14.                  SetCookie("login","");
  15.                  SetCookie("pass","");
  16.                  $avtorizirt = 0;
  17.                  header('Location:http://www.*.ru/no_avtorizirt.php?error=2'); // не верный логин или пароль
  18.                  exit();
  19.                  
  20.           }
  21.           else
  22.           { // логин и пароль верный авторизируем пользователя
  23.               $authorization = mysql_fetch_array($authorization);
  24.                   $id_user = $authorization['id'];
  25.               $authorization_result = mysql_query("SELECT * FROM authorization WHERE id_user='$id_user'",$db);
  26.                   if(mysql_num_rows($authorization_result) >= 1)
  27.                   {
  28.                            mysql_query("DELETE FROM authorization WHERE id_user='$id_user'",$db);
  29.                   }
  30.                   $ip = $_SERVER['REMOTE_ADDR'];
  31.                   $user_agent  = $_SERVER['HTTP_USER_AGENT'];
  32.                   $date = date("Y-m-d");
  33.                   do
  34.                   {
  35.                           $key_user = md5(rand(500000, 150000000000000).rand(10000, 15000000000).rand(1000000000, 150000000001000000).rand(10, 100000050)* 125412);
  36.                   }
  37.                   while(mysql_num_rows(mysql_query("SELECT * FROM authorization WHERE key_user='$key_user'",$db)) == 1 );
  38.                          
  39.                  
  40.                   if(mysql_query("INSERT INTO authorization (id_user,ip,user_agent,date,key_user) VALUES ('$id_user','$ip','$user_agent','$date','$key_user')",$db))
  41.                   {
  42.                           SetCookie("avtorizirt","1",time()+360000000,"/");
  43.                           SetCookie("key_user","$key_user",time()+360000000,"/");
  44.                           header('Location:http://www.*.ru/cabinet.php');
  45.                           exit();
  46.                   }
  47.                   else
  48.                   {
  49.                           header('Location:http://www..*.ru/error.php?page=login$error=mysql');
  50.                           exit();
  51.                   }
  52.           }    
  53. }
  54. else
  55. {
  56.  header('Location:http://www.*.ru/no_avtorizirt.php?error=1'); // заполнены не все поля
  57.  exit();
  58. }
  59.  
  60. ?>
  61.  


Ну как теперь ? какие пожелания?
15. Uchkuma - 20 Сентября, 2010 - 18:41:29 - перейти к сообщению
magistr, ну почему вы никак не хотите использовать встроенный в php механизм сессий?

 

Powered by ExBB FM 1.0 RC1