|
Модераторы: Snowy, Poseidon, MetalFan |
|
||
|
Brausman |
|
||||||||||||||||||||||||||||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
Начнем по порядку, так как я пишу свою первую статью, не бейте сильно за нее.
В данной статье буду рассмотрены вопросы : -Авторизации на любом из сайтов(http и https с подтвержденными сертификатами), через ввод логин/пароля в браузере, 2 способами; -Аутентификация, программное подставление сертификата в запрос к серверу,если он его требует,ручная аутентификация с помощью браузера показана ниже. -Аутентификация с авторизацией,через системное окно авторизации windows , которое показано ниже 1. Начнем с теории, ниже буду приведены ссылки на ресурсы, по которым не сведущий в WinInet человек сможет разобраться, в его основах: http://www.delphisources.ru/pages/faq/base..._functions.html - данная статья рассказывает об основных функция Win 32 API для работы с интернетом http://kodu.neti.ee/~juri4/vfpplus/inet_11_ru.htm - данная статья предназначена для программистов под VisualFox Pro, но полезности ее не умоляет, в ней описаны все возможные флаги для WIn 32 API функций работы с интернетом описанных ссылкой выше http://programmersforum.ru/showthread.php?t=38803 - в данной статье рассказано как анализировать html-код страницы перед написанием запроса авторизации. Данного материала вам хватит для понятия сути описанной ниже статьи, также по ходу описания автор будет давать пояснения, в тех местах где по его мнению они нужны, чтобы конечный но не опытный читатель мог все спокойно понять. Автор предупреждает, что не будет вступать в споры по поводу оптимизации кода, данная статья не про это 2. И так нам понадобится CodeGear Rad Studio 2009 и сниффер(программа для отслеживания запросов/ответов между клиентом и сервером) HTTP Analyzer. Сначало опишем нужные нам функции, которые потом буду использоваться для наших нужд. а) В функцию
для http://www.delphisources.ru/pages/faq/base/inet_win32_api_functions.html имя сервера будет www.delphisources.ru,следовательно из полного url нам нужно его вытащить, для этого предназначена простенькая функция:
б) Идем дальше)), в функцию
http://www.delphisources.ru/pages/faq/base/inet_win32_api_functions.html скрипт будет pages/faq/base/inet_win32_api_functions.html ,для его вытаскивания служит следующая функция :
в) Теперь напишем функцию, которая в зависимости от протокола безопасности (http или https), будет возвращать нам нужные флаги для последующей их подстановки в
Какой флаг, что означает вы узнаете перейдя по данной мной выше ссылки. г) Так как нам ответ от сервера будет приходить в виде данных, то мы должны знать скольза за один раз передается нам данных от сервера, для этого служит следующая функция:
Основные вспомогательные функции даны, теперь перейдем непосредственно к описанию авторизаций и аутентифиукации, но сначало расскажу об особенностях работы в сниффере. После запуска на отлавливание запросов/ответов, он будет фиксировать всю вашу активность в сети, т.е. работу вашего браузера,аси,торрент-трекера. Внизу имеются вкладки, нам интересны: -Header - двойное окно показывающая запрос от программы(например браузера IE) - слева и ответ сервера - справа; -Response Content - html-текст который возвращает нам сервер на наш запрос; -Post Data - отображает данные передаваемые наше программой при вызове метода Post(в данном виде передается подавляющее число логин/паролей и сопутствующей информации при авторизации через браузер); -Query String- отображает альтернативный(методу Post Data) метод передачи данных об авторизации, через окно браузера; -Raw Stream - окно паказывающая полный запрос программы к серверу, полезен при отладке. Теперь переходим к авторизации и аутентификации. 3. Авторизация на сайтах методом добавления в url , списка данных необходимых для авторизации, данный способ применим на подавляющем кол-ве серверов, исключения не сертифицированные https серверы, ну и еще какие-нибудь :P. Добавление происходит,через специальный разделитель - ? добавляемый в конец нашего url, если он уже там есть, мы ни чего не добавляем. В данном примере мы будем авторизовываться на сайте "в контакте", так как я находил в интернете не один пост на счет етого. Теперь добавим разделитель и наш url будет выглядеть так: http://vkontakte.ru/login.php? Теперь после разделителя нужно добавить данные для авторизации, для этого я зарегистрировался на сайте, вот параметры:
Но, что же подставлять, какие данные, в стать приведенной выше описывался метод, как узнать что передается, но у нас же есть сниффер предоставим все ему. Для этого в форме регистрации на сайте в контакте вбейте приведенные выше данные и нажмите "вход" В сниффере сразу отобразятся все запросы/ответы межу серваком и браузером. В столбце Method - написан метод запроса к серверу(в данном примере Post), значит будем использовать его, потом url к которому пошел запрос(наш http://vkontakte.ru/login.php?), так как метод был Post, то все данные передаваемые с запросом находятся во вкладке Post Data, но перейдя на нее мы ни чего не увидим.Почему? Все дело в том что данные передаются по url обозначенному в методе action если разбирать html-код страницы, ну тогда глянем, и вот что мы имеем:
Следовательно данные передавались с ним, нажав на данный url и перейдя во вкладку Post Data, мы увидим нужные нам данные которые пересылаются вместе с запросом, теперьо нажимаем правой кнопкой мыши на один из параметров и в сплявающем меню нажмем "View Row Data", откроется блокнот с представленными нам в нужном виде данными, они выглядят так:
Теперь добавляем,это просто в конец нашего первоначально url(по хорошему метод передачи и url запроса смотрится в коде страницы), но мы будем переходить по http://vkontakte.ru/login.php, а не описанному в action="http://login.vk.com/", просто потому, что и так проходит авторизация, но правильно брать url из action. И финальный вид нашего url будет:
Теперь напишу функцию которая авторизуется по данному url с данными:
Здесь мы получаем html-код страницы,если мы авторизовались, FHost - имя сервера;fScript - скрипт выполняемый при подключении(т.е. переход на страницу пользователяесли передаваеммые данные верня). Данные метод действует и для http и для htpps. 4. авторизация 2 методом, когда серверы требуют передавать данные авторизации не через конец url, а через "Post Data"- опции запроса. Вид представления жанных тот же ,что и в предыдущем примере:
Но теперь мы их будем передавать через опции запроса
также отдельно стои сказать что вы должны передать в виде системной опции через туже функцию размер строки данных, она будет выглядить так:
где 'Content-Length:'+ inttostr(length(param)) - и есть описание размерности строки. А сами параметры передаются через
ГЛАВНОЕ ЧТО НЕ ЗАБУДЬТЕ ПЕРЕМЕННАЯ PARAM ДОЛЖНА БЫТЬ ТИПА ANSISTRING ИЛИ utf8STRING, ТАК КАК HttpSendRequest - ПЕРЕДАЕТ PAnsiChar - из-за чего будут проблемы с кодировкой если использовать обычную string, так по крайней мере в Delphi 2009. Привожу весь листинг функции авторизации :
Это сообщение отредактировал(а) THandle - 25.10.2009, 11:04 |
||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||
Brausman |
|
||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
5. Теперь давайте чучуть отклонимся от темы и рассмотрим такой пример, что после авторизации, редирект(перенаправление) не происходит, это случется в основном если приходит к нам скрипт и внутри него ссылка куда переходить, по такому методу идет авторизация на yahoo.com.
Вот логин и пароль для тестирования: Логин: [email protected] Пароль : 1234567 Делаем, что и в предыдущем примере, сначала через браузер, потом исследуем все в сниффере, мы будем передавать данные как и в первом случае через дописывания в url. Привожу листинг функции:
Теперь поясняю после запроса метода POST, мы получает ответ от сервера в виде:
Так как мы не указывали в параметрах запроса что мы из России:
То нам вернули ссылку на англоязычный сервис
Примечание: У серверов с не подтвержденным сертификатом(когда браузер ругается и предлогает не заходить на данный сервер), имеется проблема, если не получается к нему присоединится 12003 - ошибка, то есть два выхода: 1) У некоторых серверов есть семитричные url, только на обычном http, т.е. можно по тупому взять и вместо https//:блаблабла написать http//: и авторизоваться через него(у моего провайдера нета так у меня и получилось) 2)И более верный просто вместо имени подставиь IP сервера,его можно узнать когда сделаете запрос через браузер к этому серверу и в сниффере на вкладке "Raw Stream" - над текстом будет его IP. 6. Ну и наконец мы подошли до аутетификации я решил взять и совместить 2 и 3 вопос статьи, так как отличий я не вижу, а коментарии дам одни. Щас разберем пример, когда сервер по https(хотя без разницы http или https), требует сертификат и также авторизацию через системное окно Windows и к тому сертификат не проверенный(это бывает когда создатели сертификата не хотят платить Microsoft за то чтоб он зарегистрировал их сертификат в базе данных сертификатов Microsoft). К сожалению тестовый пример я дать не могу так как это конфиденциальная информация предприятия, так что поверьте мне наслово:P. Как говорилось выше в примечании, будем использовать IP а не имя из url'а. Теперь всьтает вопрос как программно добавить сертификат в запрос, для этого надо получить указатель на него в хранилище сертификатов вашего комп. И вот как это делается. Вы не сможите найти сертификат нужный вам без его идентификационного имени в хранилище сертификатов( по буржуйски Subject),для этого я прилогаю к статье небольшой проект который в тексстовом формате может выводит все сертификаты которые имеются в хранилищах сертификатов вашего компа.Я сказал хранилищах? Да я не оговорился их не 1, а 3, а с помощью нас программистов их может быть 4, и у них есть свои уникальные названия : //MY - для хранения сертификатов отдельного пользователя //СА - от Certification Authority - для хранения сертификатов центров сертификации //ROOT - для хранения корневых сертификатов //А также тан называемое хранилище колекции сертификатов создаваемое исключительно программистом под себя, как назовете так и будет. Теперь вам необходимо подключить к проекту .pas - файл для работы с сертификатами - wcrypt2.pas, я его также приложил к статье отдельно, стоит упомянуть, что он не до конца доработат, многих констант ошибок и некоторых функций для работы с сертификатами там попросту нет, что мне надо было я дописал, так что я предупредил. Также отмечу, что пока вы не авторизуетесь на сервере через браузер, сертификат не добавится не в одно из хранилищ и вы его попросту не найдете, а метод через путь до сертификата на компе, когда он лежит файлом я рассматривать не буду. По умолчанию данные сертификаты добавляются в MY хранилище Теперь приведу функцию для получения указателя на нужный нам сертификат:
В коментариях все написано, так что пояснять ни чего не буду. Ну а теперь когда мы получили указатель на сертификать можно аутентифицироваться, в опции к запросу добавляется сертификат и передается запросом.А авторизация системного окна проходит путем, подставления логин/пароля в InternetConnect:
Ну а теперь привожу листинк функции полностью :
Код пояснять не буду, так как в коментариях и описании выше все становится ясно. В конце хочу отметить, что если возвращается код в виде абрыкадабры, то это означает что у сервера ответ в виде кодировки UTF8, смените AnsiString->UTF8string или обратно. Надеюсь данная статья вам поможет, думаю мое полутора недельное исследование данного вопроса вам поможет,а мне репутацию увеличит Спасибо всем кто меня слушал, с уважением Анатолий "Anatol_rus" Федоров Это сообщение отредактировал(а) Brausman - 23.10.2009, 00:02 Присоединённый файл ( Кол-во скачиваний: 46 ) Find_Sertificat_and_wcrypt2_pas_file.rar 225,59 Kb |
||||||||||||||
|
|||||||||||||||
Brausman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
Также прикрепляю проект на Delphi 2009 и надеюсь, что данную статью прикрепят.
Это сообщение отредактировал(а) Brausman - 22.10.2009, 20:00 Присоединённый файл ( Кол-во скачиваний: 65 ) Autorization_from_EGRUL.rar 341,41 Kb |
|||
|
||||
darkmamba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 98 Регистрация: 16.10.2008 Репутация: 1 Всего: 1 |
Статья хорошая, НО хотелось бы побольше информации по авторизации в окне виндоус... у меня стоит Д7 скачал компонент v1.5 а там функции InternetConnect() нету =) подскажите где найти компонент для Д7, д2009 не предлагать
|
|||
|
||||
Brausman |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
InternetConnect - это стандартная Win 32 API функция, просто подключите
И все будет. По поводу системного окна описано в пункте 6 моей статьи, вот цитирую:
|
||||||
|
|||||||
darkmamba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 98 Регистрация: 16.10.2008 Репутация: 1 Всего: 1 |
Все понял но вылетают эти ошибки при InternetOpen и InternetConnect 00CC0008 и 00CC0004
а вот код
|
|||
|
||||
Brausman |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
А Запрос то к серверу кто будет делать? он делается функциями httpSendRequest То что вы привели, вы просто назначали имя интернет сессии с которой сервер будет общаться и назвали имя сервера больше ни чего
В статье же все написано и ссылки хорошие доны на объяснение функций, а если ошиблки не понятные лезут пользуйтесь функцией GetLastError; method - то GET или Post, в зависимости от того что вы делаете fScript - куда вы переходите по серверу Flags_Request - флаги которые вы задали для данного запроса к серверу Это сообщение отредактировал(а) Brausman - 25.10.2009, 01:00 |
||||||
|
|||||||
MetalFan |
|
|||
Аццкий Сотона Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
спасибо. кое с чем не сталкивался (с сертификатами). хотя тут все рассмотрено поверхностно и в итоге я все равно толком не понял что почему и как (касательно сертификатов).
тем не менее - ужасное оформление кода (он просто местами не читаем) и приемы программирования (goto...буэээ, ненужное дублирование кода). в общем использовать части приведенного кода в своих проектах общественности крайне не рекомендую. очень страдает грамматика. у автора нет хотя бы ворда, чтобы текст статьи подкорректировать? а в целом, если причесать, то весьма познавательно для тех, кто с этой темой сталкивается впервые. Это сообщение отредактировал(а) MetalFan - 25.10.2009, 12:42 -------------------- There are always someone smarter than you... |
|||
|
||||
darkmamba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 98 Регистрация: 16.10.2008 Репутация: 1 Всего: 1 |
Вобщем я запутался, помогите разгрести кучу.
Вылазят какието ошибки, природу понять немогу. Вроде все делаю так как написано, а не работает хз почему. Update Непонятным образом ошибка 12150 испарилась!!! 122 попрежнему вылетает но видимо не фатально, но разобратся бы хотелось всеравно! Шас вылазит типа HTTPProtocolException 403 Forbiden или по-русски нет доступа, через браузер вылазит 401 Необходима авторизация... тупик... может какой флаг надо поставить ??? Это сообщение отредактировал(а) darkmamba - 25.10.2009, 19:43 |
|||
|
||||
Brausman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
Спасибо за критику учту, но давайте по порядку: 1. На счет сертификатов, в статье написано, что прилагается программка моя через ,которую можно узнать Subject, своего сертификата, потом это полное subject, подставляешь в мою функцию FindCertificate, и далее указатель передаешь в InternetSetOption, вот в принципе и все и ни чего сложного 2. На счет грамматике русской - ет да признаю она у меня плоха, но какое оно имеет отношение к статье? 3. Я писал что код не претендует на оптимальность, нро все же объясните почему вам так не нравится переход goto,там ни какого дубляжа нет, так как в любом случае надо вызывать функцию HttpSendRequest? 4. В чем проявляется плохая читаемость кода?? Если не сложно приведите ссылку или напишите фрагмент хорошо читаемого кода. 5. Ну и скажите что причесывать, чтоб можно было привести статью к завершенному виду, так как опыта в написании статей у меня не было. Это конечно начался флуд но все равно, интересно узнать на мои вопросы ответы. |
|||
|
||||
darkmamba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 98 Регистрация: 16.10.2008 Репутация: 1 Всего: 1 |
Ура, запрос отправился нормальный!!!! Относительно! Неотправляются пароль и логин в базе64....
Странно, но почемуто отправляется 2 запроса сразу, в 1ом нету логина и пароля во втором есть, это че прикол такой ? Это сообщение отредактировал(а) darkmamba - 25.10.2009, 20:13 |
|||
|
||||
Brausman |
|
||||||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
1.Обратите внимание что передается в HttpSendRequest вместо:
надо
Это на первый взгляд,что я увидел И еще вот ссылка на все ошибки winineta - http://support.microsoft.com/kb/193625 там ясно сказано,что передаваемый заголовок не может быть обнаружен 2.hRequest := HttpOpenRequest(hConnect, 0,pchar('www.l2r.ru/admin'),HTTP_VERSION, 0, 0, 1, 1); - Здесь вылазит 122 если я правильно понимаю, то www.l2r.ru - это имя сервера, а в HttpOpenRequest передается не имя сервера, а скрипт который должен выполнится на нем, т.е. admin, потом после HTTP_VERSION должны идти не 0 , а nil , после nil(первая 1 - там должны стоять флаги запроса к серверу), в статье, это все подробным образом описано, про флаги
Где Flags_Request и подставляется в HttpOpenRequest, и в конечном виде она будет такой:
и про скрипты:
3.
а надо так
прежде чем задавать вопрос, посмотрите статью и только после того как не найдете там ответа на свой вопрос, пишите его здесь. Это сообщение отредактировал(а) Brausman - 25.10.2009, 20:18 |
||||||||||||||||||
|
|||||||||||||||||||
darkmamba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 98 Регистрация: 16.10.2008 Репутация: 1 Всего: 1 |
На самом деле это абсолютно рабочий код, можете поверить или проверить(просто я неуспел обновить еще тот пост)! Одно НО отправляется 2 запроса с разницей в доли секунды, это не есть хорошо.... пока что незнаю почему можете присоединится!
По поводу NIL , делфи конвертирует 0 в NILы где надо.....
Это сообщение отредактировал(а) darkmamba - 25.10.2009, 20:28 |
|||
|
||||
MetalFan |
|
|||
Аццкий Сотона Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
darkmamba, может стоить создать отдельную тему по своим повросам? твои эксперименты, имхо, хоть со статьей и связаны, но не являются ни ее обсуждением, ни продолжением.
-------------------- There are always someone smarter than you... |
|||
|
||||
MetalFan |
|
||||||||||
Аццкий Сотона Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
goto усложняет восприятие кода, запутывает его. лично я против использования этого атавизма. но не будем затевать здесь холивар) дубляж. в функции FindCertificate два практически одинаковых блока с exit'ами. мелочь, но на глаза попалась. так же нет ни одного блока try..finally...
бросилось в глаза, что тело цикла repeat..until написано без отступа... ну и таких мелких ляпов можно набрать еще несколько штук. я не претендую на идеального оформителя кода, но можешь посмотреть пример моего компонента-обертки над WinInet.
прогони текст статьи через ворд. хоть грамматику чуть поправишь) ну и код переписать в более удобоваримый вид. имхо. а вообще все конечно на твое усмотрение. кому надо, и так разберутся) з.ы. ну и можно я думаю на "ты". мы же с вами культурные люди) -------------------- There are always someone smarter than you... |
||||||||||
|
|||||||||||
Правила форума "Delphi: Сети" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |