Безбрачный auth php. HTTP Установка защиты на страницу используя MySQL и PHP. Исходный текст файла.htaccess
Для того, чтобы отправить браузеру клиента сообщение "Authentication Required", что в свою очередь приведет к появлению диалогового окна для ввода имени пользователя и пароля. После того как клиент ввел свое имя и пароль, скрипт будет вызван повторно, но уже с предопределенными переменными PHP_AUTH_USER , PHP_AUTH_PW и AUTH_TYPE , которые соответственно содержат имя пользователя, пароль и тип аутентификации. Эти переменные могут быть найдены в массиве $_SERVER и $HTTP_SERVER_VARS . В настоящее время поддерживается только "Basic"-аутентификация. Также вы можете ознакомится с более детальным описанием функции header() .
Пример фрагмента скрипта, который вынуждает клиента авторизироваться для просмотра страницы:
Пример HTTP-аутентификации
if (!isset($_SERVER
[
"PHP_AUTH_USER"
])) { Hello {$_SERVER["PHP_AUTH_USER"]}. Вы ввели пароль {$_SERVER["PHP_AUTH_PW"]}.
header
("WWW-Authenticate: Basic realm="My Realm""
);
echo
"Текст, отправляемый в том случае,
если пользователь нажал кнопку Cancel"
;
exit;
} else {
echo
"
echo
"
}
?>
Примечание касательно совместимости: Будьте особенно внимательны при указании HTTP-заголовков. Для того, чтобы гарантировать максимальную совместимость с наибольшим количеством различных клиентов, слово "Basic" должно быть написано с большой буквы "B", регион (realm) должен быть взят в двойный (не одинарные!) кавычки, и ровно один пробел должен предшествовать коду 401 в заголовке HTTP/1.0 401 .
Вместо простого отображения на экране переменных PHP_AUTH_USER и PHP_AUTH_PW , вам, возможно, понадобится проверить их корректность. Используйте для этого запрос к базе данных или поиск пользователя в dbm-файле.
Вы можете пронаблюдать особенности работы браузера Internet Explorer. Он очень требователен к параметру передаваемых заголовков. Указание заголовка WWW-Authenticate перед отправкой статуса HTTP/1.0 401 является небольшой хитростью.
Начиная с PHP 4.3.0, для того, чтобы предотвратить написание кем-либо скрипта, раскрывающего пароль к странице, которая использует внешнюю аутентификацию, переменные PHP_AUTH не устанавливаются в случае, если данная страница использует внешнюю аутентификацию и установлен безопасный режим . Несмотря на это, переменная REMOTE_USER может использоваться для аутентификации пользователя, прошедшего внешнюю аутентификацию. Таким образом, вы всегда можете воспользоваться переменной $_SERVER["REMOTE_USER"] .
Примечание: PHP использует указание директивы AuthType для указания того, используется внешняя аутентификация или нет.
Следует заметить, что все вышесказанное не предотвращает похищения паролей к страницам, требующим авторизацию, кем-либо, кто контролирует страницы без авторизации, расположенные на том же сервере.
И Netscape Navigator и Internet Explorer очищают кеш аутентификации текущего окна для заданного региона (realm) при получении от сервера. Это может использоваться для реализации принудительного выхода пользователя и повторного отображения диалогового окна для ввода имени пользователя и пароля. Некоторые разработчики используют это для ограничения авторизации по времени или для предоставления кнопки "Выход".
Пример HTTP-аутентификации с принудительным вводом новой пары логин/пароль
function
authenticate
() {
header
("WWW-Authenticate: Basic realm="Test Authentication System""
);
header
("HTTP/1.0 401 Unauthorized"
);
echo
"Вы должны ввести корректный логин и пароль для получения доступа к ресурсу \n"
;
exit;
}
If (!isset($_SERVER
[
"PHP_AUTH_USER"
]) || Добро пожаловать: {$_SERVER["PHP_AUTH_USER"]}
($_POST
[
"SeenBefore"
] ==
1
&&
$_POST
[
"OldAuth"
] ==
$_SERVER
[
"PHP_AUTH_USER"
])) {
authenticate
();
}
else {
echo
"
"
echo
"Предыдущий логин: {$_REQUEST["OldAuth"]}"
;
echo
";
echo
"\n"
;
echo
"\n"
;
echo
"\n"
;
echo
"
}
?>
Это поведение не регламентируется стандартами HTTP Basic-аутентификации, следовательно, вы не должны зависеть от этого. Как показали тесты, браузер Lynx не очищает кеш авторизации при получении от сервера статуса 401, и, нажав последовательно "Back", а затем "Forward" возможно открыть такую страницу, при условии, что требуемые атрибуты авториазации не изменились. Однако, пользователь может нажать клавишу "_" для очистки кеша аутентификации.
Также следует заметить, что до версии PHP 4.3.3, HTTP-аутентификация не работала на серверах под управлением Microsoft IIS, если PHP был установлен как CGI-модуль, в силу некоторых ограничений IIS. Для того, чтобы добиться корректной работы в PHP 4.3.3+, вы должны отредактировать конфигурационную настройку IIS под названием "Directory Security". Щелкните на надписи "Edit" и установите опцию "Anonymous Access", все остальные поля должны остаться неотмеченными.
Еще одно ограничение, если вы используете IIS посредством ISAPI: переменные PHP_AUTH_* не определены, но в то же время доступна переменная HTTP_AUTHORIZATION . Пример кода, который вы могли бы использовать: list($user, $pw) = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));
Примечание касательно IIS:: Для того, чтобы HTTP-аутентификация корректно работала в IIS, в конфигурации PHP опция cgi.rfc2616_headers должна быть установлена значением 0 (значение по умолчанию).
Внимание: В случае, если используется защищенный режим , UID текущего скрипта будет добавлен в realm -часть заголовка WWW-Authenticate .
<<< Назад | Содержание | Вперед >>> |
Есть еще вопросы или что-то непонятно - добро пожаловать на наш | |
|
Web-мастерам , использующим в качестве движка для сайта что-либо собственноручно написанное, рано или поздно надоедает обновлять сайт, редактируя файлы по FTP или работая напрямую с базой данных. И тогда начинается написание скриптов администрирования, которые бы позволили управлять сайтом в интерактивном режиме с приятным внешним видом и наконец-то сделали процесс обновления более приятным.
Первый вопрос, который обычно возникает в таком случае — это вопрос авторизации. Не будешь же давать возможность каждому, нашедшему на сайте административный раздел, творить все, что ему взбредет в голову. Сегодня мы с вами рассмотрим процесс написания простейшей авторизации.
Для начала несколько уточняющих моментов. Первое — пишем на PHP , так как это наиболее распространенный на сегодняшний день язык написания систем управления сайтами. И второе — я лично против самописных скриптов, отвечающих за сам ввод логина пароля. Поэтому не будем изобретать велосипед, т.е. собственный принцип авторизации, а воспользуемся стандартными возможностями.
Итак, будем пользоваться обычной аутентификацией — окном для ввода пароля, какое используется, например, на Rambler и множестве других сайтов.
Возможность входа в защищенную зону сохраняется в течение всего сеанса работы окна браузера, но после того, как вы его закроете, войти снова можно будет лишь набрав имя пользователя и пароль. То есть, воспользовавшись вашим компьютером, незаконных действий от вашего имени совершить невозможно. Чем еще хорош этот метод? Он не принимает никаких переменных со сторонних серверов и после трехкратного неверного ввода пароля вам придется обновлять страницу, что затрудняет взлом системы подбором.
А выглядит это вот так :
Введенный пользователем логин хранится в переменной $PHP_AUTH_USER , пароль — в $PHP_AUTH_PW . Кстати, обратите внимание на проверку существования записи пользователя с таким именем в БД — это критический момент, который учитывать весьма важно. В случае, если такой проверки не будет, это приведет к плачевным результатам — $row будет равно нулю, то есть введя несуществующее имя пользователя и пустой пароль можно будет попасть в защищенную зону.
Между инструкциями Header(«HTTP/1.0 401 Unauthorized») ; и exit() ; вставляем что угодно — от простой фразы о том, что сюда нельзя до предложения куда-нибудь сходить, слетать, сбегать, сползать и так далее. Да, чуть не забыл — в переменных $dbhost, $dbuser, $dbpasswd и $dbname хранятся данные, обеспечивающие доступ к базе и имя базы.
Подобный код необходимо вставить на каждую страницу защищенной зоны, например, через include .
Вот вы и защищены. От себя могу еще добавить, что паролирование таким способом лично мне кажется весьма удобным и надежным.
Иногда бывает нужно закрыть от постороннего доступа PHP страницу, если Вы делаете закрытую область сайта. Это может быть какая-то скрытая информация для ваших клиентов или посетителей сайта, какой-то администраторский интерфейс для вас и т.д. Можно придумать сотни различных задач требующих ограничения доступа.
Закрыть такую страницу можно несколькими взаимодополняющими друг друга способами:
- Защита паролем (логин/пароль) с помощью переменных $_SERVER["PHP_AUTH_USER"] и $_SERVER["PHP_AUTH_PW"] .
- Защита по IP адресу клиента с помощью переменной $_SERVER["REMOTE_ADDR"] .
- Защита по 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 адрес).