Неустрашимый auth php. HTTP Установка защиты на страницу используя MySQL и PHP. Пример #7 Пример Digest HTTP-аутентификации

Здесь я узнаю:

  • как создать грамотное резюме на hh.ru и получить отклики от работодателей;
  • почему мало просмотров моего резюме на hh.ru и как увеличить просмотры;
  • почему не просматривают мои отклики (мое отправленное резюме) на вакансию;
  • что писать в ключевых навыках и сопроводительном письме к резюме.

Образец резюме для hh.ru.

1. Помогите быстрее найти вас среди 34 млн. соискателей.
Обозначьте четко, работу в какой желаемой должности ищете.
Составьте синонимы должностей (вакансий), которые вы ищете, а также названия смежных должностей, в которых можете работать. Выберите из них несколько, наиболее часто употребляемые в вашей профессиональной сфере и добавьте их через запятую в поле формы "Желаемая должность". Работодатель обычно ограничен во времени (особенно в Москве), поэтому может искать анкеты соискателей на хх.ру только по их названию.

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

Как написать эффективное резюме на hh

3. Помогите работодателю найти у вас нужные ему навыки.
3.1. Включите в описание своего опыта работы (в поле формы резюме "Обязанности, функции, достижения") профессиональную лексику/терминологию/аббревиатуру. Составьте перечень профессиональных терминов - ваших профессиональных навыков. Включите эту терминологию в описание своего опыта на каждом месте работы. Особенно - на последнем месте работы. Это поможет работодателю легче и быстрее найти вас на хх.ру. Полезно будет включить профессиональную терминологию и в раздел резюме "Ключевые навыки".

Описывайте навыки буквально и доступно (неправильно: "разработка КТПСП на базе конструктива OKKEN". Правильно: "разработка КТПСП (комплектных трансформаторных подстанций для сетей промышленных предприятий) в металлическом корпусе OKKEN, производства Schneider Electric").

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

3.2. Обязательно укажите сферы деятельности компаний , в которых вы работали: выберите их из списка hh.ru или напишите своими словами, аналогично формулировкам Хедхантера. Часто работодатели ищут соискателей на хх.ру по критерию: "искать в компаниях и отраслях" (под отраслью подразумевается сфера деятельности компаний, в которых вы работали). Также стоит заполнить в форме резюме hh окошко "сайт" - официальный сайт компании, в которой вы работали. Ссылка на официальный сайт поможет им лучше понять ваш опыт работы.

4. Не мучайте его длинным текстом.
Опишите лаконично ваш опыт работы. Когда работодатель будет распечатывать ваше резюме с Хедхантера, желательно, чтобы оно уместилось на 2-х страницах, если вам до 30 лет (см. образец резюме), или максимум на 4-х страницах, если вы старше. Долгим анализом вашего трудового пути он не будет заниматься: на Хед хантер более 34 млн. резюме.

Задача работодателя - выбрать и распечатать (скачать) анкеты лучших соискателей для звонков им. Не усложняйте ему выбор. Когда HR-менеджер компании или рекрутер просматривает в день до 100 резюме на хх.ру, к концу рабочего дня он уже с трудом понимает смысл длинных текстов. Поэтому может проглядеть вашу анкету на Хедхантере, если не заметит в ней искомых ключевых слов (профессиональных навыков из перечня требований к кандидату на вакансию).

Как работодатель видит "Мое" резюме на hh.

Как видит "Мое" резюме на hh работодатель. Он еще не видит мой опыт работы , но уже видит мою желаемую зарплату.

5. Поразите его своими достижениями на последнем месте работы.
Вложитесь по максимуму в описание своего опыта и достижений на последнем месте работы. Когда представитель компании просматривает резюме на хх.ру, он может даже не открывать их, а ограничиться кликом на ссылку - предпросмотром последнего места работы. Его интересуют ваши обязанности, а особенно - достижения. Если его ничего не "зацепит" в вашем опыте, то он прокрутит мышкой вниз - смотреть следующие анкеты, а про вас забудет. В личном кабинете соискателя такие предварительные просмотры не отображаются: вот почему вам может казаться, что на hh "Мои" резюме не просматривает работодатель.

Как работодатель делает просмотр резюме.

Он кликнул на последнее место работы в "моем" резюме. Увидел, что умею, чего достиг, и, сравнил с тем, сколько я "стою" .

Обозначьте как можно четче, каких результатов вы достигли на последнем (текущем) месте работы. Но без преувеличений и фанатизма. Коммерсантам (менеджерам по продажам, региональным представителям, начальникам отделов продаж и др.) нужно указать коммерческие результаты в цифрах (см. выше наш образец резюме).
Используйте активные глаголы : добился прироста... на...%; выполнил план по... на...%; увеличил...; снизил...; заключил договор с... и т.д..

6. "Попадите в сети" всех потенциальных работодателей (разместитесь в смежных профобластях).
"Засветитесь" в смежных профессиональных областях: заполняя поле резюме "Желаемая должность и зарплата" выберите не только те профобласти, которые по умолчанию предлагает Хедхантер, но и смежные с ними профобласти, а внутри них - подходящие специализации. Если hh.ru не позволяет резюме разместить в смежной профобласти, то обязательно создайте на hh.ru дубликат резюме (т.е. разместите копию своего резюме в нужной профобласти и нужной специализации). Верно подобранные профобласти помогут потенциальным работодателям легче и быстрее найти вас . В поле резюме "Опыт работы" обязательно укажите сферу деятельности (одну или несколько) каждой компании, в которой вы работали (см. выше пункт 3.2. наших рекомендаций).

Отклик соискателя в кабинете работодателя.

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

Отрасли помогут работодателю точнее понять ваш опыт работы. Конкретика в анкете мотивирует их совершить действие (распечатать анкету и положить себе на стол или сразу позвонить вам).

7. "Продавайте" себя по рыночной цене (укажите зарплату). "Продавайте" работодателю свой опыт работы и навыки по рыночной цене. Обязательно укажите в резюме на хх.ру желаемую зарплату. Отсутствие зарплаты может лишить вас звонка потенциального работодателя, который может колебаться, звонить вам или нет. Если его впечатлит ваш опыт, он может предположить, что вы дорогой кандидат и не станет звонить вам.

"Мое" резюме без зарплаты могут не увидеть.

Компания может исключить из поиска hh "мое" резюме без з/п.

Кроме того, те работодатели, которые не хотят "морочиться" с соискателями, чьи зарплатные ожидания не известны, могут просто поставить галочку в параметрах поиска резюме на хх.ру "Не показывать резюме без зарплаты". И если ваши ожидания чуть выше, а компания предлагает зарплату чуть меньше, но вы все равно согласились бы в ней работать, о вашем существовании они могут даже не узнать и не скопировать с hh ваше резюме в свой кадровый резерв.

Не указывайте завышенную заработную плату, это тоже может оттолкнуть работодателя, особенно при недостаточном опыте для его вакансии, или не удачно составленном резюме. Торговаться будете на собеседовании с ним, а до него еще нужно добраться. Как правило, работодатели могут подвинуться по зарплате до 20% в сторону увеличения , от изначально предлагаемой, но вы должны заинтересовать его. А он, прежде всего, сначала должен пригласить вас на собеседование.

9. Не обесценивайте себя среди других соискателей (обновляйте резюме нечасто).
На кнопочки "Обновить резюме " или "Обновить дату" жмитене чаще 1 - 2 раз в неделю (следите за датой обновления резюме в личном кабинете соискателя на pp hh.ru). В Москве и Московской области, в Санкт-Петербурге и Ленинградской области – можно обновлять дату размещения раз в 3 дня, в других городах-миллионниках (Самаре, Казани, Воронеже и др.), можно раз в 7 дней. Не рекомендуем пользоваться сервисом hh "Автообновление резюме" (ежедневно поднимает анкету соискателя в поиске для работодателя).

