» Общие принципы авторизации на удаленных сайтах Borland Delphi. Программирование сетей. . Блог программистов


Блог программистов






200923 Мар

Общие принципы авторизации на удаленных сайтах

Итак, у нас стоит задача при работе своей программы авторизоваться на неком удаленном сайте. Для простейшего примера я взял портал mail.ru
Зарегистрировал там пользователя programmers с паролем 1234
Итак, сначала немного теории: Авторизация на любом сайте происходит путем заполнения формы и отправки её данных некому удаленному крипту методом POST. На самом деле после того как вы заполнили формы и нажали на кнопку, данные отправятся в виде простой строки, содержащей все параметры и их значения разделенные разделителем.
Все формы на страницах описываются тегом <form> имеющим достаточное кол-во параметров, приведу самые нужные для нас:

Параметр method

Значение параметра method не зависит от регистра. Различают два метода — GET и POST. Существуют и другие методы, но они пока мало используются.
GET
Этот метод является одним из самых распространенных и предназначен для получения требуемой информации и передачи данных в адресной строке. Пары «имя=значение» присоединяются в этом случае к адресу после вопросительного знака и разделяются между собой амперсандом (символ &). Удобство использования метода GET заключается в том, что адрес со всеми параметрами можно использовать неоднократно, сохранив его, например, в «Избранное» браузера, а также менять значения параметров прямо в адресной строке.
POST
Метод POST посылает на сервер данные в запросе браузера. Это позволяет отправлять большее количество данных, чем доступно методу GET, поскольку у него установлено ограничение в 4 Кб. Большие объемы данных используются в форумах, почтовых службах, заполнении базы данных и т.д.

Параметр Action

Указывает обработчик, к которому обращаются данные формы при их отправке на сервер. В качестве обработчика может выступать CGI-программа или HTML-документ, который включает в себя серверные сценарии (например, Parser). После выполнения обработчиком действий по работе с данными формы он возвращает новый HTML-документ.

Если параметр action отсутствует, текущая страница перезагружается, возвращая все элементы формы к их значениям по умолчанию.

(Описания параметров предоставлены сайтом htmlbook.ru)

Итак, заходим на сайт Mail.ru и смотрим исходный код страницы.
Ищем тег «<form» Разумеется, на странице может быть множество форм, но необходимая нам достаточно интуитивно понятно находится:
<form name=»Auth» method=»post» action=»http://win.mail.ru/cgi-bin/auth»>

Далее ищем закрывающий тег формы </form> и копируем себе в блокнот все содержимое формы для его тщательного рассмотрения.
Итак, вот мы получили форму:

<form name="Auth" method="post" action="http://win.mail.ru/cgi-bin/auth">
<img src="/mail/ru/images/log_bms.gif" width="226" height="18" usemap="#logbms" alt="" /><br />
<map name="logbms" id="logbmsid"><area shape="rect" coords="109,1,220,18"
href="http://agent.mail.ru" alt="Агент"></area><area shape="default" nohref="nohref" alt=""></area></map><table class="authorization">
<tr>
<td colspan="2" class="registration">
<a href="http://win.mail.ru/cgi-bin/signup" class="left">Регистрация&nbsp;в&nbsp;почте</a>
<a
href="http://r.mail.ru/cln2840/www.mail.ru/pages/help/index.html"><img src="/mail/ru/images/helpm.gif"
width="14" height="14" alt="" class="right" /></a>
</td>
</tr>
<tr>
<td class="title1">Имя</td>
<td class="mail"><table><tr>
<td class="login"><input type="text" class="long" size="10" name="Login" tabindex="1" value="programmers" /><div>&nbsp;</div></td>
<td class="domain"><select size="1" name="Domain" class="long" tabindex="2">
<option value="mail.ru"
selected="selected">@mail.ru</option><option value="inbox.ru"
>@inbox.ru</option><option value="bk.ru"
>@bk.ru</option><option value="list.ru"
>@list.ru</option>
</select><div>&nbsp;</div></td>
</tr></table></td>
</tr>
<tr>
<td class="title2">Пароль</td>
<td class="pswd"><table><tr>
<td><input type="password" class="long" size="15" name="Password" tabindex="3"
value="" /></td>
<td class="forget"><div><a href="http://win.mail.ru/cgi-bin/passremind">Забыли?</a></div></td>
</tr></table></td>
</tr>
<tr>
<td class="title3"> </td>
<td class="button"><table><tr>
<td class="check"><input type="checkbox" id="alien" name="level" value="1" tabindex="4" class="check" /></td>
<td class="bad"><label for="alien">Чужой компьютер</label></td>
<td class="submit"><input type="submit" value="Войти" tabindex="5" class="submit" /></td>
</tr></table></td>
</tr>
</table>
</form>

