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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Моя авторизация. Насколько хорошо?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
D1mOn
Отправлено: 03 Марта, 2008 - 05:01:56
Post Id



Частый гость


Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008  
Откуда: Гагастан


Помог: 0 раз(а)

[+][+][+][+][+]


PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.  if(!$_POST['submit'])
  4.  {
  5.    print ("<center><h2>Админка</h2><form action=\"$PHP_SELF\" method=\"post\">
  6.   <table border=\"0\">
  7.   <td>Логин</td><td><input type=\"text\" name=\"login\" maxlength=\"32\"></td><tr>
  8.   <td>Пароль</td><td><input type=\"password\" name=\"pass\" maxlength=\"32\"></td><tr>
  9.   <td colspan=\"2\"><center><input type=\"submit\" name=\"submit\" value=\"Войти\"></center></td>
  10.   </table></center>");
  11.  }
  12.  else
  13.  {
  14.  
  15.    if(empty($_POST['login']) OR empty($_POST['pass']))
  16.    {
  17.      print ("<center>Вы ничего не ввели!&nbsp;<a href=\"javascript:history.back();\">Вернуться</a></center>");
  18.      exit;
  19.    }
  20.  
  21.    $name = addslashes(substr($_POST['login'], 0, 32));
  22.    $password = addslashes(substr($_POST['pass'], 0, 32));
  23.    $name = trim($name);
  24.    $password = trim($password);
  25.  
  26.    if(empty($name) OR empty($password))
  27.    {
  28.      print ("<center>Вы ничего не ввели!&nbsp;<a href=\"javascript:history.back();\">Вернуться</a></center>");
  29.      exit;
  30.    }
  31.  
  32.    $name = quotemeta($name);
  33.    $password = quotemeta($password);
  34.    $name = htmlspecialchars($name, ENT_QUOTES);
  35.    $password = htmlspecialchars($password, ENT_QUOTES);
  36.    $password = md5($password);
  37.  
  38.    mysql_connect ("localhost", "root", "") or die ("Ошибка!");
  39.    mysql_select_db ("database") or die ("Ошибка!");
  40.    $query = "SELECT * FROM users WHERE name = '$name' AND password = '$password'";
  41.    $result = mysql_query ($query);
  42.    if (mysql_numrows($result) != 1)
  43.    {
  44.      print ("<center>Неправильное имя или пароль!&nbsp;<a href=\"javascript:history.back();\">Вернуться</a></center>");
  45.      exit;
  46.    }
  47.    else
  48.    {
  49.      $res=mysql_fetch_array($result);
  50.      $admin = $res['admin'];
  51.      $moder = $res['moderator'];
  52.      $user_name = $res['name'];
  53.  
  54.      if($admin == 'y')
  55.      {
  56.        session_start();
  57.        session_regenerate_id();
  58.        $sid = session_id();
  59.        $_SESSION["user"] = $user_name;
  60.        header ("Location: admin.php?sid=$sid");
  61.      }
  62.      elseif($moder == 'y')
  63.      {
  64.        session_start();
  65.        session_regenerate_id();
  66.        $sid = session_id();
  67.        $_SESSION["user"] = $user_name;
  68.        header ("Location: moder.php?sid=$sid");
  69.      }
  70.    }
  71.  }
  72.  
  73. ?>

(Добавление)
Это уже админка

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.  
  4.  if($act == 'destroy')
  5.  {
  6.    unset($_SESSION["user"]);
  7.  }
  8.  
  9.  if($_GET['sid'] != session_id())
  10.  {
  11.    header ("Location: index.php");
  12.    exit;
  13.  }
  14.  
  15.  $sid_id = session_id();
  16.  
  17.  $name = addslashes($_SESSION["user"]);
  18.  $name = htmlspecialchars($name);
  19.  $name = quotemeta($name);
  20.  
  21.  mysql_connect ("localhost", "root", ") or die ("Ошибка!");
  22. mysql_select_db ("datebase") or die ("Ошибка!");
  23. $query = "SELECT * FROM users WHERE name = '$name'";
  24. $result = mysql_query ($query);
  25.  
  26. if (mysql_numrows($result) != 1)
  27. {
  28.   header ("Location: index.php");
  29.   exit;
  30. }
  31. else
  32. {
  33.   $res=mysql_fetch_array($result);
  34.   $admin = $res['admin'];
  35.   if($admin != 'y')
  36.   {
  37.     header ("Location: index.php");
  38.     exit;
  39.   }
  40. }
  41.  
  42. ?>
  43.  

(Добавление)
Целесобразно ли в таблице users у каждого юзаря создавать два поля 'admin' & 'moder'. Которые имеют два значения y OR n, что сответственно означает принадлежность юзаря к тем или иным.

Помогите баги выявить в скриптах.
(Добавление)
( если они есть )
 
 Top
Dastar
Отправлено: 03 Марта, 2008 - 08:50:51
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




Если пользователь он админ, он имеет так же права модера, так?
Лучше сделай одно поле, status (или подобное), которое будет ENUM, и будет выбор либо обычный пользователь, либо модератор либо администратор. Так, имхо, целесобразней.


-----
Не знаешь - молчи.
 
 Top
D1mOn
Отправлено: 03 Марта, 2008 - 09:00:01
Post Id



Частый гость


Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008  
Откуда: Гагастан


Помог: 0 раз(а)

[+][+][+][+][+]


Я думал, что раз он админ, то он и модер одновременно, а модер он просто модер!
Но спасибо за мысль.

А насчёт безопасности?
(Добавление)
А что такое ENUM?
 
 Top
Dastar
Отправлено: 03 Марта, 2008 - 09:01:06
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




PHP:
скопировать код в буфер обмена
  1. <?
  2.  else
  3.  {
  4.  
  5.    if(empty($_POST['login']) OR empty($_POST['pass']))
  6.    {
  7.      print ("<center>Вы ничего не ввели!&nbsp;<a href=\"javascript:history.back();\">Вернуться</a></center>");
  8.      exit;
  9.    }
  10.  
  11.    $name = addslashes(substr($_POST['login'], 0, 32));
  12.    $password = addslashes(substr($_POST['pass'], 0, 32));
  13.    $name = trim($name);
  14.    $password = trim($password);
  15.  
  16.    if(empty($name) OR empty($password))
  17.    {
  18.      print ("<center>Вы ничего не ввели!&nbsp;<a href=\"javascript:history.back();\">Вернуться</a></center>");
  19.      exit;
  20.    }
  21. ?>
  22.  


Все это можно сократить до:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. else {
  4.    $name = addslashes(substr($_POST['login'], 0, 32));
  5.    $password = addslashes(substr($_POST['pass'], 0, 32));
  6.    $name = trim($name);
  7.    $password = trim($password);
  8.  
  9.    if(empty($name) OR empty($password))
  10.    {
  11.      print ("<center>Вы ничего не ввели!&nbsp;<a href=\"javascript:history.back();\">Вернуться</a></center>");
  12.      exit;
  13.    }
  14. ?>
  15. ?>
  16.  


-----
Не знаешь - молчи.
 
 Top
D1mOn
Отправлено: 03 Марта, 2008 - 09:04:05
Post Id



Частый гость


Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008  
Откуда: Гагастан


Помог: 0 раз(а)

[+][+][+][+][+]


И как им пользоваться на мойм примере?
 
 Top
Dastar
Отправлено: 03 Марта, 2008 - 09:04:34
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




ENUM - тип данных, которое задает, что значение поля может иметь только одно из указанных значений. К примеру:
status ENUM('user', 'moder', 'admin', 'banned')


-----
Не знаешь - молчи.
 
 Top
D1mOn
Отправлено: 03 Марта, 2008 - 09:06:06
Post Id



Частый гость


Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008  
Откуда: Гагастан


Помог: 0 раз(а)

[+][+][+][+][+]


А насчёт безопасности, мож че подскажеш? Про сессии например. У меня register_globals = off


А вот еще что: где тогда мне указать время или срок бана для юзаря?


А как можно раграничить сессию админа, модера и юзера?

(Отредактировано автором: 03 Марта, 2008 - 09:20:00)

 
 Top
Dastar
Отправлено: 03 Марта, 2008 - 09:19:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




Продолжаем разбирать скрипт. Что воть это такое:

?
Зачем постоянно перелавать через GET sid польнователя? Это: 1. не безопасно (имхо). 2. не красиво. Кроме того, в каком-нибуть месте забудете поставить нужный адресс, и все, доступ будет потерян.
Лучше храните sid пользователя в базе данных, и просто сравнивать, если sid в сессии равен sid в бд, и если нет - выкидывать юзера.

Срок бана лучше указать в отдельном поле в таблице юзверей.


-----
Не знаешь - молчи.
 
 Top
D1mOn
Отправлено: 03 Марта, 2008 - 09:21:27
Post Id



Частый гость


Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008  
Откуда: Гагастан


Помог: 0 раз(а)

[+][+][+][+][+]


0.о спасибо, не догодался бы ) ща все сделаю )
(Добавление)
Я таблицу сессий сделал вот так

CODE (text):
скопировать код в буфер обмена
  1. CREATE TABLE `sessions` (
  2. `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  3. `username` VARCHAR( 32 ) NOT NULL ,
  4. `sid` VARCHAR( 32 ) NOT NULL ,
  5. `date` DATETIME NOT NULL DEFAULT '00.00.00 00:00'
  6. ) ENGINE = MYISAM ;


Скорее всего, как я понимаю, мне надо будет проверять при каждом заходе время открытия сессии с текущим временем и удалять, те которые допустим были открыты более 30 минут (допустим), и закрывать их?
 
 Top
Dastar
Отправлено: 03 Марта, 2008 - 09:33:20
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




Да.


-----
Не знаешь - молчи.
 
 Top
D1mOn
Отправлено: 03 Марта, 2008 - 09:48:59
Post Id



Частый гость


Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008  
Откуда: Гагастан


Помог: 0 раз(а)

[+][+][+][+][+]


Я исправил вот так

PHP:
скопировать код в буфер обмена
  1. <?
  2. else {
  3.    $name = addslashes(substr($_POST['login'], 0, 32));
  4.    $password = addslashes(substr($_POST['pass'], 0, 32));
  5.    $name = trim($name);
  6.    $password = trim($password);
  7.  
  8.    if(empty($name) OR empty($password))
  9.    {
  10.      print ("<center>Вы ничего не ввели!&nbsp;<a href=\"javascript:history.back();\">Вернуться</a></center>");
  11.      exit;
  12.    }
  13.  
  14.    $name = quotemeta($name);
  15.    $password = quotemeta($password);
  16.    $name = htmlspecialchars($name, ENT_QUOTES);
  17.    $password = htmlspecialchars($password, ENT_QUOTES);
  18.    $password = md5($password);
  19.  
  20.    mysql_connect ("localhost", "root", "") or die ("Ошибка!");
  21.    mysql_select_db ("datebase") or die ("Ошибка!");
  22.    $query = "SELECT * FROM users WHERE name = '$name' AND password = '$password', LIMIT 1";
  23.    $result = mysql_query ($query);
  24.  
  25.      $res=mysql_fetch_array($result);
  26.      $status = $res['status'];
  27.      $user_name = $res['name'];
  28.  
  29.      if($status == 'admin')
  30.      {
  31.        session_start();
  32.        session_regenerate_id();
  33.        $sid = session_id();
  34.  
  35.        mysql_connect ("localhost", "root", "") or die ("Ошибка!");
  36.        mysql_select_db ("datebase") or die ("Ошибка!");
  37.        $now = date('Y-m-d H:i:s',mktime(gmdate('H')+3,gmdate('i'),gmdate('s'),gmdate('m'),gmdate('d'),gmdate('Y')));
  38.        mysql_query("insert into sessions (username,sid,date) values ('$user_name','$sid','$now')");
  39.  
  40.        $_SESSION["user"] = $user_name;
  41.        header ("Location: admin.php");
  42.      }
  43.      elseif($status == 'moder')
  44.      {
  45.        session_start();
  46.        session_regenerate_id();
  47.        $sid = session_id();
  48.  
  49.        mysql_connect ("localhost", "root", "") or die ("Ошибка!");
  50.        mysql_select_db ("datebase") or die ("Ошибка!");
  51.        $now = date('Y-m-d H:i:s',mktime(gmdate('H')+3,gmdate('i'),gmdate('s'),gmdate('m'),gmdate('d'),gmdate('Y')));
  52.        mysql_query("insert into sessions (username,sid,date) values ('$user_name','$sid','$now')");
  53.  
  54.        $_SESSION["user"] = $user_name;
  55.        header ("Location: moder.php");
  56.      }
  57.      elseif($status == 'user' OR $status == 'ban' OR $status == 'activate')
  58.      {
  59.        print ("У Вас нет прав для доступа в эту часть сайта!");
  60.        exit;
  61.      }
  62. ?>


Отредактировано модератором: Dastar, 03 Марта, 2008 - 09:58:30
 
 Top
Dastar
Отправлено: 03 Марта, 2008 - 10:04:13
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




Зачем Вы ТРИ (!) раза открываете связь с базой данных? Зачем Вы два (!) раза открываете сессию (пусть и то и другое в разных ветках if'a)???

Рекомендую Вам каждый раз просматривать свой код, и искать способ сократить его. Ведь не в количестве счастье, а в качестве!


-----
Не знаешь - молчи.
 
 Top
D1mOn
Отправлено: 03 Марта, 2008 - 11:46:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 222
Дата рег-ции: Янв. 2008  
Откуда: Гагастан


Помог: 0 раз(а)

[+][+][+][+][+]


То что я написал вообще не работает!

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\admin.php on line 19

Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\admin.php on line 21

Мож дадите ссылки где можно про авторизацию почитать, только не методом заголовков. (401)
 
 Top
Dastar
Отправлено: 03 Марта, 2008 - 11:59:40
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)






-----
Не знаешь - молчи.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Наработки по собственным проектам »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB