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

Форум PHP

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

 

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

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

тема: Система авторизации HTTP-Basic (MySQL) а вот я не понял!
 
 автор: Loki   (04.05.2006 в 15:55)   письмо автору
 
 


<?php 
  
///////////////////////////////////////////////////
  // Система авторизации HTTP-Basic авторизации
  // 2003-2005 (C) IT-студия SoftTime (http://www.softtime.ru)
  // Симдянов И.В. (simdyanov@softtime.ru)
  ///////////////////////////////////////////////////
  // Устанавливаем соединение с базой данных
  
require_once("config.php");
  
// Если пользователь не авторизовался - авторизуемся
  
if(!isset($_SERVER['PHP_AUTH_USER'])) 
  { 
    
Header("WWW-Authenticate: Basic realm=\"Admin Page\""); 
    
Header("HTTP/1.0 401 Unauthorized"); 
    exit(); 
  } 
  else 
  { 
    
// Утюжим переменные $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'],
    // чтобы мышь не проскочила
    
if (!get_magic_quotes_gpc())
    {
      
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
      
$_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
    }
    
$_SERVER['PHP_AUTH_USER'] = str_replace("'","'",$_SERVER['PHP_AUTH_USER']);
    
$_SERVER['PHP_AUTH_PW'] = str_replace("'","'",$_SERVER['PHP_AUTH_PW']);
//вот тут мне непонятно: если "мышь" уже заэкранировали двумя строчками выше, зачем подменять ее на хомяка?:)
    
$query "SELECT pass FROM $tbl_userlist WHERE name='".$_SERVER['PHP_AUTH_USER']."'";
//тут снова непонятно, почему сразу не запросить имя и пароль?
    
$lst = @mysql_query($query); 
    
// Если ошибка в SQL-запросе - выдаём окно
    
if(!$lst)
    {
      
Header("WWW-Authenticate: Basic realm=\"Admin Page\""); 
      
Header("HTTP/1.0 401 Unauthorized"); 
      exit(); 
    }
    
// Если такого пользователя нет - выдаём окно
    
if(mysql_num_rows($lst) == 0)
    {
      
Header("WWW-Authenticate: Basic realm=\"Admin Page\""); 
      
Header("HTTP/1.0 401 Unauthorized"); 
      exit(); 
    }
    
// Если все проверки пройдены, сравниваем хэши паролей
    
$pass = @mysql_fetch_array($lst);
    if(
md5($_SERVER['PHP_AUTH_PW']) != $pass['pass'])
    {
      
Header("WWW-Authenticate: Basic realm=\"Admin Page\""); 
      
Header("HTTP/1.0 401 Unauthorized"); 
      exit(); 
    }
//и тут непонятно: зачем нужно три if, когда можно обойтись одним?
//Можно прокомментировать?
  
}
?>

   
 
 автор: Trianon   (04.05.2006 в 17:18)   письмо автору
 
   для: Loki   (04.05.2006 в 15:55)
 

Вот то, что применяю я:

<?php
require_once("config.inc.php");  // Устанавливаем соединение с БД

function auth_req($realm 'Admin page')
// Система авторизации HTTP-Basic авторизации на основе MySQL

  
$usertable 'userlist';   // поля в таблице:
  // id    - номер пользователя
  // login - запрашиваемое имя
  // pass  - md5(пароль)
  // realm - область авторизации

    
if(!isset($_GET['logout']) // запрос с ?logout =1 - применяется для принудительного разрыва сессии

      
&& isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']))
  {
    
$usr $_SERVER['PHP_AUTH_USER']; $pwd $_SERVER['PHP_AUTH_PW'];

    if(
get_magic_quotes_gpc())
        {
$usr stripslashes($usr); $pwd stripslashes($pwd);}

    
$query "SELECT id FROM $usertable"
            
." WHERE login='".mysql_escape_string($usr)."'"
            
." AND realm='".mysql_escape_string($realm)."'"
            
." AND pass= '".md5($pwd)."'";
                          
// если запрос прошел и строка подошла ровно одна 
    
if(($res = @mysql_query($query)) != && mysql_num_rows($res) == 1)
        return 
mysql_result($res0); // вернем id пользователя
  
}
  
// запросим имя и пароль в случае неудачи
  
Header('WWW-Authenticate: Basic realm="'.$realm.'"');
  
Header('HTTP/1.0 401 Unauthorized');
  exit(
"Authorization need!");
}

echo 
"<a href=?logout=1>User #".auth_req("Adm")." logout</a>";
?>

   
Rambler's Top100
вверх

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