На сервер могут отправится только значения элементов формы, которым относятся:
Тег input который отвечает за ввод информации и может принимать множество видов и вариантов. Вплоть до выбора файла, но об этом уже в следующих темах.
Внимание, ВСЕ теги Input лучше заполнять перед отправкой, поэтому обращайте внимание на теги Input с параметром type, имеющим тип type=»hidden». Более конкретно о них я расскажу в конце.
Тег <select> отвечает за выбор элемента из фиксированного списка. Внутри тега <select> должны присутствовать теги <option> каждый из которых описывает один из параметров списка. Выбранный элемент списка отображается свойством selected тега option но для нас это малоинтересно, нам гораздо интересней параметр value тега option, который отражает именно тот текст, который будет отправлен на сервер при выборе этого элемента.
Ну вот собственно и все, теперь соберем всю необходимую нам информацию воедино:
Адрес, на который мы должны отправить запрос, чтобы авторизоваться мы берем из параметра action тега <form>

http://win.mail.ru/cgi-bin/auth

Метод отправки запроса выбираем из параметра method тега <form>

method="post"

Далее выбираем все необходимые нам поля:

<input type="text" class="long" size="10" name="Login" tabindex="1" value="" />
<select size="1" name="Domain" class="long" tabindex="2">
<option value="mail.ru"
selected="selected">@mail.ru</option><option value="inbox.ru"
>@inbox.ru</option><option value="bk.ru"
>@bk.ru</option><option value="list.ru"
>@list.ru</option>
</select>
<input type="password" class="long" size="15" name="Password" tabindex="3"
value="" />

Вот и все что нам понадобится.
Теперь перейдем к Delphi.
Создадим новый проект. «Бросим» на форму компонент IdHTTP из вкладки Indy Clients и кнопку.
теперь настроим наш компонент IdHTTP.
Поставим параметр AllowCookies в True (оговорюсь сразу: это на всякий случай, ибо далеко не всегда после авторизации и во время её задействованы cookies)
Выставим параметр HandleRedirects в True (вы можете и оставить этот параметр в False, но в этом случае рискуете после авторизации получить сообщение о просто успешном выполнении запроса, которое совершенно не говорит об успешности авторизации, либо о том, что был обнаружен redirect) Этот параметр позволяет IdHTTP в случае получения директивы http redirect следовать этому перенаправлению. Дело в том, что в большинстве случаев скрипты, которые авторизую пользователя, после авторизации перенаправляют его на некую страницу, поэтому нам гораздо интересней узнать именно её текст.
Собственно и все, больше никаких параметров нам не потребуется.
Теперь напишем обработчик нажатия на кнопку:

procedure TForm5.btn1Click(Sender: TObject);
var params,responseres:tstringlist;
begin
params:=TStringList.Create;
responseres:=TStringList.Create;
try
params.Add('Login=programmers');
params.Add('Domain=mail.ru');
params.Add('Password=1234');
responseres.Text:=http1.Post('http://win.mail.ru/cgi-bin/auth',params);
if Pos('logout',responseres.Text)>0 then
ShowMessage('Авторизовались!');
finally
params.free;
responseres.free;
end;
end;

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

params:=TStringList.Create;

и заполним его в соответствии со следующим правилом:
<параметр>=<значение>
Значение ни в какие кавычки заключать не надо.

params.Add('Login=programmers');
params.Add('Domain=mail.ru');
params.Add('Password=1234');

Обратите внимание, что мы присвоили параметру Domain значение mail.ru
так как именно этот текст стоял в значении параметра value нужного нам тега option:

<option value=»mail.ru»>@mail.ru</option>

Теперь отправим Post запрос (так как именно этот тип запроса используется в форме:

<form name=»Auth» method=»post»

) На адрес http://win.mail.ru/cgi-bin/auth так как именно он указан в качестве action формы:

<form name=»Auth» method=»post» action=»http://win.mail.ru/cgi-bin/auth»>

Результат выполнения нашего запроса мы сохраняем в свойстве text другого нашего списка строк. Итого в результате выполнения команды

responseres.Text:=http1.Post('http://win.mail.ru/cgi-bin/auth',params);

В переменной responseres мы получили весь исходный код страницы, которую нам вернул сервер после отправки формы. Для проверки корректности авторизации я воспользовался простым способом: на странице, которая отображается после авторизации присутствует кнопка выхода, которая именуется logout, вот её- то м и ищем в полученной нами странице. И, если она присутствует, то значит авторизация прошла успешно =)
К сообщению я прикрепил описанный проект
среда: Delphi 2009
Версия Indy: 10.2.5

Комментарии

  1. Дмитрий
    3 апреля, 2011 | 17:10

    Хммм весьма интересно! У меня работает только когда пароль в цифрах т.е если будет пароль с буквами он почемуто не авторизируется !

  2. 20 июня, 2011 | 08:23

    Благодарю, нужная информация. Как-раз только занялся программированием для web)

  3. 9 ноября, 2011 | 18:44

    Прикольно! А где же сама прога или исходники?

  4. SetBack
    27 января, 2012 | 19:57

    Может у меня с компом не все в поряде))
    А может я маил.ру взломал)
    Но какой логин и пароль я не ввожу всеровно пишет Авторизировалось)

  5. Roma
    16 мая, 2012 | 16:46

    А для чего эта программа? Чтоб mail взламывать? или чтоб програмно входить в почту?