Частым обновлением резюме на хх.ру вы не найдете быстрее работу, скорее можете навредить себе. Те компании и те , которые ведут поиск кандидатов на Хедхантере в определенном профессиональном сегменте, регулярно видят одних и тех же соискателей, в т.ч. через ежедневную подписку на резюме (автопоиск). И, если по вам, как возможной кандидатуре на вакансию, они вначале могли раздумывать, то при частом обновлении анкеты у них может пропасть желание выходить с вами на контакт. Частым обновлением своего резюме вы обесцениваете себя в глазах этой категории работодателей. Они могут думать, что вы долго не можете найти работу и в отчаянии каждый день жмете кнопку "Обновить резюме" на hh.ru.

Заключение.
Когда создадите "Мое" резюме" онлайн, скачайте его из личного кабинета hh ru и распечатайте.
Посмотрите глазами работодателя на "Мое" готовое резюме и ответьте на вопросы:

  1. какую именно работу ищет этот человек;
  2. как он выглядит на фото;
  3. какую зарплату он хочет;
  4. кем, где, на каких рынках и как долго он работал;
  5. что он делал и какими навыками овладел;
  6. чего конкретно он добился;
  7. какое он имеет образование.

Пробежавшись взглядом по анкете за 6 - 15 сек. вы должны принять решение, соответствует ли опыт и квалификация данного специалиста той работе, которую он ищет. (Если да, то ему будет звонить работодатель, а если нет - забудет про него и продолжит поиск других соискателей на hh.ru). Кроме того, при чтении бумажной версии своего идеального резюме, легче увидеть и исправить ошибки в нем.

Наши рекомендации могут служить альтернативой сервису hh "Готовое резюме" . Вы вполне способны написать свое CV сами и не тратить деньги (не искать промокоды) на услуги по составлению готового резюме. Не советуем платить hh.ru и за опцию "Я хочу тут работать" и отправлять резюме в личный кабинет работодателя, без гарантии, что его будет кто-то читать. Лучше найдите сайт этой компании, а на нем E-mail отдела персонала (отдела по подбору персонала) и отправьте свою анкету напрямую в отдел.

Держите всегда наготове свое идеальное резюме (на ПК, в телефоне или в своем почтовом ящике), чтобы в любой момент вы смогли бы ее отправить по электронной почте работодателю.
Ссылку на резюме в hh.ru желательно не отправлять. Резюме по прямой ссылке может не загрузиться или открыться, но без ваших Ф.И.О. и контактов. Так бывает, если у компании-работодателя был, но перестал действовать, купленный ранее доступ к контактам соискателей на Хедхантере. Вместо ссылки отправьте лучше резюме файлом в формате, удобным для редактирования (.doc или.rtf).

Ключевые навыки в резюме hh.ru

Заполняя резюме онлайн на hh.ru, соискатели часто допускают ошибку, описывая свои навыки. Многие видят в этом разделе возможность указать не только те профессиональные навыки, которыми они реально владеют, но и те, которыми они владеют на уровне теории. Часто студенты и молодые специалисты, с небольшим опытом работы, любят составлять огромный список ключевых навыков в резюме на hh.ru. Другая категория специалистов любит здесь указывать абстрактные формулировки и банальные вещи. Примеры подобных неправильных навыков: "Грамотная речь", "Ведение переговоров", "Пользователь ПК", "Поиск информации в интернет", и т.д. - этого не надо делать. Не захламляйте свое резюме .

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

Примеры ключевых навыков в резюме hh.ru.

Примеры неправильных и правильных навыков в резюме на hh

Как было указано выше, в рекомендации № 3, ваши ключевые навыки должны состоять из профессиональной лексики/терминов/аббревиатуры, которыми пользуются в вашей профессиональной среде. Например, в резюме Инженера по специальности "Инженер ОПС", такими навыками могут являться: 1) "проектирование в AutoCAD систем безопасности (СКУД); 2) наладка СКУД "Болид". Это редкие умения для данной специальности, поэтому их нужно обязательно указать именно в описании своих обязанностей на hh.ru (в поле формы резюме "Обязанности, функции, достижения"), вместо того, чтобы писать в поле "ключевые навыки" абстрактные категории (например: AutoCAD или "Проектная документация").

Когда работодатель видит в списке ключевых навыков на хх.ру просто термин "AutoCAD", то ему сложно понять: то ли вы владеете этой программой на уровне ВУЗа (когда писали диплом), то ли вы действительно способны проектировать в ней на уровне опытного проектировщика. А если в описании обязанностей, в вашем опыте работы, он прочитают формулировку "проектирование в AutoCAD СКУД", он поймет однозначно, что вы умеете работать с проектами в области систем безопасности.

В этом разделе резюме на Хедхантере стоит указать те навыки, которые вы не смогли уместно применить в описании своих обязанностей, функций и достижений, но которые считаете важными и редкими для своей специальности . Например, для того же Инженера ОПС, вместо того, чтобы нажимать на готовые ссылки "рекомендуемые навыки", вам лучше написать своими словами "навык программирования СКУД "Болид"".

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

Кроме того, вы всегда можете, вместо выбора из списка навыков, которые предлагает Хедхантер, написать полезные для работодателя, на ваш взгляд, умения и знания в разделе резюме hh "Обо мне ".

Почему на hh.ru не просматривают отклики

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

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

2. У вас явно не хватает квалификации для вакантной должности и это сразу видно из аннотации резюме на hh.ru личном кабинете компании. По этой причине ваш отклик тоже может быть не просмотрен.

3. Работодателя смущает ваша желаемая з/п в резюме , даже если вы указали ее как совокупную (оклад + премии или бонусы). Он видит конкретную цифру в анкете и предполагает обычно:
а) что вы ему "не по карману", даже если в реальности конкретно в эту компанию вы согласились бы на несколько месяцев на более низкую з/п;
б) работодатель hh видит аннотацию резюме с непонятным для него опытом работы, но с понятной и высокой для него з/п, поэтому "держит марку" и не делает просмотра, чтобы "не палиться". И ждет других откликов соискателей с приемлемой для него зарплатой. Если таковых не дождется, он может вернуться к вашему резюме и сделать просмотр.

4. Работодателем в вакансии указаны размытые требования к кандидатам, поэтому поступает много откликов (особенно много откликов поступает на вакансию в г. Москве) в которых ему трудно разобраться. И он может ограничиться первой партией поступивших откликов на вакансию. Отобрать из них несколько соискателей и пригласить их на собеседование. Если вы не попали в эту партию, а из приглашенных соискателей кто-то выбран, просматривать ваше резюме работодателю уже нет необходимости.

5. Компания ищет кандидата определенного пола или определенного возраста , а вы не подходите под эти критерии. В требованиях вакансии работодатель не может указать свои предпочтения по полу и возрасту и ему не даст это сделать модератор Хедхантера (в соответствии с Законом № 162-ФЗ). Поэтому, по умолчанию, данные критерии применяются к откликам.

Сопроводительное письмо к резюме на hh.ru

Работодатель почти всегда читает сопроводительные письма в откликах соискателей на hh.ru: он ожидает увидеть что-то полезное для себя , когда кликает на эту ссылку. Например, если вы - менеджер по продажам и имеете наработанные личные связи с потенциальными клиентами той компании, на вакансию которой собираетесь сделать отклик, то есть смысл написать об этом. Ему это точно будет интересно. Этим вы побудите его позвонить вам. Заполнять окно для сопроводительного письма шаблоном письма от Хедхантер: "Здравствуйте. Прошу Вас рассмотреть мою кандидатуру на вакансию..." не нужно.

Если не уверены в ценности своего сообщения для компании, то лучше ничего не писать . Это нисколько не уменьшит вероятность рассмотрения вашего отклика. Лучше пробежитесь глазами данного работодателя по своей анкете и поищите, что полезного именно для его вакансии есть в вашем опыте работы. Если ничего не "цепляет", то еще раз прочитайте описание вакансии и добавьте пару предложений в описание своего опыта работы (укажите пару полезных навыков для данной вакансии), а затем сделайте отклик. Сопроводительное письмо к резюме на hh.ru писать не обязательно.

