Php http request password

Php http request password

HTTP-аутентификация в PHP возможна только при запуске РНР как Apache-модуля и, следовательно, недоступна в CGI-версии. В РНР-скрипте для Apache-модуля можно использовать функцию header() для отправки сообщения «Authentication Required» в клиентский браузер, что вызывает появление в нём окна ввода Username/Password. После того как пользователь ввёл username и password, URL содержащий PHP-скрипт, будет вызван снова с переменными $PHP_AUTH_USER, $PHP_AUTH_PW и $PHP_AUTH_TYPE, в которых установлены имя пользователя, пароль и тип аутентификации, соответственно. В настоящее время поддерживается только аутентификация «Basic». См. также о функции header() .

Пример фрагмента скрипта, который форсирует аутентификацию клиента:

Пример 17-1. HTTP Пример аутентификации
 else < echo "

Hello .

"; echo "

Вы ввели пароль .

"; > ?>

Примечание: пожалуйста, будьте внимательны при кодировании строк HTTP header’а. Чтобы максимально гарантировать совместимость со всеми клиентами, ключевое слово «Basic» должно быть записано с первой «B» в верхнем регистре, управляющая/realm строка обязана заключаться в двойные кавычки (не одинарные), и точно один пробел должен предшествовать коду «401» в строке «HTTP/1.0 401» header’а.

Вместо простого вывода $PHP_AUTH_USER и $PHP_AUTH_PW, вам, возможно, понадобится проверить правильность username и password путём запроса БД или нахождения пользователя в dbm-файле.

Проследите за работой браузеров Internet Explorer. Они очень чувствительны к порядку header’ов. Отправка WWW-Authenticate header до HTTP/1.0 401 header в данный момент является неким трюком.

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

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

Заметьте, однако, что вышесказанное не предотвращает похищение тем, кто контролирует неаутентифицированный URL, пароля из аутентифицированных URL на этом же сервере.

И Netscape Navigator, и Internet Explorer будут очищать локальный кэш аутентификации окон браузера для сферы/realm при получении ответа 401 сервера. Это может «log out» (выполнить выход) пользователей, форсируя повторное введение ими username и password. Некоторые используют это для «time out» логинов, или предоставляют кнопку «log-out».

Пример 17-2. HTTP аутентификация, форсирующая новые name/password
 if (!isset($_SERVER['PHP_AUTH_USER'])||($SeenBefore == 1 && $OldAuth == $_SERVER['$PHP_AUTH_USER']))) < authenticate(); >else < echo "

Welcome:
"; echo "Old: "; echo "

' METHOD='POST'>\n"; echo "\n"; echo "\n"; echo "\n"; echo "

\n"; > ?>

Это поведение не требуется стандартом HTTP Basic authentication, поэтому вы никогда не должны зависеть от этого. Тестирование для Lynx показало, что Lynx не зачищает показатели аутентификации при ответе 401 сервера, поэтому нажатие back, а затем снова forward, откроет ресурс, если показатель аутентификации не изменились. Пользователь, однако, может нажать клавишу ‘_’ для очистки его информации аутентификации.

Также заметьте, что это не работает на Microsoft IIS-сервере и с CGI-версией PHP из-за ограничений IIS.

Примечание: если safe mode включён, uid скрипта добавляется к части realm шапки WWW-Authenticate .


Назад Оглавление Вперёд
Создание изображений и
манипуляции с ними
Вверх Куки

Источник

HTTP-аутентификация в PHP

Возможно использовать функцию header() для отправки сообщения «Authentication Required» браузеру, заставив его показать окошко для ввода логина и пароля. Как только пользователь заполнит логин и пароль, ссылка, содержащая PHP-скрипт будет вызвана еще раз с предопределенными переменными PHP_AUTH_USER , PHP_AUTH_PW , и AUTH_TYPE , установленными в логин, пароль и тип аутентификации соответственно. Эти предопределенные переменные хранятся в массивах $_SERVER и $HTTP_SERVER_VARS . Поддерживаются оба типа: «Basic» и «Digest» (начиная с версии PHP 5.1.0). Подробнее смотрите функцию header() .

Замечание: Замечание касательно версии PHP

Суперглобальные переменные, такие как $_SERVER , доступны, начиная с » 4.1.0.

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

Пример #1 Пример Basic HTTP-аутентификации

if (!isset( $_SERVER [ ‘PHP_AUTH_USER’ ])) header ( ‘WWW-Authenticate: Basic realm=»My Realm»‘ );
header ( ‘HTTP/1.0 401 Unauthorized’ );
echo ‘Текст, отправляемый в том случае,
если пользователь нажал кнопку Cancel’ ;
exit;
> else echo «

Hello < $_SERVER [ 'PHP_AUTH_USER' ]>.

» ;
echo «

Вы ввели пароль < $_SERVER [ 'PHP_AUTH_PW' ]>.

» ;
>
?>

Пример #2 Пример Digest HTTP-аутентификации

Это пример реализации простого скрипта Digest HTTP-аутентификации. За подробностями обращайтесь к » RFC 2617.

//user => password
$users = array( ‘admin’ => ‘mypass’ , ‘guest’ => ‘guest’ );

if (empty( $_SERVER [ ‘PHP_AUTH_DIGEST’ ])) header ( ‘HTTP/1.1 401 Unauthorized’ );
header ( ‘WWW-Authenticate: Digest realm color: #007700″>. $realm .
‘»,qop=»auth»,nonce color: #007700″>. uniqid (). ‘»,opaque color: #007700″>. md5 ( $realm ). ‘»‘ );

die( ‘Текст, отправляемый в том случае, если пользователь нажал кнопку Cancel’ );
>

// анализируем переменную PHP_AUTH_DIGEST
if (!( $data = http_digest_parse ( $_SERVER [ ‘PHP_AUTH_DIGEST’ ])) ||
!isset( $users [ $data [ ‘username’ ]]))
die( ‘Неправильные данные!’ );

// генерируем корректный ответ
$A1 = md5 ( $data [ ‘username’ ] . ‘:’ . $realm . ‘:’ . $users [ $data [ ‘username’ ]]);
$A2 = md5 ( $_SERVER [ ‘REQUEST_METHOD’ ]. ‘:’ . $data [ ‘uri’ ]);
$valid_response = md5 ( $A1 . ‘:’ . $data [ ‘nonce’ ]. ‘:’ . $data [ ‘nc’ ]. ‘:’ . $data [ ‘cnonce’ ]. ‘:’ . $data [ ‘qop’ ]. ‘:’ . $A2 );

if ( $data [ ‘response’ ] != $valid_response )
die( ‘Неправильные данные!’ );

// ok, логин и пароль верны
echo ‘Вы вошли как: ‘ . $data [ ‘username’ ];

// функция разбора заголовка http auth
function http_digest_parse ( $txt )
// защита от отсутствующих данных
$needed_parts = array( ‘nonce’ => 1 , ‘nc’ => 1 , ‘cnonce’ => 1 , ‘qop’ => 1 , ‘username’ => 1 , ‘uri’ => 1 , ‘response’ => 1 );
$data = array();
$keys = implode ( ‘|’ , array_keys ( $needed_parts ));

preg_match_all ( ‘@(‘ . $keys . ‘)=(?:([\'»])([^\2]+?)\2|([^\s,]+))@’ , $txt , $matches , PREG_SET_ORDER );

foreach ( $matches as $m ) $data [ $m [ 1 ]] = $m [ 3 ] ? $m [ 3 ] : $m [ 4 ];
unset( $needed_parts [ $m [ 1 ]]);
>

return $needed_parts ? false : $data ;
>
?>

Замечание: Замечание касательно совместимости

Будьте особенно внимательны при указании HTTP-заголовков. Для того, чтобы гарантировать максимальную совместимость с наибольшим количеством различных клиентов, слово «Basic» должно быть написано с большой буквы «B», регион (realm) должен быть взят в двойные (не одинарные!) кавычки, и ровно один пробел должен предшествовать коду 401 в заголовке HTTP/1.0 401. Параметры аутентификации должны разделяться запятыми, как это было показано в примере Digest аутентификации выше.

Вместо простого отображения на экране переменных PHP_AUTH_USER и PHP_AUTH_PW , вам, возможно, понадобится проверить их корректность. Используйте для этого запрос к базе данных или поиск пользователя в dbm-файле.

Вы можете пронаблюдать особенности работы браузера Internet Explorer. Он очень требователен к параметру передаваемых заголовков. Трюк с указанием заголовка WWW-Authenticate перед отправкой статуса HTTP/1.0 401 пока что работает для него.

Для того, чтобы предотвратить написание кем-либо скрипта, раскрывающего пароль к странице, которая использует внешнюю аутентификацию, переменные PHP_AUTH не устанавливаются в случае, если данная страница использует внешнюю аутентификацию и установлен безопасный режим. Несмотря на это, переменная REMOTE_USER может использоваться для аутентификации пользователя, прошедшего внешнюю аутентификацию. Таким образом, вы всегда можете воспользоваться переменной $_SERVER[‘REMOTE_USER’] .

Замечание: Замечание касательно конфигурации

PHP использует указание директивы AuthType для указания того, используется внешняя аутентификация или нет.

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

И Netscape Navigator и Internet Explorer очищают кэш аутентификации текущего окна для заданного региона (realm) при получении от сервера статуса 401. Это может использоваться для реализации принудительного выхода пользователя и повторного отображения диалогового окна для ввода имени пользователя и пароля. Некоторые разработчики используют это для ограничения авторизации по времени или для предоставления кнопки «Выход».

Пример #3 Пример HTTP-аутентификации с принудительным вводом новой пары логин/пароль

function authenticate () header ( ‘WWW-Authenticate: Basic realm=»Test Authentication System»‘ );
header ( ‘HTTP/1.0 401 Unauthorized’ );
echo «Вы должны ввести корректный логин и пароль для получения доступа к ресурсу \n» ;
exit;
>

Это поведение не регламентируется стандартами HTTP Basic-аутентификации, следовательно, вы не должны зависеть от этого. Тестирование браузера Lynx показало, что Lynx не очищает кэш авторизации при получении от сервера статуса 401, и, нажав последовательно «Back», а затем «Forward» возможно открыть такую страницу, при условии, что требуемые атрибуты авторизации не изменились. Однако, пользователь может нажать клавишу ‘_’ для очистки кеша аутентификации.

Для того, чтобы добиться корректной работы HTTP-аутентификации в IIS сервере с CGI версией PHP, вы должны отредактировать конфигурационную настройку IIS под названием «Directory Security«. Щелкните на надписи «Edit» и установите опцию «Anonymous Access«, все остальные поля должны остаться неотмеченными.

Замечание: Замечание касательно IIS:
Для того, чтобы HTTP-аутентификация корректно работала в IIS, в конфигурации PHP опция cgi.rfc2616_headers должна быть установлена значением 0 (значение по умолчанию).

Замечание:

В случае, если используется безопасный режим, UID текущего скрипта будет добавлен в realm-часть заголовка WWW-Authenticate.

Источник

HTTP Basic Authentication with PHP

There many ways of performing authentication over the web. You can use a token and pass it as a special header. This is commonly done with API tokens. You can also use a cookie to store a session token. This is common for webservers that have a database session in the backend.

One simple method is to use HTTP Basic Access Authentication. This involves adding a header that contains your username and password. The proper format for the header is:

Authorization: Basic XXXXXX 

Where XXXXXX is your credentials in the form of username:password with base64 encoding.

PHP automatically decodes and splits the username and password into special named constants:

  • PHP_AUTH_USER with the username as a plain-text string
  • PHP_AUTH_PW with the password as a plain-text string

We will look at how to restrict a page using HTTP basic authentication in PHP.

Example of HTTP Basic Auth

Access denied. You did not enter a password.

'; exit; // Be safe and ensure no other content is returned. > // If we get here, username was provided. Check password. if ($_SERVER['PHP_AUTH_PW'] == '$ecret') < echo '

Access granted. You know the password!

'; > else < echo '

Access denied! You do not know the password.

'; >

Hashing passwords

Really, you should never be storing passwords in plain-text. If you are storing user account information in a file or a database, the password should be hashed with a salt and each user should have a unique salt. The salt will be useful if the database is ever compromised by making it harder to crack the passwords by reducing the effectiveness of rainbow tables. It will also reduce the amount of identical hashes caused by people using the same password.

PHP’s password_hash() can take care of the hashing and the salt generation. Here is a quick example, but you can read more about Safe Password Hashing.

You use password_hash() to generate the hash that you want to store in your database or password file. This will include the salt.

When a user attempts to authenticate and they provide a password, you use crypt() and pass it the user-supplied password along with your stored hash and then compare that to the stored hash. See the example below.

Testing with curl

If you want to test, an easy way to send an HTTP request with a properly formatted header is with curl . It has a convenient —user option you can set like this:

curl --user my_username:my_password http://localhost:8000/ 

Conclusion

After reading this, you should understand how to restrict a page using simple HTTP basic authentication in PHP.

References

Источник

Читайте также:  Cascade style sheets html
Оцените статью