PHP в деталях



         

Пароль на страницу. Часть 2. Блокировка подбора (отредактированная) - часть 3


  exit();

  };

$current_user = mysql_fetch_array($result);

mysql_free_result($result);

Впрочем, грех работать с файлами, если есть база. Шутка.

Для непрошедших авторизаций создаём таблицу:

CREATE TABLE unauth (username VARCHAR(64) NOT NULL, pass VARCHAR(64) NOT NULL, ip VARCHAR(255), logintime TIMESTAMP)

И вместо обращения к файлам работаем с базой.

$errors = @mysql_result(mysql_query("SELECT count(username) as falses FROM unauth WHERE logintime>DATE_SUB(NOW(),INTERVAL 1 HOUR) AND ip='$REMOTE_ADDR $HTTP_X_FORWARDED_FOR'"),0);

if (mysql_error())

die(mysql_error());

if ($errors>5) {

  print ("Доступ закрыт. Зайдите через час.");

  exit();

  };

$result = mysql_query("SELECT * FROM user WHERE login='". preg_replace("/[^\w_\-]/", "", $PHP_AUTH_USER). "' AND pass='". md5($PHP_AUTH_PW). "'");

if (@mysql_num_rows($result)!=1) {

  header("WWW-Authenticate: Basic realm=\"secret area\"");

  header("HTTP/1.0 401 Unauthorized");

  print ("Authorization required");

  mysql_query("INSERT INTO unauth (username, pass, ip) VALUES ('$PHP_AUTH_USER', '$PHP_AUTH_PW', '$REMOTE_ADDR $HTTP_X_FORWARDED_FOR')");

  exit();

  };

$current_user = mysql_fetch_array($result);

mysql_free_result($result);

Хранить ли старые записи для статистики или нет - дело хозяйское. Если что, их можно удалять, выполняя перед авторизацией запрос:

DELETE FROM unauth WHERE logintime<DATE_SUB(NOW(),INTERVAL 1 HOUR)

Такой механизм при больших нагрузках будет работать быстрее и надёжнее, чем файлы - в базе часто используемые данные буферизуются и обрабатываются непосредственно в оперативной памяти.

На этом позвольте попрощаться.

P.S. Хотел начать писать про механизм сессий, но меня опередил DiMA.




Содержание  Назад  Вперед