Как скрыть "мое" резюме от работодателя

Если вы не хотите, чтобы вашу анкету видел ваш текущий работодатель или компания, в которой не желаете работать, сделайте следующее:
1) выполните вход в личный кабинет соискателя на hh.ru;
2) на личной странице наведите мышку на "Резюме" и выберите подраздел "Мои резюме";
3) под названием того резюме, которое хотите скрыть, кликните на ссылку "Изменить видимость";
4) выберите пункт "Компаниям, которые зарегистрировались на hh.ru, кроме";
5) нажмите на ссылку "Изменить список";
6) заполните окошко "Добавить компанию" - впишите название того предприятия, от которого хотите скрыть "Мое резюме";
7) нажмите "Готово";
8) нажмите "Сохранить" (это в разделе "Видимость").

Предварительно вам нужно поискать организацию, от которой хотите скрыть свою анкету, в каталоге компаний, которые зарегистрировались на Хедхантере. На главной странице личного кабинета соискателя:
1) нажмите последовательно: компании - каталог компаний - поиск по компаниям;
2) поставьте галочку "Показать компании, у которых нет открытых вакансий";
3) внесите в поле поиска название предприятия и нажмите "Найти";
4) выполните поиск фирм и по полному названию и по возможным сокращениям.

Но вы должны знать, что та организация, которую вы внесли в "черный список" может пройти регистрацию на HeadHunter еще и под другим названием, а вы можете даже не знать об этом. Кроме, того, HR-менеджер предприятия, в котором вы сейчас работаете, может попросить своих коллег из других фирм (прямых работодателей или ) проверить, нет ли на хх.ру его сотрудников. А чтобы не "засветиться" вы можете просто не указывать название компании-работодателя в последнем месте работы, вместо этого укажите вид деятельности предприятия (своими словами или выберите сферу деятельности из списка хх.ру). Некоторые соискатели не указывают в своем резюме названия компаний, в которых работают в настоящее время, и в этом нет ничего страшного. Они сообщают об этом на личном собеседовании с новым потенциальным работодателем.

Docx (2 страницы)

Как увеличить на hh.ru отклики работодателей на резюме.

О Headhunter

Сайтом hh.ru (хх.ру) владеет "HeadHunter Group" - российская интернет-компания, бизнес которой построен на продажах компаниям-работодателям контактов соискателей, прошедших регистрацию на hh.ru, а также на продаже им площадок для размещения вакансий. Дополнительный доход компания получает, оказывая платный сервис соискателям ("Готовое резюме", "Профориентация" и др.). Базовая услуга для соискателей - бесплатная регистрация резюме на hh.ru.
Сама компания пишет о себе: "Наша миссия - помогать HR-менеджерам и рекрутерам качественно и в срок закрывать вакансии, а также содействовать соискателям в поиске достойной работы".

Регистрация резюме hh.

Уровень конкуренции среди соискателей.
Поиск работы на Хедхантере - это поиск работы в высококонкурентной среде.
Это
битва за лучшие вакансии .
На 23.11.2017 г. на Хедхантере, по всей России, зарегистрировались 16 187 056 соискателей, а на 28.02.2018 г. количество резюме уже составило 17 942 311. Помогите компаниям быстрее обнаружить вас среди миллионов соискателей. Напишите и разместите для них качественную анкету и получите достойное предложение о работе. Резюме на hh.ru размещается бесплатно.

На картинке справа - динамика прироста соискателей (регистраций резюме) на Хедхантере за январь - февраль 2018 г.. Более подробная статистика здесь: https://stats.hh.ru

Статистика посещаемости сайтов по поиску работы. Данные за 19.02.2018.

Ограничение доступа к какой-либо области сайта обычно выглядит
однообразно: каждому пользователю выдается логин и пароль или он сам
их выбирает, и для входа в защищенную часть сайта их нужно ввести. С технической же точки зрения для проверки пароля используются
разные методы. Для ввода логина и пароля может использоваться HTML-форма.
В этом случае пароль передается на сервер открытым текстом в POST-запросе.
Это неприемлемо, если пользователь сидит в локалке, где возможно
использование снифера. Для решения этой проблемы придуман метод
аутентификации с помощью хешей, при котором пароль не передается, а
передается хеш строка, зависящая от пароля, некоего одноразового
параметра и, возможно, еще от каких-либо параметров. Этот метод еще
называют challenge/response, поскольку при его использовании клиент
получает запрос с одноразовым параметром и посылает ответ, содержащий хеш. На уровне протокола HTTP 1.1 возможна аутентификация методом
Basic, что ни чем не лучше использования HTML-формы, и Digest, который
мы и рассмотрим подробно.

При использовании метода Digest, как уже было сказано, пароль
не передается, и его невозможно отснифить, однако есть и другая сторона
проблемы. Для того, чтобы проверить пароль, сервер должен вычислить
ответ и сравнить его с ответом клиента, следовательно, на сервере должен
храниться пароль или зависящие от него данные, необходимые для
прохождения аутентификации. Отсюда следует, что человек, получивший права
на чтение аккаунтов (например, с помощью SQL-injection), сможет получить
доступ к страницам, защищенным методом Digest. При использовании метода
Basic возможно хранение хешей вместо паролей, что не дает поднять права,
прочитав эти хеши (ниже мы увидим, что в Digest тоже могут храниться хеши,
но такие, что их знания достаточно для вычисления ответа). Таким образом, перед нами дилемма: либо наш пароль отснифят,
либо получат через web-уязвимость, которую кто-нибудь обязательно отыщет,
потому что кто ищет, тот всегда найдет. Есть метод аутентификации без
обоих этих недостатков - метод аутентификации на основе открытого ключа:
для проверки нужен открытый ключ, а для прохождения проверки - секретный,
однако в HTTP 1.1 такой метод не предусмотрен. RFC 2069
рекомендует использовать SSL, если защита так важна. Защищается только передача пароля, а контент не шифруется, так
что нет смысла защищать этим методом ресурсы, откуда пользователь
получает секретную информацию. Для них необходим SSL. А имеет смысл
защищать, например, форум или заливку контента на сайт. Итак, если хостинг не поддерживает SSL, а аутентификация должна
быть безопасной, то будем использовать Digest. В Apache предусмотрен модуль mod_digest. Для его использования
в конфиге (или в.htaccess) пишем:

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

Файлы пользователей создаются утилитой
htdigest. Про mod_digest одно время появлялись сообщения, что он уязвим, так что,
возможно, там еще какие-нибудь проблемы обнаружатся. Кроме того, когда
я попытался его использовать у себя дома, получил ошибку
500 Server Internal Error. Кроме того, если добавление аккаунтов должно происходить
автоматически, и их должно быть много, они должны
храниться не в конфиге Апача, а в MySQL. Решение -
использовать PHP. В PHP нет встроенной поддержки этого
метода, поэтому его придется реализовать. Для этого необходимо изучить
этот метод подробно. Сразу замечу, что приведенная в этой статье
реализация работает только на Apache, так как полный доступ к заголовкам
запроса (функция apache_request_headers) работает только в Apache, а на
других серверах может отсутствовать. Нам же просто необходимо прочитать
заголовок Authorization.

Описание метода

Полностью описание метода можно прочитать в RFC 2069, а если
вкратце, то метод работает так. Когда сервер получает запрос, относящийся к защищенной области,
он выдает ошибку 401 Authorization Required и заголовок с запросом
аутентификации такого вида:

WWW-Authenticate: Digest realm="secure area", nonce="123456123456"

realm - это название защищенной области, а nonce - одноразовое
значение. Есть еще необязательные параметры, которые мы обсуждать
не будем. Клиент повторяет запрос, добавив к нему заголовок такого вида:

Authorization: Digest realm="secure area", username="123", uri="/index.php", nonce="123456123456", response="1234567890abcdef1234567890abcdef"

Параметр uri должен совпадать с URI в запросе, а response - это
ответ, который вычисляется так:

response = H(H(A1) + ":" + nonce + ":" + H(A2))
H - хеш-функция, по умолчанию MD5
A1 = логин + ":" + realm + ":" + пароль
A2 = метод запроса + ":" + URI
метод запроса - это GET, POST и тд.

Как видим, A1 не зависит ни от запроса, ни от одноразового
значения, поэтому на сервере может храниться не пароль, а
H(A1). Именно так это реализовано в mod_digest в Apache.
Однако этих же данных достаточно и клиенту. Злоумышленник, получив
этот хеш, может вычислить ответ по приведенным выше формулам и
сформировать HTTP-запрос, например, с помощью программы
AccessDriver и ее инструмента HTTP
Debugger. Подробнее этот процесс будет показан ниже. Сервер должен проверить, является ли одноразовое значение
тем, которое было ранее выдано клиенту и не устарело ли оно.
Если ответ соответствует параметру nonce, но значение этого параметра
не актуально, выдается описанный выше ответ с кодом 401 с той лишь
разницей, что в заголовок WWW-Authenticate добавляется параметр
stale=true, указывающий, что в доступе отказано лишь по этой причине,
и следует повторить попытку, не запрашивая у пользователя новый пароль. Это, имхо, неудобно, поскольку если такая ситуация возникнет
при запросе POST или PUT с большим блоком данных, то клиенту придется
передать все данные дважды. Во избежание этого стандартом предусмотрен
заголовок Authentication-Info, в котором сервер может при ответе на
успешный запрос сообщить клиенту следующее одноразовое значение.
Синтаксис такой же, как у WWW-Authenticate, кроме того что nonce
заменяется на nextnonce. Однако, судя по результатам моих
экспериментов, Opera игнорирует этот заголовок. Другое решение: в соответствии с
RFC 2068 (HTTP/1.1), сервер может ответить раньше, чем завершится запрос,
чтобы клиент прервал ненужную передачу данных, но на Apache+PHP это
не реализуется, поскольку скрипт начинает выполняться только после того,
как Apache полностью получит и пропарсит запрос.

Хранение данных между запросами

В реализации метода challenge/response на PHP есть тонкий момент.
Одноразовый параметр формируется и выдается клиенту в одном ответе, а
проверяется уже в другом сеансе работы скрипта.
То есть его необходимо сохранить от одного вызова скрипта до другого, и для этого придется
использовать файлы или БД. В моем примере используются файлы с именами,
соответствующими одноразовым значениям, а в самих файлах записаны
IP-адреса клиентов, которым они выданы. В примере не реализован сбор
мусора: надо периодически удалять старые файлы.

Разбор кода

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

$realm = "secure area"; // Название защищаемой области
$pass = "pass"; // Пароль
$fileprefix = "./"; // Путь для файлов-меток, обозначающих валидность nonce

/* Сконструируем одноразовый параметр так, как рекомендуется в RFC2069, хотя можно и по-другому. Параметр, по рекомендации, должен зависеть от адреса клиента, текущего времени и секретной строки. */
$nonce = md5($_SERVER["REMOTE_ADDR"] . ":" . time() . ":MyCooolPrivateKey");

// Получаем заголовки
$headers = apache_request_headers();

// Флаг, который мы установим в TRUE при успешной проверке
$auth_success = FALSE;
$stale = "";

