Проблема, с https.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Tip.the.besT, 20 Aug 2011.

  1. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Пытаюсь авторизироваться на mail.ru. Вот код:
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
      IdServerIOHandler;
    
    type
      TForm1 = class(TForm)
        IdHTTP1: TIdHTTP;
        Button1: TButton;
        Memo1: TMemo;
        IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
    
    params,responseres:tstringlist;
    
    begin
    params:=TStringList.Create;
    responseres:=TStringList.Create;
    
    params.Add('Login=бла');
    params.Add('Domain=mail.ru');
    params.Add('Password=бла');
    memo1.Text:=idhttp1.Post('https://auth.mail.ru/cgi-bin/auth',params);
    
    if Pos('logout',memo1.Text)>0 then
    
      ShowMessage('ок!');
    params.free;
    responseres.free;
    end;
    end.
    
    

    Не могу, выдаёт ошибку при подключении IdSSLIOHandlerSocketOpenSSL, а его как я понимаю надо подключать полюбому, раз httpS, у меня.
    Может есть у кого нить уже готовые примеры, или просто подскажите пожалуйста.

    Ошибка: iohandler value is not valid.
    как будто IdSSLIOHandlerSocketOpenSSL вообще нет. В чём проблема? :confused:
     
  2. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Не вижу у тебя связки компонента TidHTTP и IdSSLIOHandlerSocketOpenSSL.

    Code:
    IdHTTP1.IOHandler:=TIdSSLIOHandlerSocketOpenSSL.Create;
    
     
  3. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Я его связал через events, там всё нормально.
     
  4. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    http://ioffe-soft.ru/pro/ssl.rar

    Положи эти 2 файла в папку с программой.
     
  5. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    По идее должно работать, вот тут решении подобной проблемы:
    Code:
    http://programmersforum.ru/showthread.php?t=61587
    Либо не хватает этих либ.

    libeay32.dll и ssleay32.dll

     
    #5 De-visible, 20 Aug 2011
    Last edited: 20 Aug 2011
  6. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    спасибо, после того как вы написали про библиотеки я до меня дошло, что надо было просто сохранить проект))Всё запрос не выдаёт ошибки. Но тут другая проблема образовалась в ответ на мой запрос выдаёт следующие:
    HTML:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><title>@MAIL.RU: авторизация</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <script language="JavaScript"><!--     window.location.replace("http://e.mail.ru/cgi-bin/msglist?back=1");  // --></script> <meta http-equiv="refresh" content="0;url=http://e.mail.ru/cgi-bin/msglist?back=1"> </head> <body></body> </html> 
    Вот полный код проги:
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
      IdServerIOHandler, IdCookieManager;
    
    type
      TForm1 = class(TForm)
        IdHTTP1: TIdHTTP;
        Button1: TButton;
        Memo1: TMemo;
        IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
        IdCookieManager1: TIdCookieManager;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
    
    params,responseres:tstringlist;
    
    begin
    
    params:=TStringList.Create;
    responseres:=TStringList.Create;
    
    params.Add('Login=1233');
    params.Add('Domain=mail.ru');
    params.Add('Password=123321Login=1233);
    params.Add('Domain=mail.ru');
    params.Add('Password=123321');
    
    memo1.Text:=idhttp1.Post('https://auth.mail.ru/cgi-bin/auth',params);
    
    if Pos('logout',memo1.Text)>0 then
    
      ShowMessage('Авторизовались!');
    
    params.free;
    responseres.free;
    
    
    end;
    
    
    end.
    Прикрутил куки, и поправил запрос, сделал всё так жу как в снифере. Но всё равно авторизироваться нормально не могу :eek:
     
  7. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    HTTP.REQUEST.USERAGENT существующий попробуй указать.
    С Мэйл.ру не работал, но недавно проблема в этом была с другим сайтом
     
  8. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Исходя из твоего кода, возникает вопрос...

    Что это?

    Code:
    params.Add('Login=1233');
    params.Add('Domain=mail.ru');
    params.Add('Password=123321Login=1233);
    params.Add('Domain=mail.ru');
    params.Add('Password=123321');
    Вот данные которые должны передаваться:

    Code:
    Login=MyLogin&Domain=mail.ru&Password=MyPass
    
    Login=MyLogin
    Domain=mail.ru
    Password=MyPass
    У тебя же передается два раза Domain, и два раза Password, один из которых подвергся слитию с логином, а первым из паролей у тебя передается как раз неверный
     
    #8 De-visible, 20 Aug 2011
    Last edited: 20 Aug 2011
  9. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Это я тупа со снифера снял запрос, я читал, то надо всего три значения передавать, но я подумал, что со снифа вернее будет.

    HTTP.REQUEST.USERAGENT
    Не помогло.
     
    #9 Tip.the.besT, 20 Aug 2011
    Last edited by a moderator: 22 Aug 2011
  10. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    сниффер шифрованное соединение иногда снифает неправильно. каждый параметр по 2 раза пишет
     
  11. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    может у кого просто есть пример работающей авторизации?
     
  12. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Решение.

    В общем пока курил, скачал дельфу, установил, скачал библиотеки, кинул в папку с прогой, вспомнил вообще куда тыкать что бы создать проект :D...

    К чему я это...

    Code:
    [COLOR=Green][B]Server: nginx/0.7.62
    Date: Sat, 19 Aug 2011 10:57:27 GMT
    Content-Type: text/html; charset=utf-8
    Connection: close
    P3P: CP="NON CUR OUR IND UNI INT"
    Set-Cookie: t=obLD1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAABABAHxgAAAAAAAAAAAAAAAIAAAAAAAAAAcA; expires=Thu, 16 Feb 2012 10:57:27 GMT; path=/; domain=.mail.ru
    Set-Cookie: Mpop=1313870247:7f74717a7f785b6f6a51e494a415900481658565c5d1a2190502190f1d081b0307044454cd5e465e050401010b1e087405:MyLogin@mail.ru:; expires=Fri, 18 Nov 2011 10:57:27 GMT; path=/; domain=.mail.ru
    Set-Cookie: mid=7cac716b; expires=Thu, 16 Feb 2012 10:57:27 GMT; path=/; domain=.mail.ru
    Set-Cookie: mrcu=943E4E50EDCD0100011A7052007F; expires=Tue, 17 Aug 2021 10:57:27 GMT; path=/; domain=.mail.ru
    Cache-Control: no-cache,no-store,must-revalidate
    Pragma: no-cache
    Expires: Fri, 20 Aug 2010 10:57:27 GMT
    Last-Modified: Sat, 19 Aug 2011 10:57:27 GMT
    Content-Length: 430
    X-Host: f97.mail.ru
    X-XSS-Protection: 0[/B][/COLOR]
    Это ответ сервера на удачный логин, я авторизовался.

    Вот код, который накидал я:
    Code:
    
    
    unit mail;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdTCPConnection, IdTCPClient, IdHTTP, IdCookieManager,
      IdBaseComponent, IdComponent, IdIOHandler, IdIOHandlerSocket,
      IdSSLOpenSSL, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
        IdCookieManager1: TIdCookieManager;
        IdHTTP1: TIdHTTP;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    
    var
       http       : TidHTTP;
       cook       : TidCookieManager;
       SSL        : TIdSSLIOHandlerSocket;
       send_data  : TStringList;
       StrPage    : string;
    
    begin
    
      try
        http                 := TIdHTTP.Create(Self);
        send_data            := TStringList.Create;
        cook                 := TidCookieManager.Create(http);
        SSL                  := TIdSSLIOHandlerSocket.Create(http);
        http.AllowCookies    := true;
        http.CookieManager   := cook;
        http.HandleRedirects := true;
        http.IOHandler       := SSL;
        SSL.SSLOptions.Method:= sslvTLSv1;
        Http.Request.Host:='auth.mail.ru';
        Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
        Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
        Http.Request.AcceptLanguage:='ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3';
        Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
        Http.Request.Referer:='http://www.mail.ru/';
    
        send_data.Add('Login=mylogin');
        send_data.Add('Domain=mail.ru');
        send_data.Add('Password=mypass');
    
        StrPage:= http.Post('https://auth.mail.ru/cgi-bin/auth',send_data);
        //Теперь в стрпэйдж твой ответ, либо смотрим заголовки     http.Response.RawHeaders.Text
      finally
        send_data.Free;
        cook.Free;
        http.Free;
      end;
    
    
    
    end;
    

    Я верю в тебя дружище, у тебя в любом случае должно получиться! удачи.


    ----

    p.s.

    http://zalil.ru/31583061 - Это на случай если твой дельфи покарают динозавры, исходники, экзешник, порнография - в общем все самое необходимое, также библиотеки для работы ссл.

     
    #12 De-visible, 21 Aug 2011
    Last edited: 21 Aug 2011
  13. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Я хз ка у тебя получилось, но у меня тот же результат.
    Я поправил несколько синтаксических ошибок и вот что вышло:
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
      IdServerIOHandler, IdCookieManager;
    
    type
      TForm1 = class(TForm)
        IdHTTP1: TIdHTTP;
        Button1: TButton;
        Memo1: TMemo;
        IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
        IdCookieManager1: TIdCookieManager;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
       http       : TidHTTP;
       cook       : TidCookieManager;
       SSL        : TIdSSLIOHandlerSocketOpenSSL;
       send_data  : TStringList;
       StrPage    : string;
    
    begin
    
      try
        http                 := TIdHTTP.Create(Self);
        send_data            := TStringList.Create;
        cook                 := TidCookieManager.Create(http);
        SSL                  := TIdSSLIOHandlerSocketOpenSSL.Create(http);
        http.AllowCookies    := true;
        http.CookieManager   := cook;
        http.HandleRedirects := true;
        http.IOHandler       := SSL;
        SSL.SSLOptions.Method:= sslvTLSv1;
        Http.Request.Host:='auth.mail.ru';
        Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
        Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
        Http.Request.AcceptLanguage:='ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3';
        Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
        Http.Request.Referer:='http://www.mail.ru/';
    
        send_data.Add('Login=123');
        send_data.Add('Domain=mail.ru');
        send_data.Add('Password=321');
    
        StrPage:= http.Post('https://auth.mail.ru/cgi-bin/auth',send_data);
        memo1.Text:=strpage;
        if pos('logout',memo1.Text)>0 then
        begin
        memo1.Clear;
        memo1.Lines.Add('есть контакт!');
        end;
        //Теперь в стрпэйдж твой ответ, либо смотрим заголовки    http.Response.RawHeaders.Text
      finally
        send_data.Free;
        cook.Free;
        http.Free;
      end;
    end;
    
    end.
    
    Вот ответ:
    HTML:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head><title>@MAIL.RU: авторизация</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <script language="JavaScript"><!--
        window.location.replace("http://e.mail.ru/cgi-bin/msglist?back=1"); 
    // --></script>
    <meta http-equiv="refresh" content="0;url=http://e.mail.ru/cgi-bin/msglist?back=1">
    </head>
    <body></body>
    </html>
    
    

    Если дабавляю вот эту строчку:
    Code:
        memo1.Text:= http.get('http://e.mail.ru/cgi-bin/msglist?back=1');
    то в ответе страница, но заветного logout на ней нет!
    (немогу вставить ответ он больно большой, не позволяет)


    Вообщем, нифига нет результата, или я, что то упустил?
     
  14. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    Ладно. :) Всё куда проще чем кажется. Не нужно никаких библиотек, https протоколв и прочий лабуды:).
    Всё делается одной строчкой :)
    http.Get('http://e.mail.ru/cgi-bin/enableuser?login='+login+'&domain='+domain+'&Password='+pass);
     
  15. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    только URLencode не забываем :)
     
  16. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    Ну да :)
    http.Get('http://e.mail.ru/cgi-bin/enableuser?login='+login+'&domain='+domain+'&Password='+utf8encode(pass)); :)
     
  17. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Сразу валишь на главную, гребешь кукисы, а потом уже лезишь авторизироваться... А и про реферер не забудь.
     
  18. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Код такой:
    Code:
    unit Unit2;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdTCPConnection, IdTCPClient, IdHTTP, IdComponent, IdIOHandler,
      IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdBaseComponent,
      IdCookieManager, StdCtrls;
    
    type
      TForm2 = class(TForm)
        IdCookieManager1: TIdCookieManager;
        IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
        IdHTTP1: TIdHTTP;
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form2: TForm2;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm2.Button1Click(Sender: TObject);
    var
       http       : TidHTTP;
       cook       : TidCookieManager;
       SSL        : TIdSSLIOHandlerSocketOpenSSL;
       send_data  : TStringList;
       StrPage    : string;
    
    begin
    
      try
        http                 := TIdHTTP.Create(Self);
        send_data            := TStringList.Create;
        cook                 := TidCookieManager.Create(http);
        SSL                  := TIdSSLIOHandlerSocketOpenSSL.Create(http);
        http.AllowCookies    := true;
        http.CookieManager   := cook;
        http.HandleRedirects := true;
        http.IOHandler       := SSL;
        SSL.SSLOptions.Method:= sslvTLSv1;
        Http.Request.Host:='auth.mail.ru';
        Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
        Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
        Http.Request.AcceptLanguage:='ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3';
        Http.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
        Http.Request.Referer:='http://www.mail.ru/';
    
       memo1.Text:= http.Get('http://e.mail.ru/cgi-bin/enableuser?login=123321111233&domain=mail.ru&Password=utf8encode(123321)');//не уверен в этой строке. Всё ли правильно?
      if pos('logout',memo1.Text)>0 then
      begin
        memo1.Clear;
        memo1.Lines.Add('ЕСТЬ!!!!');
      end;
      finally
    
      end;
    end;
    
    end.
    
    



    Вот скрин ответа:
    http://i042.radikal.ru/1108/3d/1322aba7a4a9.png

    Что опять не так?
     
    #18 Tip.the.besT, 21 Aug 2011
    Last edited by a moderator: 28 Aug 2011
  19. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66

    Вообще то ты авторизовался если чо так.
     
  20. zoke

    zoke Member

    Joined:
    5 Sep 2010
    Messages:
    90
    Likes Received:
    9
    Reputations:
    5
    Я авторизуюсь так
    http://win.mail.ru/cgi-bin/auth?Login=" + login + "&Password=" + pass + "&Domain=" + domen + "&level=1