Авторизация php на сокетах

Discussion in 'PHP' started by huntercs, 8 Mar 2012.

  1. huntercs

    huntercs New Member

    Joined:
    31 Jan 2012
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    Есть сайт на Джумле.Там форма с логином и паролем.Если зайти на главную страницу при помощи такого заголовка
    Code:
    "GET / HTTP/1.1
    Host:localhost
    Connection:Close
    
    "
    Вылезает заголовок Set-Cookie,я сохранил куку для дальнейших действий.Заголовок авторизации получился таким
    Code:
    "POST /component/comprofiler/login.html HTTP/1.1
    Host:localhost
    Cookie:e5a81fd897e2d1568bb859654f3d0504=s114vmn29bvfik2hjt4dqdegb4;path=/;
    Content-type:application/x-www-form-urlencoded
    Content-length:28
    Connection:Close
    
    username=admin&passwd=111111
    
    "
    На выходе получил Сессия истекла или в Вашем браузере отключены куки. Пожалуйста, обновите страницу, перед ее заполнением.Подскажите пож-та чем мои действия отличаются от пользовательских,на что Джумла ругается?Вот php класс
    Code:
    <?php
    
    
    class htmlweb {
     
        private $pweb;
        public $Cookie;
        public $Headers;
        public $Data;
        public $Hostname;
        public $Path;
    
    private function getData(){
    $line='';$counter=0;$oldsize=0;
    while(!feof($this->pweb,1024)){
    $oldsize=strlen($line);
    $line.=fread($this->pweb,1024); 
    if($oldsize==strlen($line)){$counter++;}else{$counter=0;};
    if($counter>10)break;
    };
    return $line;
    }
    
    public function GetMethod($path='/'){
    $hostname=$this->Hostname;
    $this->pweb=fsockopen($hostname,80);
    $headers="GET $path HTTP/1.1\r\n";
    $headers.="Host:$hostname\r\n";
    if(sizeof($this->Cookie)>0){
    $headers.="Cookie:";
    foreach($this->Cookie as $k=>$v){
    $headers.=$k."=".$v.";";};    
    $headers.="\r\n";
    };
    $headers.="Connection:Close\r\n\r\n";
    fwrite($this->pweb,$headers);
    $line=$this->getData();
    fclose($pweb);
    $rheaders=substr($line,0,strpos($line,"\r\n\r\n"));
    if((substr_count($rheaders,"text/html")>0)){
    $this->Data=substr($line,strpos($line,"<",strpos($line,"\r\n\r\n")));}else{
    $this->Data=substr($line,strpos($line,"\r\n\r\n")+4);
    }
    $this->Headers=explode("\r\n",$rheaders);
    $cookie="";
    for($i=0;$i<sizeof($this->Headers);$i++){
    if(substr_count($this->Headers[$i], "Set-Cookie")>0){
    $coo=trim(substr($this->Headers[$i],strpos($this->Headers[$i],":")+1));
    if((!empty($cookie))&&($cookie[strlen($cookie)-1]!=';')){$coo=";".$coo;};
    $cookie.=$coo;
    };
    };$coo1=array();
    if(!empty($cookie)){
    $cookie=explode(";",$cookie);
    $coo='';
    for($i=0;$i<sizeOf($cookie);$i++){    
    $coo= explode("=", $cookie[$i]);$coo[0]=trim($coo[0]);$coo[1]=trim($coo[1]);
    if($coo[0]!="expires"){
    $coo1[$coo[0]]=$coo[1];    
    };
    }
        
    };
    foreach($coo1 as $k=>$v){
    $this->Cookie[$k]=$v;    
    };
    
    }
    
    public function PostMethod($path="/",$param,$isfileload=false){
    $hostname=$this->Hostname;
    $this->pweb=fsockopen($hostname,80);
    $params='';
    foreach($param as $k=>$v){
    $params.="&$k=$v";    
    };
    $params=substr($params,1);
    $plength=strlen($params);
    $headers="POST $path HTTP/1.1\r\n";
    $headers.="Host:$hostname\r\n";
    if(sizeof($this->Cookie)>0){
    $headers.="Cookie:";
    foreach($this->Cookie as $k=>$v){
    $headers.=$k."=".$v.";";};    
    $headers.="\r\n";
    };
    $headers.="Content-type:application/x-www-form-urlencoded\r\n";
    $headers.="Content-length:$plength\r\n";
    $headers.="Connection:Close\r\n\r\n";
    $headers.="$params\r\n\r\n";
    fwrite($this->pweb,$headers);
    $line=$this->getData();
    fclose($this->pweb);
    $rheaders=substr($line,0,strpos($line,"\r\n\r\n"));
    if((substr_count($rheaders,"text/html")>0)){
    $data=substr($line,strpos($line,"<",strpos($line,"\r\n\r\n")));}else{
    $data=substr($line,strpos($line,"\r\n\r\n")+4);
    };
    
    
    
    $rheaders=substr($line,0,strpos($line,"\r\n\r\n"));
    if((substr_count($rheaders,"text/html")>0)){
    $this->Data=substr($line,strpos($line,"<",strpos($line,"\r\n\r\n")));}else{
    $this->Data=substr($line,strpos($line,"\r\n\r\n")+4);
    }
    $this->Headers=explode("\r\n",$rheaders);
    $cookie="";
    for($i=0;$i<sizeof($this->Headers);$i++){
    if(substr_count($this->Headers[$i], "Set-Cookie")>0){
    $coo=trim(substr($this->Headers[$i],strpos($this->Headers[$i],":")+1));
    if((!empty($cookie))&&($cookie[strlen($cookie)-1]!=';')){$coo=";".$coo;};
    $cookie.=$coo;
    };
    };$coo1=array();
    if(!empty($cookie)){
    $cookie=explode(";",$cookie);
    $coo='';
    for($i=0;$i<sizeOf($cookie);$i++){    
    $coo= explode("=", $cookie[$i]);$coo[0]=trim($coo[0]);$coo[1]=trim($coo[1]);
    if($coo[0]!="expires"){
    $coo1[$coo[0]]=$coo[1];    
    };
    }
        
    };
    foreach($coo1 as $k=>$v){
    $this->Cookie[$k]=$v;    
    };
    }
    
    public function __construct($hostname,$path="/"){
    $this->Hostname=$hostname;
    $this->Path=$path;
    $this->Cookie=array();
    }
    
    }
    ?>
    
     
  2. huntercs

    huntercs New Member

    Joined:
    31 Jan 2012
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    Таблица Sessions Джумлу включает
    Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2";s:
    Мб сессия привязана к Юзер-Агент?
    --------------------------------
    Скопировал Юзер Агент из фаербага-то же самое!
     
    #2 huntercs, 8 Mar 2012
    Last edited: 8 Mar 2012
  3. geograph

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

    Joined:
    19 Aug 2006
    Messages:
    49
    Likes Received:
    9
    Reputations:
    5
    Попробуй использовать класс Snoopy.class.php очень облегчает задачу, работает на сокетах, если нет curl'а на сервере.
     
  4. huntercs

    huntercs New Member

    Joined:
    31 Jan 2012
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    geograph
    Где скачать?Он нормально эмитирует действия пользователя,просматривающего сайт?
    -------
    Скачал,пробую.Как запомнить кукисы после вызова метода fetch сайта?
    ---------
    Сессия истекла или в Вашем браузере отключены куки. Пожалуйста, обновите страницу, перед ее заполнением.
    Снупи класс тожк самое выдаёт.WTF?Кукисы вроде как он сохраняет!
     
    #4 huntercs, 8 Mar 2012
    Last edited: 8 Mar 2012
  5. geograph

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

    Joined:
    19 Aug 2006
    Messages:
    49
    Likes Received:
    9
    Reputations:
    5
    Странно, может ссылку на сайт скинешь, может там javascript-обработка какая-нибудь
     
  6. huntercs

    huntercs New Member

    Joined:
    31 Jan 2012
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    Сайт catalogioriflame.ru
    Логин Guest пароль 1234567
    Джумла самая обычная 1.5
     
  7. Chaak

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

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    PHP:
    <?php

    $Headers 
    "POST /component/comprofiler/login.html HTTP/1.1\r\nHost: catalogioriflame.ru\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23\r\nConnection: close\r\nReferer: http://catalogioriflame.ru/index.php\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 316\r\n\r\nusername=Guest&passwd=1234567&op2=login&lang=russian&force_session=1&return=B%3AaHR0cDovL2NhdGFsb2dpb3JpZmxhbWUucnUvY29tcG9uZW50L2NvbXByb2ZpbGVyL3VzZXJwcm9maWxlLmh0bWw%3D&message=0&cbsecuritym3=cbm_55559103_1fb254b4_111020bfd0702a465a655bf4d9d40aaa&jd5760d1a5175535f2e0b189a049b83c3=1&Submit=%D0%92%D1%85%D0%BE%D0%B4";

    $Fp fsockopen('catalogioriflame.ru'80);
    fwrite($Fp$Headers);
    $Result fread($Fp2096);
    fclose($Fp);

    preg_match_all('#Set-Cookie:([^;]+);#'$Result$Cookies);

    $Headers "GET /component/comprofiler/userprofile.html HTTP/1.1\r\nHost: catalogioriflame.ru\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23\r\nCookie: _ym_visorc=w; ".$Cookies['1']['1']."\r\nConnection: close\r\n\r\n";

    $Fp fsockopen('catalogioriflame.ru'80);
    fwrite($Fp$Headers);
    while(!
    feof($Fp))
        echo 
    fread($Fp256);
    fclose($Fp);
    Там отправляется несколько Set-Cookie, нужна последняя
     
    #7 Chaak, 8 Mar 2012
    Last edited: 8 Mar 2012
  8. huntercs

    huntercs New Member

    Joined:
    31 Jan 2012
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    Chaak
    Откуда 2я Кука берётся?При вызове методом GET главной страницы в заголовках содержится только одна купа вида md5(x)=md5(y);path="/"
    Хешей откуда столько?
    username=Guest&passwd=1234567&op2=login&lang=russian&force_session=1&return=B%3AaHR0cDovL2NhdGFsb2dpb3JpZmxhbWUucnUvY29 tcG9uZW50L2NvbXByb2ZpbGVyL3VzZXJwcm9maWxlLmh0bWw%3 D&message=0&cbsecuritym3=cbm_55559103_1fb254b4_111020bfd0702a4 65a655bf4d9d40aaa&jd5760d1a5175535f2e0b189a049b83c3=1&Submit=%D0%92%D1%85%D0%BE%D0%B4";
    Где скачать программу мониторинга http запросов.
    На 7ке Naviscope не идёт,есть аналог?
     
  9. Chaak

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

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Я пользуюсь Http-Headers/Tamper data для фаерфокса.

    Видать для авторизации надо указать скрытое поле cbsecuritym3.

    В итоге получился следующий запрос:
    Code:
    http://catalogioriflame.ru/component/comprofiler/login.html
    
    POST /component/comprofiler/login.html HTTP/1.1
    Host: catalogioriflame.ru
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive
    Referer: http://catalogioriflame.ru/
    Cookie: e5a81fd897e2d1568bb859654f3d0504=ulqkhkag54tb9g9u24hk4ftho3; _ym_visorc=w
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 316
    username=Guest&passwd=1234567&op2=login&lang=russian&force_session=1&return=B%3AaHR0cDovL2NhdGFsb2dpb3JpZmxhbWUucnUvY29tcG9uZW50L2NvbXByb2ZpbGVyL3VzZXJwcm9maWxlLmh0bWw%3D&message=0&cbsecuritym3=cbm_5ada1728_18a3e7f6_2e7fb16326d21b8b2afc2b08782ff3a6&jd5760d1a5175535f2e0b189a049b83c3=1&Submit=%D0%92%D1%85%D0%BE%D0%B4
    
    
    
    HTTP/1.1 303 See other
    Date: Thu, 08 Mar 2012 14:40:24 GMT
    Server: Apache
    P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
    Set-Cookie: e5a81fd897e2d1568bb859654f3d0504=5c372110c8fdf6fec73c76a4f1c762c1; path=/
    Location: http://catalogioriflame.ru/component/comprofiler/userprofile.html
    Vary: Accept-Encoding
    Content-Encoding: gzip
    Content-Length: 20
    Connection: close
    Content-Type: text/html; charset=utf-8
    
    Вот этим куком дальше пользуемся:
     
  10. geograph

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

    Joined:
    19 Aug 2006
    Messages:
    49
    Likes Received:
    9
    Reputations:
    5
    С использованием снупи как-то так:
    PHP:
    <?php

    include "Snoopy.class.php";
    $snoopy = new Snoopy;

    $snoopy->agent 'Opera/9.80 (Windows NT 6.1; U; MRA 5.7 (build 03797); YB/3.5.1; ru) Presto/2.9.168 Version/11.50';

    if(!
    $snoopy->fetch("http://catalogioriflame.ru"))
    {
      die (
    'Cannot connect');
    }

    preg_match("!name=\"cbsecuritym3\"\s+value=\"([^\"]+)\"!si"$snoopy->results$match);

    $submit_vars["username"] = "Guest";
    $submit_vars["passwd"] = "1234567";
    $submit_vars["op2"] = "login";
    $submit_vars["lang"] = "russian";
    $submit_vars["force_session"] = "1";
    $submit_vars["message"] = "0";
    $submit_vars["cbsecuritym3"] = $match[1];
    $submit_vars["jd5760d1a5175535f2e0b189a049b83c3"] = "1";
    $submit_vars["remember"] = "yes";
    $submit_vars["Submit"] = "1";

    if(
    $snoopy->submit("http://catalogioriflame.ru/component/comprofiler/login.html"$submit_vars))
    {
      echo 
    $snoopy->results;
    }

    ?>
    Я пользуюсь снифером HTTPAnalyzer
     
    #10 geograph, 8 Mar 2012
    Last edited: 8 Mar 2012
  11. huntercs

    huntercs New Member

    Joined:
    31 Jan 2012
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    Спс,всё разобрался!
    geograph
    Хороша библиотека Snoopy.Поддерживает прокси,много фич.
    Не в курсе как в snoopy классе методом submit прикрепить файл?
     
  12. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
  13. geograph

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

    Joined:
    19 Aug 2006
    Messages:
    49
    Likes Received:
    9
    Reputations:
    5
    Просто надо включить multipart и третьим параметром в submit указать массив с путем до файла. Что-то типа такого:

    PHP:
    $files["uploadfile"] = '/home/tmp/picture.png';

    $snoopy->set_submit_multipart();
    $snoopy->submit($url$vars$files);
     
  14. huntercs

    huntercs New Member

    Joined:
    31 Jan 2012
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    geograph
    То есть он отсылает только имя файла в массиве.А контент файла получает из той директории?Открывает,получает содержимое fread($file,100) и отсылает POST с контентом файла?
     
  15. geograph

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

    Joined:
    19 Aug 2006
    Messages:
    49
    Likes Received:
    9
    Reputations:
    5
    ну да, т.е. post-запрос будет примерно таким:
    Code:
    Content-Type: multipart/form-data; boundary=----------zOX8lm35BiUMDAxCQ7DuGE
    ------------zOX8lm35BiUMDAxCQ7DuGE
    Content-Disposition: form-data; name="uploadfile"; filename="picture.png"
    ‰PNG.... дальше файл
    
     
  16. mr.Penguin

    mr.Penguin Member

    Joined:
    8 Mar 2012
    Messages:
    40
    Likes Received:
    37
    Reputations:
    74
    Вот пример авторизации на cURL, может кому пригодиться.

    PHP:
    <?php 
    //Author mr.Penguin

    $user "admin"
    $password "111111"
    $url 'http://localhost'// Куда зайти 
    $urlTo 'http://localhost/component/comprofiler/login.html'// Куда данные послать 

    $post "username=".$user."&passwd=".$password// POST данные  

    $ch curl_init(); // Инициализация сеанса 
    curl_setopt($chCURLOPT_URL$url); // Заходим на сайт 
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue); // Приказываем вернуть страницу в переменную 
    $html curl_exec($ch); // Забираем страницу 
    curl_setopt($chCURLOPT_URL$urlTo); // Куда шлем POST данные
    curl_setopt($chCURLOPT_COOKIEJAR'cookie.txt'); // Записываем cookie 
    curl_setopt($chCURLOPT_COOKIEFILE'cookie.txt'); // Читаем cookies 
    curl_setopt($chCURLOPT_POSTtrue); // Указываем метод отправки 
    curl_setopt($chCURLOPT_POSTFIELDS$post); // POST данные 
    curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue); // Говорим скрипту, чтобы он следовал за редиректами которые происходят во время авторизации 

    $html curl_exec($ch); // Забираем страницу 
    curl_close($ch); // Завершаем сеанс 
    echo $html// Отображаем результат 
    ?>
     
  17. huntercs

    huntercs New Member

    Joined:
    31 Jan 2012
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    Спасибо большое,всё заработало!
    geograph
    Не знаешь класс работы с pop3?Читать новую почту
     
  18. geograph

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

    Joined:
    19 Aug 2006
    Messages:
    49
    Likes Received:
    9
    Reputations:
    5
    Нет не знаю, но наверно, если загуглить то найти можно :)
     
  19. huntercs

    huntercs New Member

    Joined:
    31 Jan 2012
    Messages:
    50
    Likes Received:
    0
    Reputations:
    0
    Да все нашел
    http://www.php.ru/forum/viewtopic.php?f=2&t=38734&p=315441
    Есть какой нибудь класс интересный php?Набираю библиотеку ООП
     
  20. Chaak

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

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Тебе сюда.