Незапятнанный auth php. Как я могу использовать базовую HTTP-аутентификацию в PHP? Как узнать полный путь к файлу

5 ответов

Как работает PHP? Если это произойдет через Apache mod_cgi, я боюсь, что вы не сможете получить информацию об аутентификации. Apache не передаст его в приложения CGI, если вы не скомпилируете его с флагом SECURITY_HOLE_PASS_AUTHORIZATION . (Независимо от того, действительно ли это отверстие безопасности или нет, зависит от того, имеют ли другие пользователи на вашем сервере более низкие или более высокие привилегии, чем пользователи вашего сайта.)

Если это IIS CGI, вы должны убедиться, что настроен только "Анонимный доступ к каталогу", или IIS попытается выполнить вход и аутентификацию самих учетных данных.

Echo "

Hello {$_SERVER["PHP_AUTH_USER"]}.

";

Отверстие безопасности в HTML-инъекции (ну, если оно сработало). Используйте htmlspecialchars() . Человек, это страница PHP doc, полная очень сомнительных советов и кода.

Вы также можете посмотреть на $_SERVER["HTTP_AUTHORIZATION"] , хотя я подозреваю, что это проблема mod_cgi, и в этом случае ни одна из переменных не будет присутствовать, и вам придется прибегать к имени на основе файлов cookie. Или перейдите на хост с более современным подходом к хостингу PHP, например FastCGI или mod_php.

в.htaccess добавьте это:

RewriteEngine on RewriteRule .* -

и в начале вашего script добавьте это:

List($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]) = explode(":" , base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));

Попробуйте следующее:

\n"); print("\n"); print("Listing 24-1\n"); print("\n"); print("\n"); } function endPage() { print("\n"); print("\n"); } /* ** test for username/password */ if((isset($_SERVER["PHP_AUTH_USER"]) && ($_SERVER["PHP_AUTH_USER"] == "leon")) AND (isset($_SERVER["PHP_AUTH_PW"]) && ($_SERVER["PHP_AUTH_PW"] == "secret"))) { startPage(); print("You have logged in successfully!
\n"); endPage(); } else { //Send headers to cause a browser to request //username and password from user header("WWW-Authenticate: " . "Basic realm=\"Leon Protected Area\""); header("HTTP/1.0 401 Unauthorized"); //Show failure text, which browsers usually //show only after several failed attempts print("This page is protected by HTTP " . "Authentication.
\nUse leon " . "for the username, and secret " . "for the password.
\n"); } ?>

Убедитесь, что вы переопределили переменную $_SERVER[‘PHP_AUTH_USER’] и $_SERVER[‘PHP_AUTH_PW’] до того места, где вы пытаетесь получить доступ к обеим переменным.

Если выше не так, тогда используйте chek, если вы используете php как cgi mod или нет. Если вы используете php как cgi mod, то в большинстве случаев вы не получите $_SERVER[‘PHP_AUTH_USER’] и $_SERVER[‘PHP_AUTH_PW’] , потому что в общем случае мы не скомпилируем apache с опцией SECURITY_HOLE_PASS_AUTHORIZATION Поэтому, если вы хотите получить обе переменные, тогда перекомпилируйте apache с параметром SECURITY_HOLE_PASS_AUTHORIZATION или вы можете использовать подход.htaccess, описанный в

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

Закрыть такую страницу можно несколькими взаимодополняющими друг друга способами:

  1. Защита паролем (логин/пароль) с помощью переменных $_SERVER["PHP_AUTH_USER"] и $_SERVER["PHP_AUTH_PW"] .
  2. Защита по IP адресу клиента с помощью переменной $_SERVER["REMOTE_ADDR"] .
  3. Защита по MAC адресу в локальных сетях (дополнительно к защите по IP ).

Разберем сначала первый способ, который является основным. Он позволяет закрыть доступ к странице по логину и паролю, таким образом доступ могут получить только люди знающие логин и пароль. К тому же их можно разделять по этому признаку и выдавать соответственно разную информацию для каждого. Реализуется с помощью выдачи специальных полей в заголовке протокола HTTP . Создадим функцию auth_send() :

" ,"

Ошибка аутентификации

" ,"

Обратитесь к администратору для получения логина и пароля.

" ,""; exit; }; ?>

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

" ,"

Добро пожаловать!

" ,"

Вы зашли по логину ",$auth_user," и паролю ",$auth_pass,".

" ,""; ?>

Код проверки логина и пароля не слишком сложный в данном случае, так как реализован для одного человека. Логика работы проста, если нет переменной $_SERVER["PHP_AUTH_USER"] и $_SERVER["PHP_AUTH_PW"] или их значения не совпадают с нужными, то вызываете функцию auth_send() . Не забывайте, что в ней в конце вызывается exit , поэтому выполнение программы прекращается.

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

Ваш IP не найден!!!"; exit; }; ?>

Тут в строке $allowed_ips через пробел указаны IP адреса, которым разрешен доступ. Далее получаем массив с помощью explode() и делаем поиск адреса клиента из $_SERVER["REMOTE_ADDR"] . Я для поиска применил функцию array_search() , так как неверняка ее код реализованный на Си будет работать несколько быстрее, чем то, что мы можем написать на PHP с помощью циклов for или foreach . Но скорость тут не главное:)

И последняя ступень защиты это проверка MAC адреса. Она относится к разряду параноидальных и ее стоит использовать, если вы получаете доступ из локальной сети и данные, которые вы защищаете действительно очень важные. Я пока реализовал эту проверку только на системе Linux , в силу относительной простоты реализации. Но Вы можете ее попробовать реализовать под любую другую платформу. Пишем функцию:

Как линуксоиды уже поняли она основана на ARP таблице системы, доступ к которой можно получить с помощью файла /proc/net/arp . Функция ищет по строкам требуемый IP адрес и возвращает его MAC адрес:

Ваш IP=192.168.10.15 и MAC=00:04:31:E4:F8:37

В системе Windows возможно тоже есть какие-то способы получить MAC попроще, но из тех, которые реально работают, это вывод ARP таблицы системы командой:

C:\WINDOWS\>arp -a Интерфейс: 192.168.10.15 on Interface 0x1000003 Адрес IP Физический адрес Тип 192.168.10.1 00-50-22-b0-6a-aa динамический 192.168.10.2 00-0f-38-68-e9-e8 динамический 192.168.10.3 00-04-61-9e-26-09 динамический 192.168.10.5 00-0f-38-6a-b1-18 динамический

Реализовать защиту на основе этого адреса Вы сможете сами, если Вам это действительно надо:) Но помните, что если у Вас в сети неуправляемое оборудование без возможности привязки MAC адреса к порту, эта защита может не сработать, так как можно подделать все Ваши идентификационные данные используемые для защиты (логин, пароль, IP и MAC адрес).

Не редко на сайтах можно встретить аутентификацию, реализованную с помощью конфигурационного файла .htaccess . Простота настроек и надежность, основные преимущества данного вида авторизации.

Директивы файла. htaccess.

AuthName "Текст выводится в окне авторизации" AuthType Basic AuthUserFile Полный путь/.htpasswd require valid-user

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

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

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

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

Где можно реализовать?

Авторизацию можно прикрутить к любой директории вашего сайта, будь то корень, либо папка из иерархии. Очень часто можно встретить защиту с помощью .htaccess , для входя в “Панель управления” сайтом. Также с помощью этой технологии можно ограничить доступ к папкам, где лежат конфиденциальные данные.

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

Настройка файла.htaccess

Создайте с помощью обычного блокнота файл .htaccess (точка перед названием обязательна), в папке CMS, заполните его директивами указанными выше. Для заполнения директивы AuthUserFile необходимо указать полный путь к файлу с паролями .htpasswd , который находится в этой же папке.

Как узнать полный путь к файлу?

Полный путь к файлу, можно узнать с помощью функции phpinfo() . Результатом ее выполнения будет подробная таблица настроек веб-сервера.

Создайте файл info.php, с содержимым , в директории CMS. Запустите файл через браузер. В полученной таблице, найдите переменную SCRIPT_FILENAME , которая содержит полный путь к файлу .

После получения нужных данных, обязательно удалите файл info.php, чтобы информация о настройках веб-сервера не стала общедоступной.

Рис 1. Полный путь к файлу. Результат выполнения функции phpinfo()

Скопируйте полученный путь, замените в нем имя файла, info.php на .htpasswd , и поместите его в директиву AuthUserFile .

AuthUserFile Z:/home/localhost/www/scripts/CMS/.htpasswd

Таким образом, готовый файл.htaccess , будет содержать следующие директивы:

AuthName "Authentication" AuthType Basic AuthUserFile Z:/home/localhost/www/scripts/CMS/.htpasswd require valid-user

Создание файла. htpasswd

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

. Создать новый файл с паролями , назначить ему имя.htpasswd, задать шифрование паролей по алгоритму MD5 и добавить в него логин admin:

Htpasswd -cm .htpasswd admin

-cm - ключи утилиты:

- указывает, что необходимо создать новый файл

-m -шифрует пароли по алгоритму MD5

.htpasswd - имя файла с паролями

admin - логин

Рис. 2. Создание нового файла с паролями, утилитой htpasswd.exe

. Добавить в уже существующий файл с паролями нового пользователя . Для этого нужно в команде указать один ключ -m, ключ -c, опустить.

Htpasswd -m .htpasswd user

Рис. 3. Добавление в уже существующий файл с паролями нового пользователя, утилитой htpasswd.exe.

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

Htpasswd -m .htpasswd user

Рис 4. Изменение пароля для существующего пользователя, с помощью утилиты htpasswd.exe.

После создания файла с паролями, поместите его в директорию, путь к которой указан в директиве AuthUserFile файла.htaccess. (в нашем случае в папку CMS)

Доступ к данным авторизации, через переменные массива $_SERVER

После успешного прохождения аутентификации, логин и пароль, вбитые пользователем, помещаются в суперглобальный массив$_SERVER, который можно обрабатывать с помощью php скрипта.

  • $_SERVER["PHP_AUTH_USER"] - логин;
  • $_SERVER["PHP_AUTH_PW"] - пароль;

Результат

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

Рис. 5. Окно аутентификации.

Подведем итоги:

  • С помощью конфигурационного файла .htaccess , можно ограничить доступ к любой директории вашего сайта;
  • Чтобы создать файл .htaccess воспользуйтесь обычным блокнотом;
  • Чтобы указать полный путь к файлу с паролями .htpasswd , в директиве AuthUserFile файла .htaccess , воспользуйтесь функцией phpinfo();
  • Для создания файла с паролями.htpasswd , воспользуйтесь утилитой htpasswd.exe ;
  • Размещайте файл с паролями .htpasswd , в папке, к которой нет доступа для пользователей , чтобы предотвратить кражу паролей;
  • Доступ к данным авторизации осуществляется через переменные суперглобального массива $_SERVER : $_SERVER["PHP_AUTH_USER"] , $_SERVER["PHP_AUTH_PW"];

Вступление

Это - обучающая программа которая должна вам показать основы защищиты ваших страниц в сети, использующие HTTP аутентификацию. Вместо традиционного.htaccess метода (Apache сервер), мы собираемся использовать для хранения данных о пользователях и их пароли в MySQL. Я постараюсь максимально разжевать все на, что по моему разумению требуется для начинающего изучать MySQL и PHP. В принципе на основе этой проги вы можите использовать любой DBMS (система управления базы данных). Почему интересен этот метод? Ну например хотя бы потому что, если Вы используете базу данных, вы можите с легкостью разрешить, только определенной группе (человеку) иметь определенныйе права для доступа к той или иной информации. Если Вы используете традиционный.htaccess метод Апач, Вы должны вручную добавлять пользователей и пароль в файле пароля. А приимущество данного метода, ну....взгляните сами.

Программное обеспечение которое необходио:

· *nix платформа (Linux, Unix, *BSD) · PHP 3.0.x или PHP 4.x · MySQL (любая версия)

Шаг номер один

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

Проверить, заверен ли пользователь уже.

Если нет, отправить сообшение в броузер, с сообщением и формой для доступа.

Если пользователь княпает на кнопку отмены, не позволить ему доступ и переадресовывать его идти на... 403: Доступ отвергнут, или показать (кукиш J) простое сообщение.

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

Если Вы не поняли все не волнуйтесь, станет ясно позже (а может никогда)!

Шаг Два - Создаем Нашу Базу данных

Мы хотим, чтобы база данных хранила имена (login) и пароль наших пользователей. Требуемые поля могут легко быть добавлены к существующей базе данных, но мы предположим пока, что Вы не добавляете к уже имеющейся базе а создаете новую. Следующий код это описание того как это сделать. Предположение если у вас на компе стоит Апач совсем что надо, можете немедленно приступить:)

mysql> create database members;
mysql> create table users (
username varchar(25) NOT NULL,
password varchar(15) NOT NULL,
primary key (username),
unique username (username)
);

Мы теперь имеем базу данных, чтобы хранить в ней пользователей, она предполагает, что username до 25 знаков, и пароли до 15 знаков. (если вам по каким-то причинам не подходит, установите как посчитаете Нужным) Username должен иметь значение "первичный ключ" и быть "уникальным", так как мы не хотим чтоб 2 или больше людей имели одинаковый username.

Пожалуйста обратите внимание, что usernames будет чувствитен к следующему случаю, пользователь "Vasya" будет идентифицирован другим, нежели пользователь "vasya", проще говоря чувствителен к регистру. Теперь мы добавим в MySQL тестового пользователя, чтобы использовать его дянные для тестов, когда мы создадим PHP страницу.

mysql> grant select on members.users
to httpuser@localhost
identified by "MyPassword";

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

mysql> insert into users value("john_doe", "eod_nhoj");

Я сознательно в проге не шифровал данные, для того, чтоб в случае утери пароля не дешифровать его, и упростить до минимума получения оного:)) Все, с MySQLпокончено теперь идем дальше!

Шаг Три - пишем PHP код

Прежде, чем мы начинаем, я опишу в кратце то, что будет делать пага. Когда Вы попадете на защищенную страницу то сервер пошлет запрос и выведет страницу для введения имени и пароля. Если вы нажмете на кнопку отмены или введете не правельные данные то сервер отправит вам (401 Неправомочный удар головой, и будет отрицать доступ.) - так переводит промпт обычно строку (401 Unauthorized header, and deny access) не буду пояснять по моему лучше не скажешь!!! При случае если вы все введете как надо, то окажется что просто напросто вы получите доступ (то что и требовалось доказать) Теперь самое веселое, это и есть тот самый код. Он написан сознательно с номерами строк, после кода (внизу) даны пояснения к строкам.

01 02
03 function access_denied() {
04 echo "401 Unauthorized: The username / password combination you entered was invalid.n";
05 }
06
07 function auth_headers($title) {
08 Header("WWW-Authenticate: Basic realm="$title"");
09 Header("HTTP/1.0 401 Unauthorized");
10 }
11
12 if(!isset($PHP_AUTH_USER)) {
13 auth_headers("My Protected Web Page");
14 access_denied();
15 exit;
16 }
17 else {
18
19 $hostname = "localhost";
20 $username = "httpuser";
21 $password = "MyPassword";
22 $database = "members";
23
24 $query = "select username,password from users where username="$PHP_AUTH_USER" and password="$PHP_AUTH_PW"";
25 $link = mysql_connect($localhost, $username, $password) or die("Unable to connect to database server");
26
27 if (mysql_num_rows(mysql_db_query($database, $query)) == 0) {
28 auth_headers("My Protected Web Page");
29 access_denied();
30 exit;
31 }
32
33 mysql_close($link);
34 }
35 ?>

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

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

Строка 3:
Эта функция покажет сообщение, если "злой юзер" упорно будет вводить левые данные. Я сделал это функцией, потому что используем ее дважды, и просто чтоб сократить исходный код.

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

Строка 8:
Передать броузеру заголовок, который заставит таки юзера ввести логин и пароль. Переменная $title будет показана в login диалоге.

Строка 9:
При первом запросе выводится заголовок при повторной отмене выводит сообщение о запрете доступа.

Строка 12:
$PHP_AUTH_USER цикл который выводит сообщение о том что мол пага защищена, и убирайся вон!

Строка 19-23:
Это то что кроме вас никто не знает, то есть средства для коннекта с базой данных, имя хоста, имы базы, имя юзера, и пароль. (для соеденения с MySQL)

Строка 24:
Запрос к MySQL который возвращает имена и пароли.

Строка 25:
Установить связь с MySQL и вывести ругательство если связи не будет!!! (это значит что у вас что-то не то в строках 19-23, или вообще нет MySQL)

Строка 27:
Обработать $query. Если возвращет - 0, это означает, что была введена недействительная комбинация.

Строка 33:
Разъединить соеденение с MySQL.

Я рекомендовал бы сохранить PHP код в файле под наванием user_auth.php, user_auth.php3, или... (тут ваша фантазия на эту тему) Предположим, что таки сохранили этот код в файле user_auth.php. Всякий раз, когда мы захотим вдруг защитить нашу сверхсекретную пагу в сети, мы просто подключаем этот файл. Единственное на что хочется обратить внимание, что по логике надо подключать в самой верхней части своей защищенной PHP страницы, советую в строке номер 1 ваше паги написать следующее:

где "user_auth.php" это имя файла под которым вы сохранили код.

Ваш вопрос - я не использую MySQL, как быть?

Посоветуйтесь с админом вашего сервера, если он окажется добрым, то он вам поможет, для него это 5 минут работы, если злой то не поможет, тогда идите на форум относящийся к той БД которую вы исьпользуете и кричите о помощи! Или если вы считаете себя нормальным программером, то...вам вообще этот код не понадобиться, и вы будите создавать "сессии", шифровать с помощью PGP вобщем извращаться так, как быдто вы делаете защиту для amazon.com



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: