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

Форум PHP

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

 

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

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

тема: Самый оптимальный скрипт авторизации
 
 автор: Max_imus   (13.04.2011 в 00:44)   письмо автору
 
 

Здравствуйте господа программисты!!!
подскажите пожалуйста как мне написать скрипт авторизации который после авторизации откроет страницу пользователей... пожалуйста только подробно.... СПС заранее...

написал такой скрипт но мне самому не нравится :::
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
include('scripts/connect.php');// подключение к серверу MySql и выбор БД
$userinfo='';
$state='0';
if( (isset($_COOKIE['login'])) & (isset($_COOKIE['password'])) ) {// если в куках лежит логин и зашифрованый пароля
if (!isset($_GET['exit'])) {// если кнопка выход не была нажата
$login=$_COOKIE['login'];
$pass=$_COOKIE['password'];

// проверяем наличие пользователя в БД и достаём оттуда пароль
$sql="SELECT id, password FROM info WHERE login='$login'";
$res=mysql_query($sql);
if(mysql_num_rows($res)>0){// если пользователь есть в БД
$userinfo = mysql_fetch_array($res);// в этой переменной лежит пароль из БД
if(strcmp($pass,md5($userinfo['password'])) == 0) { //проверяем схожесть пароля из БД с паролем из куков

// достаём все данные из БД
$sql="SELECT * FROM info WHERE login='$login'";
$res=mysql_query($sql);
$userinfo=mysql_fetch_array($res); // в этой переменной будет лежать вся информация о пользователе из БД
$time=time();
// устанавливаем куки для запоминания статуса пользователя
setcookie("login",$login,$time+1800);
setcookie("password",$pass,$time+1800);
$state = 1;// статус, если 1, тогда пользователь авторизован
}
}
} else {
//обнуляем куки, если была нажата кнопка выход
setcookie("login");
setcookie("password");
}
}
if($state != 1) {// если после проверки куков, оказалось, что пользователь не авторизован, то идем дальше
if( (isset($_POST['login'])) & (isset($_POST['password'])) ){ // если пользователь ввёл логин и пароль
$login = $_POST['login'];

// проверяем наличие пользователя в БД и достаём оттуда пароль
$sql = "SELECT id, password FROM info WHERE login='$login'";
$res = mysql_query($sql);
if(mysql_num_rows($res)>0) {// если пользователь есть в БД
$userinfo = mysql_fetch_array($res);// в этой переменной лежит пароль из БД и номер пользователя
$password = $_POST['password'];
if(strcmp($password,$userinfo['password'])==0){

// достаём все данные из БД
$sql="SELECT * FROM info WHERE login='$login'";
$res=mysql_query($sql);
$userinfo=mysql_fetch_array($res);// в этой переменной будет лежать вся информация о пользователе из БД
$time=time();
// устанавливаем куки для запоминания статуса пользователя, пароль шифруем
/* setcookie("login", $login, $time+1800);
setcookie("password", md5($password), $time+1800);*/
$state = 1;// статус, если 1, тогда пользователь авторизован
}
}
}
}
if($state != 1) {
?>

  Ответить  
 
 автор: cheops   (13.04.2011 в 10:42)   письмо автору
 
   для: Max_imus   (13.04.2011 в 00:44)
 

Я бы за счет использования дополнительной функции и сравнения пароля непосредственно в SQL-запросе разделил бы логику авторизации и прием логина-пароля, кроме того настоятельно посоветовал бы экранировать кавычки в данных, которые поступают методом POST и COOKIE. Тогда бы ваш вариант авторизации можно было бы записать следующим образом
<?php
  
// Устанавливаем уровень тревожности
  
error_reporting(E_ALL & ~E_NOTICE);
  
// подключение к серверу MySql и выбор БД
  
include('scripts/connect.php');

  function 
auth($login$pass$crypt false)
  {
    
$state 0;
    if(!
$crypt$p "MD5('$pass')";
    else 
$p "'$pass'"
    
// проверяем наличие пользователя в БД и достаём оттуда пароль
    
$sql="SELECT COUNT(*)
          FROM info
          WHERE
            login='
$login' AND
            `password` = 
$p";
    
$res mysql_query($sql);
    if(!
$res) exit("Ошибка авторизации");
    if(
mysql_result($res0))
    {
      
// если пользователь есть в БД
      // продлеваем куки
      
setcookie("login",$login,$time+1800);
      if(!
$crypt$pass md5($pass);
      
setcookie("password",$pass,$time+1800);
      
// статус, если 1, тогда пользователь авторизован
      
$state 1;
    }
    return 
$state;
  }

  
$userinfo='';
  
$state=0;
  if( (isset(
$_COOKIE['login'])) & (isset($_COOKIE['password'])) )
  {
    
// если в куках лежит логин и зашифрованый пароля
    
if (!isset($_GET['exit']))
    {
      
// если кнопка выход не была нажата
      
$login $_COOKIE['login'];
      
$pass $_COOKIE['password'];
      
// Если не включен режим магических кавычек
      // экранируем спец-символы
      
if (!get_magic_quotes_gpc())
      {
        
$login mysql_escape_string($login);
        
$pass mysql_escape_string($pass);
      }

      
// Статус авторизации
      
$state auth($login$passtrue);
    }
  }
  else
  {
    
//обнуляем куки, если была нажата кнопка выход
    
setcookie("login");
    
setcookie("password");
  }
  
// если после проверки куков, оказалось, что пользователь не авторизован, то идем дальше
  
if($state != 1)
  {
    
// если пользователь ввёл логин и пароль
    
if( (isset($_POST['login'])) & (isset($_POST['password'])) )
    { 
      
$login $_POST['login'];
      
$password $_POST['password'];
      
// Если не включен режим магических кавычек
      // экранируем спец-символы
      
if (!get_magic_quotes_gpc())
      {
        
$login mysql_escape_string($login);
        
$pass mysql_escape_string($pass);
      }

      
// Статус авторизации
      
$state auth($login$pass);
    }
  }
  if(
$state != 1) {
  }
?>

  Ответить  
 
 автор: cheops   (13.04.2011 в 10:51)   письмо автору
 
   для: Max_imus   (13.04.2011 в 00:44)
 

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

  Ответить  
 
 автор: ruslanaxti   (13.04.2011 в 21:06)   письмо автору
 
   для: cheops   (13.04.2011 в 10:51)
 

А достаточно ли надежный такой скрипт? Скажите его обойти легко и что ему не хватает например каких то функций, проверок? Например на крупных сайтах такие скрипты авторизаций наверное намного сложней

  Ответить  
 
 автор: cheops   (13.04.2011 в 21:16)   письмо автору
 
   для: ruslanaxti   (13.04.2011 в 21:06)
 

Сложность скрипта, говорит как правило о непрофессионализме или плохо поставленной задачи, требования к которой изменялись на всем протяжении разработки и после самой разработки. Надежные вещи простые и очень короткие. Если в силу причин этого сделать нельзя - сложность упаковывают в библиотеку, чтобы сам конечный скрипт был простым и легко мог быть подвергнут ревизии, а его правка не вызывала ошибок.
Обойти можно все. Украв пароль и войдя по паролю, поэтому пароли нельзя оставлять на видном месте, можно украсть хэш-пароля из cookie при помощи трояна, поэтому необходимо следить за обновлениями антивируса, можно украсть хэш-пароля из cookie при помощи XSS-инъекции, поэтому необходимо следить, чтобы их не было на сайте, можно укарасть пароль, подслушивая HTTP-трафик, поэтому желательно для критичных логинов/паролей страницу аутентификации располагать на SSL-страницах (https://).
Больше ничем "на крупных сайтах такие скрипты авторизаций" не отличаются от приведенного выше (самое большая модификация - сессия интенсивнее используется).

  Ответить  
Rambler's Top100
вверх

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