Как сделать вход на сайт по паролю php
Перейти к содержимому

Как сделать вход на сайт по паролю php

  • автор:

Простая аутентификация на PHP

Многие новички до сих пор попадают в тупик при написании простейшей аутентификации в PHP. На Тостере с завидной регулярностью попадаются вопросы о том, как сравнить сохраненный пароль с паролем полученным из формы логина. Здесь будет краткая статья-туториал на эту тему.

Disclaimer: статья рассчитана на совершенных новичков. Умудрённые опытом разработчики ничего нового здесь не найдут, но могут указать на возможные недочёты =).

Для написания системы аутентификации будем использовать базу данных MySQL/MariaDB, PHP, PDO, функции для работы с паролями, для построения интерфейса возьмём bootstrap.

Для начала создадим базу. Пусть она называется php-auth-demo. В новой базе создадим таблицу пользователей users :

CREATE TABLE `users` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `username` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

Создадим конфиг с данными для подключения к базе.

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

 'php-auth-demo', 'db_host' => '127.0.0.1', 'db_user' => 'mysql', 'db_pass' => 'mysql', ];

И сделаем «загрузочный» файл, который будем подключать вначале всех остальных файлов.

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

В «загрузочном» файле мы будем инициализировать сессию и объявим некоторые функции-помощники.

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); > return $pdo; >

Функция pdo() даст нам доступ к объекту PDO в любом месте нашего кода.

Далее нам нужна форма регистрации. Разместим её прямо в файле index.php .

 

Здесь всё просто: два поля, кнопка и форма, отправляющая запрос на файл do_register.php методом POST. Процесс регистрации пользователя опишем в файле do_register.php .

prepare("SELECT * FROM `users` WHERE `username` = :username"); $stmt->execute(['username' => $_POST['username']]); if ($stmt->rowCount() > 0) < flash('Это имя пользователя уже занято.'); header('Location: /'); // Возврат на форму регистрации die; // Остановка выполнения скрипта >// Добавим пользователя в базу $stmt = pdo()->prepare("INSERT INTO `users` (`username`, `password`) VALUES (:username, :password)"); $stmt->execute([ 'username' => $_POST['username'], 'password' => password_hash($_POST['password'], PASSWORD_DEFAULT), ]); header('Location: login.php');

В самом начале подключим наш «загрузчик».

Потом проверим, не занято ли имя пользователя. Для этого сделаем выборку из таблицы указав в условии полученное из формы имя пользователя. Обратите внимание, для запросов здесь и далее мы будем использовать подготовленные запросы, что обезопасит нас от SQL-инъекций. Для этого в тексте SQL-запроса мы указываем специальные плейсхолдеры, а при выполнении ассоциируем с ними ненадёжные данные (ненадёжными данными следует считать всё, что приходит из вне – $_GET, $_POST, $_REQUEST, $_COOKIE). После выполнения запроса мы просто проверим количество возвращённых строк. Если их больше нуля, то имя пользователя уже занято. В этом случае мы выведем сообщение и вернём пользователя на форму регистрации.

Я написал «больше нуля», но по факту, из-за того, что поле username в таблице уникальное, rowCount() может нам вернуть лишь два возможных значения: 0 и 1 .

В приведённом выше коде мы использовали функцию flash() . Данная функция предназначена для «одноразовых» сообщений. Если вызвать её со строковым параметром, то она сохранит эту строку в сессии, а если вызвать без параметров, то выведет из сессии сохранённое сообщение и затем удалит его в сессии. Добавим эту функцию в файл boot.php .

function flash(?string $message = null) < if ($message) < $_SESSION['flash'] = $message; >else < if (!empty($_SESSION['flash'])) < ?>  unset($_SESSION['flash']); > >

А также вызовем её нa форме регистрации, для вывода возможных сообщений.

Registration

На данном этапе простейший функционал регистрации нового пользователя готов.

Если мы посмотрим код регистрации выше, то увидим, что в случае успешной регистрации, мы перенаправляем пользователя на страницу логина. Самое время ее написать.

Login

Register

В виду простоты примера, она практически повторяет форму регистрации. Интереснее будет посмотреть на сам процесс логина в файле do_login.php .

prepare("SELECT * FROM `users` WHERE `username` = :username"); $stmt->execute(['username' => $_POST['username']]); if (!$stmt->rowCount()) < flash('Пользователь с такими данными не зарегистрирован'); header('Location: login.php'); die; >$user = $stmt->fetch(PDO::FETCH_ASSOC); // проверяем пароль if (password_verify($_POST['password'], $user['password'])) < // Проверяем, не нужно ли использовать более новый алгоритм // или другую алгоритмическую стоимость // Например, если вы поменяете опции хеширования if (password_needs_rehash($user['password'], PASSWORD_DEFAULT)) < $newHash = password_hash($_POST['password'], PASSWORD_DEFAULT); $stmt = pdo()->prepare('UPDATE `users` SET `password` = :password WHERE `username` = :username'); $stmt->execute([ 'username' => $_POST['username'], 'password' => $newHash, ]); > $_SESSION['user_id'] = $user['id']; header('Location: /'); die; > flash('Пароль неверен'); header('Location: login.php');

Здесь есть важный момент. Мы не запрашиваем пользователя из таблицы по паре username/password, а используем только username. Дело в том, что даже если вы захешируете пришедший из формы логина пароль и попробуете сравнить новый хеш с сохранённым в базе, вы ничего не получите. Password_hash() использует автоматически генерируемую соль для паролей и хеши будут всегда получаться разные. Вот результат функции password_hash , вызванной несколько раз для пароля «123»:

$2y$10$loqucup11.3DL1fgDWanoettFpFJuFFd0fY6BZyiP698ZqvA4tmuy $2y$10$.LF3OzmQRtJvuZZWeWF.2u80x3ls6OEAU5J9gLHDtcYrFzJkRRPvq $2y$10$iGj/nOCavShd2vbMZTC4GOMYCqDj2YSc8qWoeqjVbD1xaKU2CgAfi

Именно поэтому необходимо использовать функцию password_verify для проверки пароля. Кроме того, данная функция использует специальный алгоритм проверки и является безопасной для атак по времени.

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

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

Для проверки того факта, что пользователь залогинен, нужно будет проверить наличие данного идентификатора в сессии. Мы для удобства напишем функцию-помощник и разместим ее в том же файле boot.php .

function check_auth(): bool

Теперь можем добавить проверки и изменить вывод на главной странице, если пользователь аутентифицирован.

prepare("SELECT * FROM `users` WHERE `id` = :id"); $stmt->execute(['id' => $_SESSION['user_id']]); $user = $stmt->fetch(PDO::FETCH_ASSOC); > ?> 

Welcome back, !

else < ?>

Registration

?>

А также закрыть доступ к форме логина, если пользователь уже вошёл:

Осталось добавить возможность «выйти». Форму для выхода вы можете видеть в коде выше. Сама процедура выхода простейшая, и заключается в очистке сессии.

Заключение
  • Используем PDO/MySQLi и подготовленные запросы для работы с базой данных.
  • В базе данных обязательно храним только хеш пароля.
  • Для хеширования пароля используем специальную функцию password_hash.
  • Для проверки пароля не делаем сравнение хешей, а используем специальную функцию password_verify.

Полный код примера доступен на гитхабе: ссылка на Github.

Доступ на сайт по паролю. 5 строк кода

В этот статье поговорим об том, как сделать доступ к сайту или отдельной директории по паролю.

В чем суть: мы создадим 2 файла: в первом код для блокировки сайта с ссылкой на 2 файл, в котором лежат логины и пароли для доступа. В первом файле мы должны указать абсолютный путь до второго:

.htaccess — файл дополнительной конфигурации веб-сервера Apache.
.htpasswd —
файл для указания логинов и паролей для доступа.

Расположение этих файлов будет зависеть от того, к какой директории вы хотите закрыть доступ.

Закрыть доступ ко всему сайту

Файл .htaccess должен находится в корневой папке сайта, .htpasswd лучше положить в какую-то из директорий, чтобы до него нельзя было так просто добраться — там будут лежать логины и пароли для доступа. Предлагаю положить его в директорию /folder.

Получается такая структура:

В файл. htaccess вставляем код:

AuthType Basic
AuthName "Protected Area"
AuthUserFile /.htpasswd
Require valid-user

AuthName — текст содержащийся в данной директиве, выводится в окне ввода пароля. Он должен быть написан в одну строку и заключен в двойные кавычки. Попробовал, у меня эта надпись нигде не показывается.

AuthType — типы аутентификации: Basic или Digest. Рекомендуется использовать первый, т.к. второй поддерживается не всеми браузерами.

AuthUserFile — полный путь к файлу с логинами и паролями, для аутентификации пользователей. Пароли содержаться в шифрованном виде. Рекомендуется хранить данный файл в папке, к которой нет доступа для пользователей, это необходимо, чтобы предотвратить кражу паролей.

require valid-user — директива предписывает, что к URL получают доступ только, пользователи, успешно прошедшие аутентификацию.

В строке AuthUserFile вставляете путь, который получился у вас в файле test. php

Для того чтобы узнать абсолютный путь к файлу, создаем в директории с файлом. htpasswd файл test. php, в нем экранируем переменную:

Теперь нам нужно открыть этот файл в браузере.
ваш-сайт.ru/folder/test.php, подставите адрес своего сайта.

У меня на выходе получилась такая строка
/home/d/danpossv/portfolio_v2/public_html/works/sneakers-html/folder

Вставляем ее в код и получаем:

AuthType Basic
AuthName "Protected Area"
AuthUserFile /home/d/danpossv/portfolio_v2/public_html/works/sneakers-html/folder/.htpasswd
Require valid-user

После того как вы узнали абсолютный путь до директории, удалите этот файл, он больше не нужен.

Теперь нам нужно создать зашифрованный пароль. Для этого перейдем по ссылке на генератор паролей.

Заполняем необходимые данные в форме и нажимаем кнопку«сгенерировать»:

Скопируем получившуюся строку и вставим в файл. htpasswd:

Строка означает — логин: пароль в зашифрованном виде. Для доступа на сайт нам нужно вводить тот логин и пароль, который мы указывали в генераторе, то есть admin и password.

Что мы имеем в итоге:

  • файл .htaccess лежащий в корне сайта с 4 строками кода и путем к файлу с логинами и паролями
  • файл .htpasswd с логином и паролем

Теперь мы можем заходить на сайт и должны увидеть такое окно:

После ввода данных на откроется главная страница сайта. Если же будет ошибка в вводимых данных, либо мы получим 404 ошибку, либо страница перезагрузится и снова появится форма ввода данных.

Закрыть доступ к директории

Разница между этими способами в том, что файл. htaccess нужно поместить в ту директорию, которую вам необходимо закрыть:

Файл .htaccess вы можете разместить в любом месте, вы уже научились узнавать его абсолютный путь. В данном случае можно просто скопировать путь из файла. htaccess корневой папки.

Спасибо за прочтение статьи! Если у вас возникнут какие-то вопросы, трудности, пишите мне на почту, в личку в вк, в комментариях, по возможности помогу!

Вход на сайт по паролю

Author24 — интернет-сервис помощи студентам

Как сделать вход на сайт по паролю?
Хочу сразу сказать что я ни чего не смыслю в php и mysql. Бывало пару раз код редактировал, но с нуля написать вообще не могу.
В чем суть?
Есть страничка на которой ссылка на файл. Но я не хочу что бы кто попало заходил на эту страничку.
хочу что бы при заходе на сайт, юзера спрашивали пароль(только пароль(которые будут лежать в Mysql Базе)), после успешного ввода пароля, он бы получал доступ на страничку с файлом (не редирект).

«Так в чём проблема?» спросите вы меня.
Единственное что я могу из этого сделать это html страничку с файлом.

Может кто рассказать какой/какие файлы ещё нужны.
Достаточно одного index.php в котором надо и вводить и происходить проверка на совместимость с Mysql?
Так же, если легче сделать без Mysql, а например через txt, то это будет ещё лучше.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Вход на сайт по логину и паролю
Здравствуйте. Как реализовать вход на сайт по логину и паролю, регистрации на сайте нет. Т.е я.

Вход на сайт по логину и паролю
нашел в интернете скрипты, мол переходит на страницу когда введешь пароль, добавил еще и логин- он.

Вход по паролю
Здраствуйте. Пытаюсь сделать вход в панель управления сайтом по паролю: <p>Введите пароль.

Вход на сайт по паролю
Всем привет, пожалуйста помогите мне написать скрипт. У меня такая задача, мне надо написать.

Пароль на страницу

Я решил описать способы закрыть паролем часть сайта. Тема, на самом деле, большая, поэтому на первый раз ограничусь авторизацией php+mysql.

Самый первый вопрос, который обычно встаёт — как закрыть директорию со скрпитами администрирования паролем. При этом не нужно никаких изысков — один или несколько администраторов имеют одни и те же права, а персоналии меняются редко. Проще всего в данной ситуации использовать стандартную серверную авторизацию — положить файлы .htaccess и .htpasswd и прописать в них нужные параметры. Про это уже написано много, поэтому я ничего особо нового не скажу, лучше посмотрите сюда.

Добавлю две вещи. Первое — это куда класть файл .htpasswd. Экспериментальным путем я выяснил, что если, например, путь к документу с сообщением об ошибке (ErrorDocument) пишется относительно системной переменной DocumentRoot. Но путь к файлу с паролями (UserFile) пишется относительно ServerRoot. Насколько я понял, выше ServerRoot положить .htpasswd нельзя — «../» не воспринимается. Всё это сделано для того, чтобы можно было поместить файл с паролями, например, одним уровнем выше корневой директории сайта, чтобы из сети доступа к файлу не было вообще.

Второе — это то, что скрипт может узнать, кто его открывает и пароль: переменные $PHP_AUTH_USER и $PHP_AUTH_PW.

Главный недостаток этого способа — сервер не может блокировать подбор пароля (это после нескольких неудачных попыток входа пользователю предлагается подождать часок-другой, а в течение этого времени обращения с его IP-адреса игнорируются). Это написано в официальной документации по Апачу.

Ещё один недостаток — необходимость переписывать файлы с паролями при удалении пользователя или введении нового. Но если это происходит нечасто, этого способа вполне достаточно, к тому же не придётся забивать голову написанием механизма авторизации.

Это нужно не только для упрощения работы с большим количеством пользователей и их большой «текучкой». Если нужно держать дополнительную информацию о пользователях, либо необходимо гибкое разграничение прав, лучше перенести авторизацию в базу.

Каждая страница закрытой территории подключает файл с вот таким кодом:

$result = mysql_query(" SELECT * FROM person 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=\"User area\""); header("HTTP/1.0 401 Unauthorized"); print("Чтобы войти в пользовательскую часть сайта, надо ввести имя и пароль."); exit(); >; $user_row = mysql_fetch_array($result);

В первой строке из логина удаляются все символы кроме букв, цифр, тире и символа подчеркивания. Затем проверяется количество полученных строк, и только если это одна строка, дается доступ. В остальных случаях пользователь увидит в броузере окно, предлагающее ввести логин и пароль. Если же пользователь вошел успешно, в массиве $user_row мы имеем всю информацию о нем.

Конечно же, пример, который я привёл, имеет ряд существенных недостатков. Не переписывайте его один-в-один, чтобы потом не пасть жертвой попыток подбора пароля, потому что

  • защиты от подбора здесь нет
  • если таблица пользователей большая, при подборе пароля злоумышленник, скорее всего, «завалит» базу

И последний на сегодня способ — хранение зашифрованных данных в куках.

Есть скрипт для входа, остальные подключают код, позволяющий только продолжить действия в закрытой области — если куки истекут, или он выйдет оттуда, придётся возвращаться на страницу для входа.

Входной скрипт проверяет логин и пароль и выдает две куки. В первой — логин, чтобы сразу опознать пользователя (в базе поле логина, естественно, уникальное или даже ключевое). Во второй куке — хэш от времени входа и пароля (для полноты конспирации я добавляю к этим строкам букву «Ы» — тогда хэш подобрать почти невозможно :).

Все остальные программы подключают код, который делает следующее. Делает запрос в базу — выбирает строку с полученным логином. Из этой строки берет поле «log_time» и пароль и делает из них, как и описано выше, хэш. Сравнивает его с тем, что получил, и если они совпадают, выдает новую куку хэша, опять же, от пароля, времени и буквы «Ы» и делает запрос в базу данных «UPDATE user SET log_time=’. ‘ WHERE login=’$cookie_login'».

if (isset($HTTP_COOKIE_VARS[$cookie_login]) && isset($HTTP_COOKIE_VARS[$cookie_code])) < $login = $HTTP_COOKIE_VARS[$cookie_login]; $code = $HTTP_COOKIE_VARS[$cookie_code]; $result = mysql_query("SELECT date_format(log_date,'%Y%m%d%H%i%s') as log_date1, pass,uid FROM user WHERE email='$login' AND log_date>'DATE_SUB(NOW(),INTERVAL 15 MINUTE)'"); if (!mysql_error() && @mysql_num_rows($result)==1) < $log_time0 = time(); $log_time1 = date("YmdHis", $log_time0); $log_time2 = date("Y-m-d H:i:s", $log_time0); $current_user = mysql_fetch_array($result); if (md5($current_user["pass"].$current_user["log_date1"].$md5letter) == $code) < mysql_query("UPDATE user SET log_date='$log_time2' WHERE uid=".$current_user["uid"]); setcookie($cookie_code, md5($current_user["pass"].$log_time1.$md5letter), time()+900, $site_path); $auth = true; >else unset($current_user); >; >;

Опять же, здесь нет никакой защиты от подбора и атаки на сервер (кстати, здесь можно вместо буквы «Ы» писать IP-адрес пользователя — чтобы, например, соседу по офису нельзя было взять файл с кукой и зайти со своего компьютера).

Пароль на страницу. Часть 2. Блокировка подбора

Когда я выложил этот выпуск в прошлый раз, меня запинали на месте, мол такой блокировкой можно и сервер «пустить под откос».

Но сначала о блокировке подбора. Банальности, но всё-таки. Пароль длинной десять символов из букв латиницы и цифр — это очень много вариантов. Если подбирать пароль по 1 000 000 вариантов в секунду, понадобится несколько тысяч лет. Но поскольку такую абракадабру запомнить сложно, мы чаще делаем пароль из осмысленных слов. Несколько лет назад оказалось, что большинство паролей можно подобрать при помощи словаря из 10 000 слов. В своё время в сети появился червь (вирус такой), который лазил по юниксовым серверам, используя их дырки в защите, и подбирал пароли привелигированых пользователей при помощи. системного орфографического словаря Юникса. Ничего таскать не надо было!

Каждый пользователь, пока он не ввёл правильный логин и пароль, считается злобным хакером. С чем же мы имеем дело, когда пользователь вводит что-либо неправильно?

  • забывчивость (на это на приличных сайтах есть формочка «забыл пароль», чтобы отправить на введёный в системных настройках email этот самый пароль)
  • баловство («ибо нефиг»)
  • подбор пароля по словарю (вероятность удачного подбора велика, поэтому закрывать надо, тем более, если сайт коммерческого характера)
  • DoS-атака (чтобы не перегрузить сервер, надо минимизировать действия, которые будет выполнять скрипт в таком случае)

Я долго думал, как можно вызвать перегрузку на сервере, если механизм защиты стоит на файлах. Оказалось, несложно (сколько это будет стоить — другой вопрос). Итак, допустим, сервер не выдержит, если скрипт будет пытаться 1000 раз в секунду открывать файлы на запись и писать в них данные. Поскольку после 5 неудачных попыток войти в систему пользователь будет сразу получать отказ в доступе (без какой-либо записи данных в файл), надо найти 200 уникальных IP, с которых по пять раз и обратиться. Это возможно. Вешаем в баннерокрутилке html-баннер с пятью тегами:

  

Пользователь моментально делает пять обращений сервер пять раз пишет в файл (кстати, в некоторых броузерах, возможно, выскочит окно для ввода логина и пароля). Можно сделать html-страницу с пятью такими картинками, а саму страницу вставить через iframe на посещаемый сайт (через iframe — чтобы по полю referer не нашли. Вряд ли служба поддержки халявного хостинга будет заниматься такими вещами как копание в лог-файлах в поисках рефереров). Те примеры, которые я привёл, разумеется, натянуты, но сам факт того, что можно воспользоваться таким недостатком системы, доказан. Кстати, нечто подобное уже было.

Но всё-таки приведу этот способ — зря писал, что ли? Его, кстати, можно без особого страха применять для ограниченного количества адресов (например, для локальной сети фирмы), положив в директорию файл .htaccess такого содержания:

order deny,allow deny from all allow from xxx.xxx.xxx

А вот код программы:

$errors = 0; $fn = "ignore/". preg_replace("[^\d\.]", "", $REMOTE_ADDR. ". ". $HTTP_FORWARDED_FOR); if (is_file($fn)) < if (filectime($fn) < time()-3600) unlink($fn); >else $errors = fread(fopen($fn, "r"), 2); 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"); fwrite(fopen($fn, "w"), ++$errors); 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'"),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

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

Пароль на страницу. Часть 3. Пароль от базы

Была у меня в своё время проблема: надо закрыть администрационную часть сайта, но при этом я не могу положить файл .htpasswd выше корневой директории сайта. Врождённая подозрительность не позволяла положить файл с паролем и отдельную директорию и заблокировать доступ к ней по http. Решил попробовать сделать защиту как в phpMyAdmin: у пользователя спрашиваются логин и пароль, с которыми скрипт соединяется с базой. В своём анализаторе логов я сделал именно так. Удобство метода в том, что файл можно складывать куда угодно - никаких кук, никаких директив сервера для директории. Заодно, если поменяется пароль в базе данных, не надо ничего исправлять в скрипте.

Распишу метод на примере MySQL. Пишем функцию, например, mysql_die:

function mysql_die() < header("HTTP/1.0 401 Unauthorized"); header("WWW-authenticate: basic realm=\"Statistics\""); print ("Access denied. User name and password required."); exit(); >

В начале программы указываются хост сервера БД и, если надо, имя базы:

$db_host = "localhost"; $db_name = "somedatabase";

А для соединения с базой берутся переменные сервера: $PHP_AUTH_USER и $PHP_AUTH_PW.

$db_connect = @mysql_connect($db_host, $PHP_AUH_USER, $PHP_AUTH_PW) or mysql_die();

И всё. Теперь о недостатках. Разумеется, с такой защитой можно пробовать подбирать пароль (в принципе, можно приделать блокировку, но тогда потеряется вся красота метода). Пароль, как и в случае защитой средствами сервера, пересылается в открытом виде. Но для простых задач такое вполне сгодится.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *