За последние 24 часа нас посетили 58098 программистов и 1848 роботов. Сейчас ищут 975 программистов ...

Curl-ом достучаться до запороленного сайта

Тема в разделе "Прочие вопросы по PHP", создана пользователем mstdmstd, 10 мар 2013.

  1. mstdmstd

    mstdmstd Активный пользователь

    С нами с:
    28 фев 2010
    Сообщения:
    83
    Симпатии:
    1
    Всем привет,
    Мне надо curl-ом получить страницу http://leadserve.opt-intelligence.com/ls/signin.action
    Но до входа до этой страницы надо ввести пользовательсий пароль
    Использование HTTP authentication типа

    Код (Text):
    1. curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");
    в данном случае не помогает и возвращается окно для ввода пароля, так как HTTP authentication это если пароль требует .htaccess, как я понимаю?


    Пробую так
    Код (Text):
    1.  
    2. <?php
    3. class PublisherReprter {
    4.   private $fpKey;
    5.   private $Username;
    6.   private $Password;
    7.   private $IsDebug= true;
    8.   private $CookeiFilename;
    9.   private $strCookie;
    10. //  public function setLogin( $Username, $Password ) {
    11.   public function PublisherReprter() {
    12.     $this->CookieFilename= dirname(__FILE__) . DIRECTORY_SEPARATOR . "my_cookies.txt";
    13.     session_start();
    14.     $this->strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=' . $this->CookieFilename;
    15.     echo '<br>$strCookie::'.print_r( $strCookie,true).'<br>';
    16.     if ($this->IsDebug) echo 'PublisherReprter $this->CookieFilename::'.print_r($this->CookieFilename,true).'<br>';
    17.  
    18.   }
    19.   public function Run() {
    20.     $LoginPageHTML= $this->OpenLoginPage(); //Open Login page to get value of __fp field for CSRF protection
    21.     $this->Get__fpKey($LoginPageHTML); // retrieve __fp key from html from login page
    22.     if ($this->IsDebug) echo 'Get__fpKey $this->fpKey::'.print_r($this->fpKey,true).'<br>';
    23.  
    24.     $Res= $this->MakeLogToSite(); // make login to form using SRF protection from prior step and login parameters
    25.     if ($this->IsDebug) echo '++$Res::'.print_r($Res,true).'<br>';
    26.     if ( $Res ) {
    27.       $Res= $this->GetReportData(); // get report data using SRF protection from and from prior login
    28.       if ($this->IsDebug) echo '++!!!@@ $Res::'.print_r($Res,true).'<br>';
    29.     }
    30.   }  // public function Run() {
    31.  
    32.   public function setLogin( $pUsername, $pPassword ) {
    33.     $this->Username= $pUsername;
    34.     $this->Password= $pPassword;
    35.   }
    36.  
    37.   private function Get__fpKey($html) {
    38.     $Pattern =  '/"__fp"[\s]*value=[\s]*"([^"]*)".*?' .  '$/xsi';
    39.     $Res= preg_match( $Pattern,  $html, $A/*(, PREG_OFFSET_CAPTURE*/ );
    40.     if ( $Res and !empty($A[1]) ) {
    41.       $this->fpKey= $A[1];
    42.       return true;
    43.     }
    44.     return false;
    45.   } // private function Get__fpKey($html) {
    46.  
    47.   private function OpenLoginPage() {
    48.     $url = "http://leadserve.opt-intelligence.com/ls/reports.action";
    49.     $ch = curl_init();
    50.     curl_setopt($ch, CURLOPT_URL,$url); // set url to post to
    51.     curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    52.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects
    53.     // curl_setopt($ch, CURLOPT_COOKIEJAR, /* dirname(__FILE__) .*/ "my_cookies.txt");
    54.     // curl_setopt($ch, CURLOPT_COOKIEFILE, /* dirname(__FILE__) . */ "my_cookies.txt");
    55.     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
    56.     curl_setopt($ch, CURLOPT_TIMEOUT, 3); // times out after 4s
    57.     //curl_setopt($ch,CURLOPT_HEADER,true);
    58.     $result = curl_exec($ch); // run the whole process
    59.     $curl_errno= curl_errno($ch);
    60.     if ($this->IsDebug) echo '<hr><h2>OpenLoginPage</h2><hr>';
    61.     if ($this->IsDebug) echo 'LOGIN $ch::'.print_r( $ch,true ).'<br>';
    62.     if ($this->IsDebug) echo 'LOGIN curl_errno($ch)::'.print_r( curl_errno($ch),true ).'<br>';
    63.     if ($this->IsDebug) echo 'LOGIN curl_error($ch)::'.print_r( curl_error($ch),true ).'<br>';
    64.     if ($this->IsDebug) echo 'LOGIN curl_getinfo($ch)::'.print_r( curl_getinfo($ch),true ).'<br>';
    65.     if ($this->IsDebug) echo '$_COOKIE::'.print_r( $_COOKIE,true).'<br>';
    66.     if ($this->IsDebug) echo '$_SESSION::'.print_r( $_SESSION,true).'<br>';
    67.     curl_close($ch);
    68.     if ($this->IsDebug) echo '<hr>LOGIN<hr>';
    69.     return $result;
    70.   } // private function OpenLoginPage() {
    71.  
    72.  
    73.   private function GetReportData( ) {
    74.     $ch = curl_init('http://leadserve.opt-intelligence.com/ls/reports.action');
    75.     curl_setopt($ch, CURLOPT_POST, 1);
    76.     curl_setopt($ch, CURLOPT_NOBODY, 1);
    77.     curl_setopt($ch, CURLOPT_REFERER, "http://leadserve.opt-intelligence.com/ls/reports.action");
    78.     curl_setopt($ch, CURLOPT_POSTFIELDS, 'date=dr&d1=d&f2=p&f4='.urlencode('03/01/2013').'&f5=' .urlencode('03/31/2013').'&_sourcePage='.urlencode('/WEB-INF/jsp/reports/pageReports.jsp').'&__fp='.urlencode($this->fpKey) );
    79.     //curl_setopt($ch, CURLOPT_COOKIEJAR, /* dirname(__FILE__) .*/ "my_cookies.txt");
    80.     //curl_setopt($ch, CURLOPT_COOKIEFILE, /* dirname(__FILE__) .*/ "my_cookies.txt");
    81.     curl_setopt( $curl_handle, CURLOPT_COOKIE, $this->strCookie );
    82.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    83.     $content= curl_multi_getcontent($ch);
    84.     curl_setopt($ch,CURLOPT_HEADER,true);
    85.     $result = curl_exec($ch);
    86.     $curl_errno= curl_errno($ch);
    87.     if ($this->IsDebug) echo '<hr><h2>GetReportData: </h2><hr>';
    88.     if ($this->IsDebug) echo '$content::'.print_r( $content,true).'<br>';
    89.     if ($this->IsDebug) echo $result;
    90.     if ($this->IsDebug) echo '<br>$result::'.print_r( $result,true).'<br>';
    91.     if ($this->IsDebug) echo '$ch::'.print_r( $ch,true ).'<br>';
    92.     if ($this->IsDebug) echo 'curl_errno($ch)::'.print_r( curl_errno($ch),true ).'<br>';
    93.     if ($this->IsDebug) echo 'curl_error($ch)::'.print_r( curl_error($ch),true ).'<br>';
    94.     if ($this->IsDebug) echo 'curl_getinfo($ch)::'.print_r( curl_getinfo($ch),true ).'<br>';
    95.     curl_close($ch);
    96.     return $curl_errno == 0;
    97.   } // private function GetReportData( ) {
    98.  
    99.   private function MakeLogToSite() {
    100.     $ch = curl_init('http://leadserve.opt-intelligence.com/ls/signin.action');
    101.     curl_setopt($ch, CURLOPT_POST, 1);
    102.     curl_setopt($ch, CURLOPT_NOBODY, 1);
    103.     curl_setopt($ch, CURLOPT_REFERER, "http://leadserve.opt-intelligence.com/ls/signin.action");
    104.     curl_setopt($ch, CURLOPT_POSTFIELDS, 'username='.urlencode($this->Username).'&password='.urlencode($this->Password).'&_sourcePage='.urlencode('/WEB-INF/jsp/common/signin.jsp').'&__fp='.urlencode($this->fpKey) );
    105.    // curl_setopt($ch, CURLOPT_COOKIEJAR, /* dirname(__FILE__) . */ "my_cookies.txt");
    106.    // curl_setopt($ch, CURLOPT_COOKIEFILE, /* dirname(__FILE__) . */ "my_cookies.txt");
    107.     curl_setopt( $curl_handle, CURLOPT_COOKIE, $this->strCookie );
    108.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    109.     curl_setopt($ch,CURLOPT_HEADER,true);
    110.     $result = curl_exec($ch);
    111.     $curl_errno= curl_errno($ch);
    112.     if ($this->IsDebug) echo '<hr><h2>MakeLogToSite</h2><hr>';
    113.     if ($this->IsDebug) echo $result;
    114.     if ($this->IsDebug) echo '<br>$result::'.print_r( $result,true).'<br>';
    115.     if ($this->IsDebug) echo '$ch::'.print_r( $ch,true ).'<br>';
    116.     if ($this->IsDebug) echo 'curl_errno($ch)::'.print_r( curl_errno($ch),true ).'<br>';
    117.     if ($this->IsDebug) echo 'curl_error($ch)::'.print_r( curl_error($ch),true ).'<br>';
    118.     if ($this->IsDebug) echo 'curl_getinfo($ch)::'.print_r( curl_getinfo($ch),true ).'<br>';
    119.     if ($this->IsDebug) echo '$_COOKIE::'.print_r( $_COOKIE,true).'<br>';
    120.     if ($this->IsDebug) echo '$_SESSION::'.print_r( $_SESSION,true).'<br>';
    121.     curl_close($ch);
    122.     return $curl_errno == 0;
    123.   } // private function MakeLogToSite() {
    124.  
    125.  
    126. } // class PublisherReprter {
    127.  
    128. $PublisherReprter= new PublisherReprter();
    129. $PublisherReprter->setLogin( 'user@mail.com', 'password' );
    130. $PublisherReprter->Run();
    У меня получается такой вывод на экран
    Немного своими словами
    1) Я успешно курлом открываю страницу логина ( $this->OpenLoginPage() ) с нее считываю ($this->Get__fpKey($LoginPageHTML)) значение спрятанной переменной __fp, котоая как я понимаю для CSRF защиты
    2) В $this->MakeLogToSite пытаюсь симулировать отправку пост запроса логина с переменной полученной выше __fp и параметрами подключения и там странный результат так как curl_errno($ch) и curl_error($ch)
    ошибок не отбражают но вывоят пустую строку в результате
    3) Я не очень понял с кукями - видимо на шаге 2) надо его создать и передать при шаге 3) ( в GetReportData() ) Подскажите плиз как это сделать и что в этом файле должно быть ?

    Сорри за длинные листы - буду благодарен за любую помощь.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ничего особенного руками писать в этом файле не надо - он автоматом должен создаться. попробуйте указать его путь внутри /tmp - по крайней мере, когда я пытался куки записывать cURL не хотел работать ни с одним другим путем кроме /tmp
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Не помню, как с курлом, давно очень им не пользовался. Но отправить пост-запрос с произвольными заголовками (в том числе куки и user-agent) можно и простым file_get_contents:
    Код (PHP):
    1. <?php
    2. $sid = 'session_id, полученный при первом запросе';
    3. $post = array(
    4.     '__fp' => 'полученная в первом запросе переменная fp',
    5.     'login' => 'ваш логин',
    6.     'password' => 'ваш пароль'
    7. );
    8. $opts = array(
    9.     'http' => array(
    10.         'method' => 'POST',
    11.         'user_agent' => 'Opera/9.80 (Windows NT 6.1; Win64; x64) Presto/2.12.388 Version/12.14',
    12.         'header' => "Cookie: session_id={$sid}\r\nContent-type: application/x-www-form-urlencoded",
    13.         'content' => http_build_query($post)
    14.     )
    15. );
    16. $context = stream_context_create($opts);
    17. $result = file_get_contents('http://example.com/submit.php', false, $context);
    18. ?>
    Добавлено спустя 1 минуту 4 секунды:
    Соответственно, названия переменных post и cookie свои подставить нужно туда.
     
  4. mstdmstd

    mstdmstd Активный пользователь

    С нами с:
    28 фев 2010
    Сообщения:
    83
    Симпатии:
    1
    А посольку это jsp страница то надо брать переменную JSESSIONID ?
    Там такие заголовки:
    Код (Text):
    1. LOGIN $ch::Resource id #2
    2. LOGIN $result::HTTP/1.1 302 Moved Temporarily Cache-control: no-cache="set-cookie" Content-Type: text/plain; charset=UTF-8 Date: Sun, 10 Mar 2013 11:15:50 GMT Location: http://leadserve.opt-intelligence.com/ls/signin.action Set-Cookie: JSESSIONID=377515119381D380EE7FACA7AD419301; Path=/ls Set-Cookie: AWSELB=D171A3C314A759266FA0800BD41453A838AAFE90EC88BCF5FA39A459FDD713F494AEF2D49AE57739FF0B04EC5C1F189F5D5895521075CCDA5507BC9B3EF8BE820FBA0C5C60;PATH=/;MAX-AGE=86400 Content-Length: 0 Connection: keep-alive HTTP/1.1 200 OK Cache-control: no-cache="set-cookie" Content-Language: en-US Content-Type: text/html;charset=ISO-8859-1 Date: Sun, 10 Mar 2013 11:15:50 GMT Set-Cookie: JSESSIONID=C388A3686885375DACEA19E0969E866F; Path=/ls Set-Cookie: AWSELB=D171A3C314A759266FA0800BD41453A838AAFE90EC88BCF5FA39A459FDD713F494AEF2D49AE57739FF0B04EC5C1F189F5D5895521075CCDA5507BC9B3EF8BE820FBA0C5C60;PATH=/;MAX-AGE=86400 transfer-encoding: chunked Connection: keep-alive
    Только почему JSESSIONID имеет 2 разных значения ?

    Добавлено спустя 59 минут 36 секунд:
    file_get_contents( - возвращает форму для ввода логина как будто на страницу зашли GET-ом
    Если параметры подключения передать пустыми строками - то все рано возвращает форму для ввода логина, но без сообщений об незаполненных параметрах логина. Похоже, POST не сработал?