Форум на Kuban.ru (http://forums.kuban.ru/)
-   Веб-дизайн и программирование (http://forums.kuban.ru/f1030/)
-   -   как получить PHPSESSID при пользовании file_get_content? (http://forums.kuban.ru/f1030/kak_poluchit-_phpsessid_pri_pol-zovanii_file_get_content-5675747.html)

fanatnascar 03.05.2014 20:04

как получить PHPSESSID при пользовании file_get_content?
 
Задача php-скрипта:

1) Авторизоваться одновременно по basic auth и <form type="post">
2) Будучи авторизованным, отправить файл post-ом.

По отдельности пункты работают, используя:
1) 'header' => "Authorization: Basic ".base64_encode("$username:$password"), http_build_query, stream_context_create и file_get_contents
2) 'header' => "Content-type: application/x-www-form-urlencoded" и то же самое

Но на второй запрос (в том же скрипте) - не авторизован. Хотя первая строчка возвращает данные после авторизации.

Думаю, дело в том, что не передаю сессию и/или еще какие либо параметры.

Позволяет данный механизм получить phpsessid из первого запроса и передать во второй?

fanatnascar 03.05.2014 20:07

если не позволяет - curl позволит?

fanatnascar 03.05.2014 21:07

phpsessid получил, передал, но во второй раз все равно нужен basic auth. Ковыряю.. Два элемента массива с двумя заголовками не помогают )))

sodpd 04.05.2014 11:22

0-Фанат NASCAR > Поиграй заголовком Content-type.
По идее post запрос с передачей файлов должен иметь заголовок multipart/form-data

У меня (правда в perl-скрипте) была аналогичная проблема, после смены заголовка формы в документе - решилась.

fanatnascar 04.05.2014 13:45

3-КК СПД >вопросов с передачей post-запроса (включая файлы) нет, был вопрос с basic авторизацией при этом. Либо я передаю Authorization: basic, либо multipart/.

Подряд два запроса с сохранением и передачей кук (присутствует также session-auth средствами targer-скрипта) - тоже не работало.

Получилось забавным способом: file_get_contents("http://$username:$password@$hostname/target", false, $context);

sodpd 04.05.2014 18:52

В своих проектах я использую токен-аутентификацию (при успешной авторизации пользователь получает динамический токен) который пишется или в form>input>hidden или в "печеньки". Можно даже в оба. Работает, а вот $username:$password передавать не особо безопасно.

fanatnascar 04.05.2014 19:13

5-КК СПД >динамический токен есть механизм сессий в php
[url]http://www.php.net/manual/ru/book.session.php[/url]
нет смысла изобретать велосипед.

А basic auth были изобретены "дополнительно". Проблема в том, что targer-скрипты - скрипты opensource IP АТС, которыми мне нужно управлять из веб-панели моих клиентов (на едином для клиентов сайте).

Но как и любой крупный проект, он (IP АТС) грешит уязвимостями, самый распространенный вид которых - выполнение произвольных команд шелл-оболочки без авторизации. Недавно такую уязвимость нашли, я ее ощутил на собственном горбу (без потерь, вовремя среагировал, взломщики умудрились поломать конфигурашку и юзеры не смогли звонить).

В итоге было принято решение закрыть [filolog]нах[/filolog] все скрипты дополнительной проверкой пароля БЕЗскриптовым методом. apache basic auth как нельзя лучше подошел.

Итого мы имеем нужду авторизоваться дважды.

А запрос username:password идет "внутри" сервера, на localhost. И нигде не крутится. Такое решение не требует доработок скриптов IP АТС и оставляет ей возможность нормально обновлятся.

sodpd 04.05.2014 19:44

Тогда да, извиняюсь что забыл за специфику твоей работы.

fanatnascar 04.05.2014 19:55

Поделюсь в итоге рабочим вариантом. Функция оч удобна, может работать с куками при нужде несколько раз обращаться к странице. Основа честно содрана с нескольких мест )
###################
# получить миме тип файла
function getMimeType($filename) **
if(function_exists('finfo_open')) **
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $filename);
finfo_close($finfo);
return $mime;
**
return 'application/octet-stream';
**
# получить контент для запроса
function getContent($postData, $files) **
$boundary = md5(rand(0,32000));
$content = '';
foreach($postData as $key => $val) **
$content .= '--' . $boundary . "\n";
$content .= 'Content-Disposition: form-data; name="' . $key . '"' . "\n\n" . $val . "\n";
**
foreach($files as $key => $file) **
$content .= '--' . $boundary . "\n";
$content .= 'Content-Disposition: form-data; name="' . $key . '"; filename="' . basename($file) . '"' . "\n";
$content .= 'Content-Type: ' . getMimeType($file) . "\n";
$content .= 'Content-Transfer-Encoding: binary' . "\n\n";
$content .= file_get_contents($file) . "\n";
**
$content .= "--$boundary--\n";
return array($boundary, $content);
**

function post_exec($url_, $post_, $files_, $cookies_) **

if(!is_array($post_)) return(array("Данные post вне массива",""));
if(!is_array($files_)) return(array("Данные files вне массива",""));
list($boundary_, $content_) = getContent($post_, $files_);
if(!empty($cookies_)) **
$opts_ = stream_context_create(array(
'http'=>array(
'method'=>"POST",
'header'=>"Content-Type: multipart/form-data; boundary=$boundary_\r\n".
"User-Agent : Opera/9.80 (X11; Linux i686; U; ru) Presto/2.7.62 Version/11.00 \r\n".
"Accept-Language: ru-RU,ru;q=0.9,en;q=0.8 \r\n".
"Accept-Charset:utf-8, utf-16, *;q=0.1 \r\n".
"Accept-Encoding:identity, *;q=0 \r\n".
"Cookie: ".$cookies_,
'content' => $content_
)));
** else **
$opts_ = stream_context_create(array(
'http'=>array(
'method'=>"POST",
'header'=>"Content-Type: multipart/form-data; boundary=$boundary_\r\n".
"User-Agent : Opera/9.80 (X11; Linux i686; U; ru) Presto/2.7.62 Version/11.00 \r\n".
"Accept-Language: ru-RU,ru;q=0.9,en;q=0.8 \r\n".
"Accept-Charset:utf-8, utf-16, *;q=0.1 \r\n".
"Accept-Encoding:identity, *;q=0 \r\n",
'content' => $content_
)));
**
$responce_ = file_get_contents($url_, false, $opts_);
#сохраним cookies для передачи в последующих запросах
if(empty($cookies_)) **
$cookies_ = Array();
foreach( $http_response_header as $head_)**
if(stristr($head_, 'Set-Cookie:' )) $cookies_[] = (str_ireplace('Set-Cookie:', '', $head_ ));
**
$cookies_ = implode('; ',$cookies_);
**
#вернем результат и cookies
return array($responce_, $cookies_);
**

###################

$post = array(
'input1_name' => "val1",
'input2_name' => "val2",
);
$files = array(
"csvFile" => "/path/to/file/or/url"
);
list($result, $cookies) = post_exec("http://$username:$password@$hostname/url.php", $post, $files, $cookies);
############################
первый раз куки передаем пустыми, второй - переданные из первого запроса

fanatnascar 04.05.2014 19:56

[code]php работает?[/code]

fanatnascar 04.05.2014 19:57

млин, простите
[code]
# получить миме тип файла
function getMimeType($filename) **
if(function_exists('finfo_open')) **
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $filename);
finfo_close($finfo);
return $mime;
**
return 'application/octet-stream';
**
# получить контент для запроса
function getContent($postData, $files) **
$boundary = md5(rand(0,32000));
$content = '';
foreach($postData as $key => $val) **
$content .= '--' . $boundary . "\n";
$content .= 'Content-Disposition: form-data; name="' . $key . '"' . "\n\n" . $val . "\n";
**
foreach($files as $key => $file) **
$content .= '--' . $boundary . "\n";
$content .= 'Content-Disposition: form-data; name="' . $key . '"; filename="' . basename($file) . '"' . "\n";
$content .= 'Content-Type: ' . getMimeType($file) . "\n";
$content .= 'Content-Transfer-Encoding: binary' . "\n\n";
$content .= file_get_contents($file) . "\n";
**
$content .= "--$boundary--\n";
return array($boundary, $content);
**

function post_exec($url_, $post_, $files_, $cookies_) **

if(!is_array($post_)) return(array("Данные post вне массива",""));
if(!is_array($files_)) return(array("Данные files вне массива",""));
list($boundary_, $content_) = getContent($post_, $files_);
if(!empty($cookies_)) **
$opts_ = stream_context_create(array(
'http'=>array(
'method'=>"POST",
'header'=>"Content-Type: multipart/form-data; boundary=$boundary_\r\n".
"User-Agent : Opera/9.80 (X11; Linux i686; U; ru) Presto/2.7.62 Version/11.00 \r\n".
"Accept-Language: ru-RU,ru;q=0.9,en;q=0.8 \r\n".
"Accept-Charset:utf-8, utf-16, *;q=0.1 \r\n".
"Accept-Encoding:identity, *;q=0 \r\n".
"Cookie: ".$cookies_,
'content' => $content_
)));
** else **
$opts_ = stream_context_create(array(
'http'=>array(
'method'=>"POST",
'header'=>"Content-Type: multipart/form-data; boundary=$boundary_\r\n".
"User-Agent : Opera/9.80 (X11; Linux i686; U; ru) Presto/2.7.62 Version/11.00 \r\n".
"Accept-Language: ru-RU,ru;q=0.9,en;q=0.8 \r\n".
"Accept-Charset:utf-8, utf-16, *;q=0.1 \r\n".
"Accept-Encoding:identity, *;q=0 \r\n",
'content' => $content_
)));
**
$responce_ = file_get_contents($url_, false, $opts_);
#сохраним cookies для передачи в последующих запросах
if(empty($cookies_)) **
$cookies_ = Array();
foreach( $http_response_header as $head_)**
if(stristr($head_, 'Set-Cookie:' )) $cookies_[] = (str_ireplace('Set-Cookie:', '', $head_ ));
**
$cookies_ = implode('; ',$cookies_);
**
#вернем результат и cookies
return array($responce_, $cookies_);
**
[/code]

[code]
$post = array(
'input1_name' => "val1",
'input2_name' => "val2",
);
$files = array(
"csvFile" => "/path/to/file/or/url"
);
list($result, $cookies) = post_exec("http://$username:$password@$hostname/url.php", $post, $files, $cookies);
[/code]

sodpd 04.05.2014 20:15

Вспомнился башорг :-) насчет php. Честно, мне сишнику и перловоду - не особо все понятно, хотя многое.

fanatnascar 04.05.2014 20:42

11-КК СПД >админ должен уметь программировать на всем, что шевелится)

fanatnascar 04.05.2014 20:44

я тут в php нашел это
[url]http://www.php.net/manual/en/function.ssh2-exec.php[/url]

такие схемы уже строил для своих нужд, а тут.. в общем, мое неимоверное уважение к php выросло еще дальше.

А на си хорошо только атмеги с пиками программировать, в наше время..

sodpd 04.05.2014 23:35

У меня с PERL хорошие отношения т.к. он не только для веба, но и для консольного программирования хорош. [filolog]Пых[/filolog] писали для того чтобы любая мартышка могла заняться веб-программированием. с задачей они кстати справились, просто код на [filolog]пыхе[/filolog] выглядит для программера на других языках немного диковато.

Я в целом понимаю, что твой скрипт делает, но некоторые конструкции вызывают непередаваемое чувство.

function getMimeType($filename) **
if(function_exists('finfo_open')) **
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $filename);
finfo_close($finfo);
return $mime;
**
return 'application/octet-stream';
**

Открывающие скобки отсутствуют тут же рефлекторное "ошибка компиляции" или падение интерпретатора, отсутствие else ветки тоже напрягает. И ничего - работает.

fanatnascar 05.05.2014 00:07

Это местный форум убивает скобки)) все там норм, с нормальным форматированием

sodpd 06.05.2014 21:06

16-Сайты > прочти внимательно
6-Фанат NASCAR >

sodpd 07.05.2014 20:32

18-Сайты > В сети все равны (пока по крайней мере). И мне в Вас тоже многое не нравиться (например то, что Вы не внимательно читаете то, что пишут другие пользователи), но не стоит в такие крайности.

fanatnascar 07.05.2014 22:36

16-Сайты >это ещё ничего, на php.ru мне вообще советовали гуи-гном поставить на сервер.. Учитывая что я сам себе дал ответ в первом же посте..

sodpd 10.05.2014 13:54

offtopic>> если я правильно понимаю, то "Сайты" нам уже не ответит т.к. сереньое "banned" означает "забанен"?

sodpd 12.05.2014 00:06

22-Сайты > с возвращением! Извинений не жду.

sodpd 12.05.2014 16:15

24-Сайты > прощен :-). Народ разный бывает, да и случаи тоже разные.

fanatnascar 13.05.2014 00:49

22-Сайты >passwd имеет read от apache/other? Руки оторвать админу. Хотя к хешу ещё подбери как пару.

fanatnascar 13.05.2014 00:50

А ответ - можно неделями писать либы, формируя заголовки, правильное содержимое полей http, рисовать зайчиков цирклами и попиксельно, подрачивать на свои таланты. Но, сука, долго. У меня столько времени нет.

fanatnascar 13.05.2014 18:41

28-Сайты >некогда было их узнавать, ночью почитаю

fanatnascar 13.05.2014 23:31

30-Сайты >а?

fanatnascar 14.05.2014 01:47

33-Сайты >хорошо, хорошо) отключай инет, когда покуришь)))


Текущее время: 01:06. Часовой пояс GMT +3.