// Если нет заголовка Authorization, то нечего и проверять
if (isset($headers["Authorization"]))
{
$authorization = $headers["Authorization"];

/* Пропарсим заголовок с помощью регулярного выражения. Заголовок содержит слово "Digest" и список
пареметров вида param="value" или param=value через запятую. Это регулярное выражение соответствует одному такому параметру.
*/
preg_match_all("/(,|\s|^)(\w+)=("([^"]*)"|([\w\d]*))(,|$)/",
$authorization, $matches, PREG_SET_ORDER);

/* Теперь сформируем для удобства дальнейшей обработки массив, где ключи - названия параметров, а значения элементов массива -
значения параметров.
*/
$auth_params = Array();
for ($i = 0; $i < count($matches); $i++)
{
$match = $matches[$i];

/* Название всегда во второй группе скобок, в значениев зависимости от того, в кавычках оно или нет, может
быть в 4-й или 5-й группе. Для групп скобок, попавших
в нереализованную ветвь, в массиве пустая строка,
поэтому можно просто сложить значения.
*/
$auth_params[$match] = $match . $match;
}

/* Вычислим ответ, который соответствует
логину, введенному пользователем, нашему паролю и одноразовому параметру, переданному пользователем.
*/
$a1 = $auth_params["username"] . ":" . $auth_params["realm"] . ":" . $pass;
$a2 = $_SERVER["REQUEST_METHOD"] . ":" . $_SERVER["REQUEST_URI"];
$resp = md5(md5($a1) . ":" . $auth_params["nonce"] . ":" . md5($a2));

// Проверяем ответ.
if ($resp == $auth_params["response"])
{
//
Проверяем актуальность одноразового параметра
$fn = $fileprefix . $auth_params["nonce"];
if (@file_get_contents($fn) == $_SERVER["REMOTE_ADDR"])
{
unlink($fn); //
Больше этот параметр неактуален
$auth_success = TRUE; //
Аутентификация пройдена
} else
{
// Одноразовый параметр неактуален
$stale = ", stale=true";
}
}
}

if ($auth_success)
{
print("Digest auth test

print("Successfully authenticated\n");
var_dump($auth_params);

print("");

} else
{
file_put_contents($fileprefix . $nonce, $_SERVER["REMOTE_ADDR"]);

$proto = $_SERVER["SERVER_PROTOCOL"];
Header("$proto 401 Not Authorized");
Header("WWW-Authenticate: Digest realm=\"$realm\", nonce=\"$nonce\"$stale");

print("Digest auth test

");
print("You must authenticate with Digest method");
print("
");
}

Прохождение Digest Auth при известном H(A1)

Покажу на примере, как проходить проверку, если пароль неизвестен,
но известен H(A1). Для этого, как уже было сказано, понадобится
AccessDriver. Расчеты хешей я буду делать вызывая из командной строки
PHP CLI. Защищенная страница пусть находится по адресу
http://mrblack.local/auth1.php, а хеш H(A1) равен "a8fb5b2d780a7bf0782207a51a013f04".

Открываем AccessDriver->Tools->HTTP Debugger и вбиваем адрес
"http://mrblack.local/auth1.php". Жмем "Connect". Получаем:

HTTP Header = HTTP/1.1 401 Authorization Required
HTTP Header = Date: Mon, 04 Jul 2005 08:09:17 GMT
HTTP Header = Server: Apache/1.3.31 (Win32) PHP/5.0.2
HTTP Header = X-Powered-By: PHP/5.0.2
HTTP Header = WWW-Authenticate: Digest realm="secure area", nonce="5925bea78552224abda11bfe318a8a03"
HTTP Header = Connection: close
HTTP Header = Content-Type: text/html

Открываем консоль, переходим в папку с PHP и вбиваем такую команду:

php -r "print md5("a8fb5b2d780a7bf0782207a51a013f04:
: ".md5("GET:http://mrblack.local/auth1.php"));"

Получаем искомый Digest-ответ: c6d0af0db239d75c
3f59640a4896d096
Теперь в AccessDriver ставим галочку "Header Data", копируем в появившееся
поле заголовки, которые были посланы в прошлом запросе, и дописываем к ним
Authorization. Вот что получается:

GET http://mrblack.local/auth1.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Accept-Language: en-us,en;q=0.5
User-Agent: Mozilla compatible
Host: mrblack.local
Pragma: no-cache
Authorization: Digest username="mrblack", realm="secure area", nonce="5925bea78552224ab
da11bfe318a8a03", uri="http://mrblack.local/auth1.php", response="c6d0af0db239d75c3f59
640a4896d096"

Жмем "Connect". Получаем результат: