П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 3498 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 6101 раз(а).

Учебник HTML.
Просмотров 3265 раз(а).

Руководство по PHP5.
Просмотров 5486 раз(а).

Хостинг через призму DNS.
Просмотров 4123 раз(а).

Подборка текстов стандартных документов.
Просмотров 55763 раз(а).

Учебник PHP - Самоучитель
Просмотров 3078 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 5439 раз(а).

Внешние атаки...
Просмотров 3823 раз(а).

Учебник PHP.
Просмотров 2819 раз(а).

SSI в примерах.
Просмотров 37454 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





ГЛАВА 16. Безопасность.

Аутентификация с несколькими пользователями

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

Хранение информации в текстовом файле

Существует очень простое, но эффективное решение — хранить аутентификационные данные в текстовом файле. В каждой строке файла содержится отдельная пара «имя:пароль»; в процессе проверки программа последовательно читает и проверяет все строки файла. Примерный вид текстового файла приведен в листинге 16.5.

Листинг 16.5. Типичный текстовый файл с параметрами аутентификации (authenticate.txt)

brian:snaidni00
alessia:aiggaips
gary:9avaj9 
chris:poghsawcd
matt:tsoptaes 

Как видно из листинга, каждая строка приведенного файла состоит из имени пользователя и пароля, разделенных двоеточием (:). Таким образом, при использовании этого файла существует пять комбинаций «имя/пароль», обеспечивающих доступ к ограниченным ресурсам. Каждый раз, когда пользователь вводит имя и пароль в окне, сценарий открывает текстовый файл и последовательно ищет в нем совпадающую пару. Если совпадение находится, запрашиваемый доступ пользователю предоставляется, а если нет — запрос отклоняется. Процедура аутентификации продемонстрирована в листинге 16.6.

Листинг 16.6. Аутентификация на основе текстового файла

<? 

$file = "Listing16-5.txt":
$fp = fopen($file, "r"):
$auth_file = fread ($fp, filesize($fp)):
fclose($fp); 
$authorized = 0;

// Сохранить строки файла в виде элементов массива
$elements = explode ("\n", $auth_file);

foreach ($elements as $element) {
  list ($user, $pw) = split (":", $element);

  if (($user == $PHP_AUTH_U$ER) && ($pw = $PHP_AUTH_PW)) :
    $authorized = 1;
    break ; 
  endif; 
}

if (!$authorized) :
  header('WWW-Authenticate: Basic realm="Secret Family Recipes'"); 
  header('HTTP/1.0 401 Unauthorized');
  print "You are attempting to enter a restricted area. Authorization is required.";
  exit; 

else : 
  print "Welcome to the family's secret recipe collection";
endif; 

?> 

Хранение информации в базе данных

Хранение аутентификационной информации в базах данных обладает рядом преимуществ, многие из которых рассматривались в главе 11. Простота обновления, масштабируемость и гибкость — лишь некоторые из доводов в пользу хранения больших объемов информации в базе данных. В табл. 16.4 приведено содержимое демонстрационной таблицы user_authenticate. После успешно пройденной аутентификации по идентификатору пользователя можно устанавливать связи с другими таблицами, содержащими разнообразные данные и настройки. Процесс разделения взаимосвязанных данных по таблицам меньшего размера (вместо группировки всей информации в одной большой таблице) называется нормализацией базы данных,о нем кратко говорилось в главе 11.

В примерах этого раздела используется синтаксис MySQL. Программный код достаточно прост и легко адаптируется для других СУБД.

Таблица 16.4. Пример таблицы с аутентификационными данными (user_authenticate)

userid username password
url234 brian 2b877b4b825b48a9a0950dd5bdlf264d
urlHS alessia 6fled002ab5595859014ebf0951522d9
url15932 gary 122a2aladf096fe4f93287f9dal8f664
url19042 chris 6332e88a4c7dba6f7743d3a7a0c6ea2c
url8930 matt 922fe5dl40el9d308f2037404a0536a

Программа, приведенная в листинге 16.7, сначала проверяет, было ли присвоено значение переменной $PHP_AUTH_USER. Если значение не присвоено, выводится окно для ввода необходимой информации. В противном случае программа создает соединение с сервером MySQL и ищет в таблице user_authenticate имя и пароль, введенные пользователем. При отсутствии совпадения окно аутентификации выводится заново, а если проверка дает положительный результат, переменной $user_id присваивается идентификатор пользователя.

Листинг 16.7. Аутентификация пользователя посредством поиска в базе данных

<? 

if (!isset($PHP_AUTH_USER)) :

  header('WWW-Authenticate: Basic realm="Secret Family Recipes"');
  header('HTTP/1.0 401 Unauthorized');
  exit; 

else : 
  // Создать содинение с базой данных MySQL
  mysql_connect ("host", "user", "password") or die ("Can't connect to database!");
  mysql_select_db ("useMnfo") or die ("Can't select database!");

  // Обратиться к таблице user_authenticate
  // для поиска совпадающей строки
  $query = "select userid from user_authenticate where username = '$PHP_AUTH_USER' and
     password = '$PHP_AUTH_PW'";
  $result = mysql_query (Squery):

  // Если совпадение не найдено, вывести окно аутентификации
  if (mysql_numrows($result) != 1) :
    header('WWW-Authenticate: Basic realm="Secret Family Recipes"'); 
    header ('HTTP/1.0 401 Unauthorized');
    exit; 

  // Если проверка пройдена, получить идентификатор пользователя
  else :
    Suserid = mysql_result (user_authenticate, 0, $result);
  endif; 

endif; 

?> 

Назад | Содержание раздела | Общее Содержание | Вперед



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru