Обобщен удостоверяване в PHP

Ограничаване на достъпа до някои области на сайта обикновено изглежда
монотонен: всеки потребител е дадено име и парола, или той
те избират и да влязат в защитената част на интернет страницата от която се нуждаят, за да влезете. От техническа гледна точка, за да се провери паролата, използвана
различни методи. HTML форма може да се използва, за да въведете потребителско име и парола.
В този случай, паролата се изпраща на сървъра на ясен текст в СЛЕД искането.
Това не е приемливо, ако потребителят не е седнал на LAN, където е възможно,
използването на специално обучени. За да се реши този проблем, е изобретил метод
удостоверяване с помощта на хешове, в която не се изпраща парола, както и
предава хеш стринг в зависимост от парола, някои за еднократна употреба
параметър, а може би дори по какъвто и параметри. Този метод е все още
наречен / отговор, тъй като при използване на клиента
получи искане от еднократна параметър и изпраща отговор, съдържащ хашиш. На нивото на HTTP 1.1 е възможно метод за идентификация
Basic, че няма по-добро използване на HTML-форми, както и преглед, който
ние погледнем по-отблизо.

Digest срещу Basic

AuthType Digest
AuthUserFile <файл>
AuthName <название защищаемой области>
Изискване valid_user

Напълно се опише методът може да се намери в RFC 2069, и ако
С една дума, методът работи добре. Когато сървърът получи заявка, свързана с защитена зона,
401 го произвежда Разрешение за грешка Задължително горен и заявка
удостоверяване по този начин:

WWW удостоверяване: Обобщен сфера = »обезопасена зона», nВеднага щом = »123456123456"

царство - е името на защитената зона, както и дадения случай - еднократно
стойност. Има незадължителни параметри, които обсъждаме
няма. Клиентът повтаря искането чрез добавяне на заглавна по следния начин:

Разрешение: Обобщен сфера = »обезопасена зона», потребителско име = »123", URI = »/ index.php», nВеднага щом = »123 456 123 456", отговор = »1234567890abcdef1234567890abcdef»

параметър Ури трябва да съвпада с URI в искането и отговора - това
отговор, който се изчислява, както следва:

отговор = Н (Н (А1) + «:» + nВеднага щом + «:» + Н (А2))
Н - хеш функция MD5-подразбиране
A1 = потребителско име + «:» + сфера + «:» + парола
А2 = метод заявка + «:» + URI
поискване метод - един GET, POST, и така нататък.

Както можете да видите, А1 не зависи при поискване или от еднократна употреба
стойности, така че сървърът може да се съхранява паролата
Н (А1). Ето как се прилага в mod_digest в Apache.
Въпреки това, същите данни е достатъчен и клиента. Един нападател, като
Този хеш мога да разбера отговора на горните формули и
образуват HTTP заявка, например, с помощта на програмата
AccessDriver и HTTP инструмент
Debugger. Нещо повече, този процес е показано по-долу. Сървърът трябва да провери дали дадения случай
тези, които преди това са били издадени на клиента и дали тя не е актуална.
Ако отговорът съответства на дадения случай, но стойността на този параметър
не е от значение, тъй като по-горе отговор 401, с единствения
с изключение на тези в заглавната част на WWW-автентичността се добавя към параметъра
остаряла = вярно, което показва, че достъпът е забранен само по тази причина,
и трябва да се опита отново, без подканване на потребителя за нова парола. Това, IMHO, е неудобно, защото ако възникне такава ситуация
при POST или пуснати заявка с голям блок от данни, след което клиентът ще трябва да
прехвърля всички данни два пъти. За да избегнете това, стандартът е предвидено
заглавна Authentication-Info, в които сървърът може когато отговаряте
успешна заявка за информиране на клиента следната стойност един работен ден.
Синтаксисът е същият, както в WWW удостоверите, освен че nВеднага щом
заменя със nextnonce. Въпреки това, ако се съди по резултатите от моето
експерименти, опера игнорира тази глава. Друго решение в съответствие с
RFC 2068 (HTTP / 1.1), сървърът може да отговори, преди искането за край,
да се намалят ненужните данни за клиенти, но това е Apache + PHP
Това не може да се реализира, тъй като сценарият започва да тече едва след
като Apache напълно приема и разбор на искането.

Съхраняване на данни между заявките

Този скрипт проверява само паролата си и работи независимо от
вход. В зависимост от успеха на теста са дадени прости отговори.

$ Realm = 'зона за сигурност "; // Име на защитената зона
$ Pass = "подаване"; // парола
$ Fileprefix = './ "; // Пътят към файлови маркери посочва валидността на дадения случай

// Get заглавия
$ Заглавия = apache_request_headers ();

// флаг, че ние ще настроен на TRUE при успешно проверка
$ Auth_success = FALSE;
$ Остаряло = «»;

// Ако няма разрешение хедър, и няма нищо, за да проверите
IF (Isset ($ заглавията [ "разрешение"]))
$ Разрешението = $ заглавията [ "разрешение"];

/ * Разбор глава използване регулярни изрази. Заглавието съдържа думата «Digest», както и списък на
тип paremetrov параметър = "стойност" или параметър = стойност, разделени със запетая. Това редовно израз съвпада с един такъв параметър. * /
preg_match_all ( '/ (, | \ е | ^) (\ w +) = ( «([^»] *) »| ([\ т \ г] *)) (, | $) /',
$ Разрешение, $ мачове, PREG_SET_ORDER);

/ * Сега се създаде удобство за по-нататъшна обработка масив, където ключовете - имената на параметрите и стойностите на елементите в масива -
стойности на параметрите. * /
$ Auth_params = Array ();
за ($ аз = 0; $ аз $ Срещата = $ съвпадения [$ Ь];

/ * Името е винаги във втората група на скоби, по смисъла зависимост от това дали се котира или не, може да
е в 4-та или 5-тата група. За групи от скоби паднали
на нереализирания клон в празен низ от масив,
така че можете просто да добавите до стойностите. * /
$ Auth_params [$ мач [2]] = $ мач [4]. $ Срещата [5];
>

/ * Изчисляваме отговор, който съответства на
влезете въведени от потребителя, паролата и нашия параметър едно време предава на потребителя.
* /
$ A1 = $ auth_params [ 'потребителско име']. ':'. $ Auth_params [ "област"]. ':'. $ Pass;
$ А2 = $ _SERVER [ 'REQUEST_METHOD']. ':'. $ _SERVER [ 'REQUEST_URI'];
$ Resp = md5 (md5 ($ а1) ':' $ auth_params [ 'nВеднага щом'] ':' md5 ($ а2) ....);

// Проверете отговора.
ако ($ респ == $ auth_params [ "отговор"])
// Проверете значението на единствен параметър
$ Fn = $ fileprefix. $ Auth_params [ 'nВеднага щом'];
ако (@file_get_contents ($ Fn) == $ _SERVER [ 'REMOTE_ADDR'])
прекратяване на връзката ($ Fn); // По тази настройка е без значение
$ Auth_success = вярно; // е идентифициран
> още
// настройка Еднократна е без значение
$ Остаряло = «, остаряла = вярно»;
>
>
>

ако ($ auth_success)
печат ( «Digest удостоверяване тест

");

печат ( «удостоверяват \ н»);
var_dump ($ auth_params);

> още
file_put_contents ($ fileprefix $ nВеднага щом, $ _SERVER [ 'REMOTE_ADDR'].);

$ Прото = $ _SERVER [ 'SERVER_PROTOCOL'];
Header ( «$ 401 прото които не са разрешени»);
Header ( «WWW удостоверяване: Обобщен сфера = \» $ царство \ », nВеднага щом = \» $ nВеднага щом \ »$ остаряла»);

печат ( «Digest удостоверяване тест

");
печат ( «Трябва да удостоверят с метод Digest»);
печат ( «
");
>

Преминаването преглед удостоверяване с известен Н (А1)

Отворете конзолата, отидете в папката с PHP и се опитва да управлява следната команда:

Преглед-получаване на желания отговор: c6d0af0db239d75c
3f59640a4896d096
Сега сложи провери AccessDriver «Header Data», която се появява в копието
Полеви заглавията, които са били изпратени миналата заявка и да ги ги добавя
Разрешението за употреба. Ето какво се случва:

Кликнете «Свързване». Качваме се на резултата:

Покажете тази статия на приятел: