Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   http авторизация + PHP (https://forum.antichat.xyz/showthread.php?t=210859)

VotoN 11.06.2010 18:42

basic http authentication + PHP + MySQL
 
Всем привет.
На сайте действует HTTP-авторизация, привязанная к MySQL-базе. Вот ее код:
Код:

<?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();
    }

  }

?>

В последнем куске кода идет сравнение паролей:
Код:

    $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 неудачных попыток ввода пароля выводилось сообщение "Система блокирована, зайдите попозже" и устанавливались куки в систему сроком на час.

Пробовал вставить в последний кусок кода вот эту конструкцию:
Код:

$value = "UB_AUTH_OK";
setcookie("Auth", $value, time()+3600);  /* 1 час */
$loc = ($_REQUEST['from']);
header ("Location: ".$loc);

Куки ставятся и доступ блокируется на час, но после первой же неудачной попытки и сообщение не выводится о том, что система блокирована. Куда поставить счетчик или цикл для 5 попыток, так и не удалось догнать :(
Кто шарит, помогите разобраться, плиз.

phpdreamer 11.06.2010 19:11

google.ru
запрос "php ограничить попытки ввода"
первая ссылка //(мой блог)

IndigoMan 12.06.2010 12:02

Виртуальная память php это mysql. Создавай там таблицу ,поля буду там для IP адресов и для количества ввода и для каждого IP. Это все.


Время: 15:54