K
K
ko1hoz2015-02-22 11:50:01
PHP
ko1hoz, 2015-02-22 11:50:01

Why can't I log in with curl?

I'm not a programmer, so don't kick too much) I'm not going to steal or hack anything. We use redmine at work, I want to write a small parser to get certain fields from the task page to automate the counts. But I can’t log in, I try on the public demo redmine.

<?php
 
 $url = 'http://demo.redmine.org/login';
 $urlTo = '<?php
 
 $url = 'http://demo.redmine.org/login';
 $urlTo = 'http://demo.redmine.org/issues/80823';
 $login = 'xxx';
 $pass = 'xxx';
 $y = '';
 $post = 'utf8=' . $y . '&authenticity_token=&back_url=' . $urlTo . '&username=' . $login . '&password=' . $pass; 
 
 $ch = curl_init();                              // Инициализируем сеанс CURL
curl_setopt($ch, CURLOPT_URL, $url);            // Заходим на сайт
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Делаем так, чтобы страница не выдавалась сразу в поток, а можно было ее записать в переменную
$html = curl_exec($ch);                         // Имитируем заход на сайт

//            22222222222222222222222222

include_once('simple_html_dom.php');
$html = str_get_html($html);
$inputs = $html->find('head meta');            // Нашел все теги meta
$input = $inputs[4];                                    // опытным путем определил, что токен в пятом :)
$word = explode('"', $input);                      // поделил строку на слова                         
$token = $word[1];
echo $token;                                               //вывел токен, реально совпадает)

$post2 = 'authenticity_token=' . $token . '&back_url=' . $urlTo . '&username=' . $login . '&password=' . $pass . '&l'; 

$ch = curl_init();                              // Инициализируем сеанс CURL
curl_setopt($ch, CURLOPT_URL, $url);            // Заходим на сайт
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 
//$html = curl_exec($ch);                         // Имитируем заход на сайт

curl_setopt($ch, CURLOPT_URL, $url);              // Устанавливаем адрес куда будем слать POST данные
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/40.0.2214.111 Chrome/40.0.2214.111 Safari/537.36");
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');  // Записываем cookies в файл, чтобы потом можно было их считать
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // Теперь читаем cookies с файла
curl_setopt($ch, CURLOPT_POST, true);               // Говорим, что информация будет отправляться методом POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $post2);        // Передаем POST данные

$html = curl_exec($ch); // Записываем пришедшие данные в переменную    
curl_close($ch);        // Закрываем сеанс работы CURL
 
echo $html;             // Вывожу страницу, вижу "Invalid form authenticity token.".
Мой запрос c php:
<img src="//habrastorage.org/files/902/c0c/b22/902c0cb229fa459a8a03b6552c632b4d.png" alt="image"/>
Запрос с браузера:
<img src="//habrastorage.org/files/c93/337/184/c9333718403049e9ad3177e5bc26552d.png" alt="image"/>
?>

Is there an easier way to do what needs to be done?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
F
FanatPHP, 2015-02-22
@FanatPHP

Redmine stores data in a database.
What kind of brain dislocation does it take to try to access this data through HTML parsing and fake authorization? Instead of a couple of lines of SQL?
Literally, this is the removal of the tonsils through the *opu with an autogen. Those who have read PHP forums do not laugh at jokes.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question