http авторизация + PHP

Discussion in 'PHP' started by VotoN, 11 Jun 2010.

  1. VotoN

    VotoN New Member

    Joined:
    18 Nov 2008
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    basic http authentication + PHP + MySQL

    Всем привет.
    На сайте действует HTTP-авторизация, привязанная к MySQL-базе. Вот ее код:
    Code:
    <?php 
     
      // Устанавливаем соединение с базой данных
      require_once("config.php");
      // Если пользователь не авторизовался - авторизуемся
    	  if(!isset($_SERVER['PHP_AUTH_USER'])) 
    	  { 
    	    Header("WWW-Authenticate: Basic realm=\"Admin Page\""); 
    	    Header("HTTP/1.0 401 Unauthorized"); 
    	    echo 'Авторизация отменена';
    	    exit();
    	  }
    
      else 
      { 
         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 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"); 
          echo 'Такого пользователя нет';
          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"); 
          echo 'Неправильный пароль';
          exit();
        }
    
      }
    
    ?>
    
    В последнем куске кода идет сравнение паролей:
    Code:
        $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"); 
          echo 'Неправильный пароль';
          exit();
        }
    
    Суть вот в чем - нужно, чтобы после 5 неудачных попыток ввода пароля выводилось сообщение "Система блокирована, зайдите попозже" и устанавливались куки в систему сроком на час.

    Пробовал вставить в последний кусок кода вот эту конструкцию:
    Code:
    $value = "UB_AUTH_OK";
    setcookie("Auth", $value, time()+3600);  /* 1 час */
    $loc = ($_REQUEST['from']);
    header ("Location: ".$loc);
    
    Куки ставятся и доступ блокируется на час, но после первой же неудачной попытки и сообщение не выводится о том, что система блокирована. Куда поставить счетчик или цикл для 5 попыток, так и не удалось догнать :(
    Кто шарит, помогите разобраться, плиз.
     
    #1 VotoN, 11 Jun 2010
    Last edited: 11 Jun 2010
  2. phpdreamer

    phpdreamer Member

    Joined:
    26 Jul 2009
    Messages:
    522
    Likes Received:
    86
    Reputations:
    19
    google.ru
    запрос "php ограничить попытки ввода"
    первая ссылка //(мой блог)
     
    1 person likes this.
  3. IndigoMan

    IndigoMan New Member

    Joined:
    7 Jun 2008
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Виртуальная память php это mysql. Создавай там таблицу ,поля буду там для IP адресов и для количества ввода и для каждого IP. Это все.