![]() |
Модераторы: 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 ) ![]() |
||||||||||||||
|
|||||||||||||||
Brausman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
Также прикрепляю проект на Delphi 2009 и надеюсь, что данную статью прикрепят.
Это сообщение отредактировал(а) Brausman - 22.10.2009, 20:00 Присоединённый файл ( Кол-во скачиваний: 65 ) ![]() |
|||
|
||||
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... |
||||||||||
|
|||||||||||
Brausman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
В целом нарекания понятны, твою обертку над wininet видел,сделано не дурно, нет try ...finally.. так как делал просто примеры, без учета обработки всякого рода глюков.
На счет "своего" сертификата, это когда(я кстати с этим сам встретился 1 раз) тебе, например налоговая дает на руки индивидуальный сертификат для доступа в их базу данных по налогоплательщикам(ет из практики),сервер каждую сессию обращается к тебе сначала за подтверждением сертификата, а уж потом за логином/паролем, этот сертификат как раз через IE(или другой браузер) добавляется в хранилище "MY" сертификатов откуда я его и использую, по данной теме инфы в интернете вообще не нашел, так что посчитал правильным добавить его в статью. Ну а статью на недели когда время будет поправлю. |
|||
|
||||
Brausman |
|
||||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
darkmamba, как можно быть таким не внимательным или вы статью не читали?????
Скрип передается без "/" ,если у вас www.l2r.ru/admin, то скрипт будет admin, без "/"!!!
И проверьте метод передачи, я вижу у вас метод "GET", там точно этот метод?? Это сообщение отредактировал(а) Brausman - 25.10.2009, 23:59 |
||||
|
|||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
Brausman, спасибо, про "свой" сертификат прояснилось) ни разу сам с таким не сталкивался, теперь буду знать. хотя эту тему можно осветить вообще отдельно.
в любом случае ты молодец, что решился написать такую полезную статью! после небольшого "причесывания" цены ей не будет) с почином, так держать! -------------------- There are always someone smarter than you... |
|||
|
||||
Brausman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
Спасибо, в принципе можно написать статью, как делать/регистрировать в хранилищах/использовать свои сертификаты тоже, хотя думаю такая статья отклика в массах не получит ![]() |
|||
|
||||
darkmamba |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 16.10.2008 Репутация: 1 Всего: 1 |
метод GET, по дефолту выставляется если поставить 0 (mdsn). В общем все работает, только отправляется по 2 запроса (одинаковых), только первый без аутенфикации (без пароля и логина), они приходят во втором с разницей в доли секунды.. т.е сразу же на ответ от сервера как я понимаю... почему не сразу - хз.
Можно сказать, что проблему решил, используя собственые хедеры, в которых сам кодирую пароль и логин в базе64, только вот есть ли разница между MTIzNDU2OjY1NDMyMQ== и MTIzNDU2OjY1NDMyMQ (это 123456:654321)? При раскодировке нету ![]() Это сообщение отредактировал(а) darkmamba - 26.10.2009, 19:14 |
||||||||
|
|||||||||
Brausman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 1.4.2009 Репутация: 2 Всего: 1 |
А что тут удивительного, если идет аутетификация то сервер ждет когда вы ему подсунете нужный сертификат(это первый GET), потом так как у нас включен редирект, он сразу (наш WinInet) посылает серверу запрос ответ авторизации(ваш закодированный логин/пароль) - это 2 GET.
А на счет пароля отсылаемые данные серверу должны быть идентичны. И зачем кодировать самому, если через InternetConnection, логин/пароль сами кодируются WinInet'ом. |
|||
|
||||
darkmamba |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 16.10.2008 Репутация: 1 Всего: 1 |
Чтобы не было лишнего запроса.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Сети" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |