Perl галимая авторизация

Discussion in 'PHP' started by SHiNiGaMi, 24 Jul 2011.

  1. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    Доброго времени суток. Пишу парсер для lockerz.com, тупо не могу авторизоваться. Код:
    PHP:
    use IO::Socket;

    $handle '[email protected]';
    $password 'coolPass';

    $sock IO::Socket::INET->new(PeerAddr => 'lockerz.com',
                                    
    PeerPort => 80,
                                    
    PeerProto => 'tcp',
                                    
    TimeOut => 10);

    print 
    $sock "GET / HTTP/1.0\r\n".
                  
    "Host: lockerz.com\r\n".
                  
    "Accept-encoding: */*\r\n".
                  
    "Accept: text/html\r\n".
                  
    "User-Agent: Mozilla/9.0\r\n".
                  
    "Connection: keep-alive\r\n\r\n";
                  
    sysread($sock ,$data1024576);
    $cookies getCookies($data);
    open(P'>data.html');
    print 
    P $data;
    close(P);

    $content 'handle='.$handle.'&password='.$password;

    print 
    $sock join("\r\n" => "POST /auth/login HTTP/1.1",
                               
    "Host: lockerz.com",
                               
    "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1",
                               
    "Content-type: application/x-www-form-urlencoded",
                               
    "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8",
                               
    "Accept-Encoding: gzip, deflate",
                               
    "Referer: http://lockerz.com/",
                               
    "Cookie: $cookies",
                               
    "Connection: Keep-Alive",
                               
    "Content-length: ".length($content),
                               
    "",
                               
    $content);

    sysread($sock$data1999999);

    open(P'>data1.html');
    print 
    P $data1;
    close(P);
                           
    sub getCookies
    {
        
    my $ans = @_[0];
        @
    answer = ( $ans =~ m/Set-Cookie: ([^;]+?);.+?\r\n/g);
        for 
    $cookie(@answer)
        {
            
    $cookies .= $cookie."; ";
        }
        return 
    $cookies;
    }
    Запросы прописал прям как в сниффере (только второй, т.к. первый работает норм). Должно возвращать 302, не возвращает абсолютно ничего. В чем может быть ошибка?

    если изменить код так (закрыть и пересоздать сокет):
    PHP:
    use IO::Socket;

    $handle '[email protected]'
    $password 'coolPass';

    $sock IO::Socket::INET->new(PeerAddr => 'lockerz.com',
                                    
    PeerPort => 80,
                                    
    PeerProto => 'tcp',
                                    
    TimeOut => 10);

    print 
    $sock "GET / HTTP/1.0\r\n".
                  
    "Host: lockerz.com\r\n".
                  
    "Accept-encoding: */*\r\n".
                  
    "Accept: text/html\r\n".
                  
    "User-Agent: Mozilla/9.0\r\n".
                  
    "Connection: keep-alive\r\n\r\n";
                  
    sysread($sock ,$data1024576);
    $cookies getCookies($data);
    open(P'>data.html');
    print 
    P $data;
    close(P);
    close($sock);

    $sock IO::Socket::INET->new(PeerAddr => 'lockerz.com',
                                    
    PeerPort => 80,
                                    
    PeerProto => 'tcp',
                                    
    TimeOut => 10);

    $content 'handle='.$handle.'&password='.$password;

    print 
    $sock join("\r\n" => "POST /auth/login HTTP/1.1",
                               
    "Host: lockerz.com",
                               
    "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1",
                               
    "Content-type: application/x-www-form-urlencoded",
                               
    "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8",
                               
    "Accept-Encoding: gzip, deflate",
                               
    "Referer: http://lockerz.com/",
                               
    "Cookie: $cookies",
                               
    "Connection: Keep-Alive",
                               
    "Content-length: ".length($content),
                               
    "",
                               
    $content);

    sysread($sock$data1999999);

    open(P'>data1.html');
    print 
    P $data1;
    close(P);
                               
    sub getCookies
    {
        
    my $ans = @_[0];
        @
    answer = ( $ans =~ m/Set-Cookie: ([^;]+?);.+?\r\n/g);
        for 
    $cookie(@answer)
        {
            
    $cookies .= $cookie."; ";
        }
        return 
    $cookies;
    }
    то возвращает
    Code:
    HTTP/1.1 200 OK
    
    Server: nginx
    
    Date: Sun, 24 Jul 2011 17:53:46 GMT
    
    Content-Type: text/html
    
    Transfer-Encoding: chunked
    
    Connection: keep-alive
    
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    
    Pragma: no-cache
    
    Content-Encoding: gzip
    
    
    
    202
    
    ‹
    
    увидел Content-encoding: gzip и сделал Compress::Zlib::memGunzip($data1);, но там пусто как в первом варианте. снова там же, откуда и начал

    В User-Agent я что только не писал, ему фиолетово
     
  2. red_joker

    red_joker New Member

    Joined:
    4 Nov 2010
    Messages:
    31
    Likes Received:
    3
    Reputations:
    0
    Из файербага в теле поста:
    PHP:
    handle=abc%40mail.com&password=123123
    у тебя отправляется запрос без url encode для мыла в handle.
    При неверных параметрах, либо неудачной авторизации он и возвращает пустой ответ - тоже из фаербага
    UPD: про твою "проверенную" функцию, копи-пейст as is:
    PHP:
    #!/usr/bin/perl
    sub getCookies
    {
        
    my $ans = @_[0];
        @
    answer = ( $ans =~ m/Set-Cookie: ([^;]+?);.+?rn/g);
        for 
    $cookie(@answer)
        {
            
    $cookies .= $cookie."; ";
        }
        return 
    $cookies;
    }

    my $coo "Set-Cookie: handle=abc%40mail.com; path=/; domain=.lockerz.com;";
    print 
    getCookies($coo);
    Вывод - пустой. Регексп m/Set-Cookie: ([^;]+?);.+?rn/g либо криво скопи-пейсчен, либо просто не работает (и не должен).
    ЗЫ код без strict - прошлый век.
     
    #2 red_joker, 24 Jul 2011
    Last edited: 24 Jul 2011
  3. dpe_x

    dpe_x Elder - Старейшина

    Joined:
    8 Sep 2010
    Messages:
    155
    Likes Received:
    35
    Reputations:
    14
    лвп , не ?
     
  4. emmy

    emmy Member

    Joined:
    12 Oct 2009
    Messages:
    76
    Likes Received:
    17
    Reputations:
    8
    конечно там задумывалось \r\n, но в любом случае неправильно потому что если дальше указана прошедшая дата куку надо удалять а не запоминать
    Code:
     my $ans = @_[0]; 
    сигла неправильная
    Code:
    GET / HTTP/1.0\r\n".
    "Host: lockerz.com\r\n". 
    В rfc 1945 для протокола HTTP 1.0 заголовок Host не предусмотрен
     
  5. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    red_joker я отправляю url-encode данные, просто для первого раза вписывал сразу encode. Функция не копи паст, просто в \r\n форум удалил "\"
    dpe_x Я сначала на LWP и делал,но он дал тот же результат
    emmy Да, действительно, спасибо. но проблема осталась
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    SHiNiGaMi В первом скрипте:
    1) исправить HTTP/1.0 на HTTP/1.1
    2) во второй запрос добавить тот же юзер-агент, что и в первом
    3) Keep-Alive пишется в нижнем регистре

    После этого заработает: пункт 1 - позволит получить куки из запроса, пункт 2 - позволит авторизоваться, пункт 3 - просто правильное использование протокола.
     
    _________________________
    1 person likes this.