К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

как получить PHPSESSID при пользовании file_get_content?

Гость
0 - 03.05.2014 - 20:04
Задача 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 из первого запроса и передать во второй?



Гость
1 - 03.05.2014 - 20:07
если не позволяет - curl позволит?
Гость
2 - 03.05.2014 - 21:07
phpsessid получил, передал, но во второй раз все равно нужен basic auth. Ковыряю.. Два элемента массива с двумя заголовками не помогают )))
Гость
3 - 04.05.2014 - 11:22
0-Фанат NASCAR > Поиграй заголовком Content-type.
По идее post запрос с передачей файлов должен иметь заголовок multipart/form-data

У меня (правда в perl-скрипте) была аналогичная проблема, после смены заголовка формы в документе - решилась.
Гость
4 - 04.05.2014 - 13:45
3-КК СПД >вопросов с передачей post-запроса (включая файлы) нет, был вопрос с basic авторизацией при этом. Либо я передаю Authorization: basic, либо multipart/.

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

Получилось забавным способом: file_get_contents("http://$username:$password@$hostname/target", false, $context);
Гость
5 - 04.05.2014 - 18:52
В своих проектах я использую токен-аутентификацию (при успешной авторизации пользователь получает динамический токен) который пишется или в form>input>hidden или в "печеньки". Можно даже в оба. Работает, а вот $username:$password передавать не особо безопасно.
Гость
6 - 04.05.2014 - 19:13
5-КК СПД >динамический токен есть механизм сессий в php
http://www.php.net/manual/ru/book.session.php
нет смысла изобретать велосипед.

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

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

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

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

А запрос username:password идет "внутри" сервера, на localhost. И нигде не крутится. Такое решение не требует доработок скриптов IP АТС и оставляет ей возможность нормально обновлятся.
Гость
7 - 04.05.2014 - 19:44
Тогда да, извиняюсь что забыл за специфику твоей работы.
Гость
8 - 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);
############################
первый раз куки передаем пустыми, второй - переданные из первого запроса
Гость
9 - 04.05.2014 - 19:56
Код:
php работает?
Гость
10 - 04.05.2014 - 19:57
млин, простите
Код:
# получить миме тип файла
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);
Гость
11 - 04.05.2014 - 20:15
Вспомнился башорг :-) насчет php. Честно, мне сишнику и перловоду - не особо все понятно, хотя многое.
Гость
12 - 04.05.2014 - 20:42
11-КК СПД >админ должен уметь программировать на всем, что шевелится)
Гость
13 - 04.05.2014 - 20:44
я тут в php нашел это
http://www.php.net/manual/en/function.ssh2-exec.php

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

А на си хорошо только атмеги с пиками программировать, в наше время..
Гость
14 - 04.05.2014 - 23:35
У меня с PERL хорошие отношения т.к. он не только для веба, но и для консольного программирования хорош. [*****] писали для того чтобы любая мартышка могла заняться веб-программированием. с задачей они кстати справились, просто код на [*****] выглядит для программера на других языках немного диковато.

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

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 ветки тоже напрягает. И ничего - работает.
Гость
15 - 05.05.2014 - 00:07
Это местный форум убивает скобки)) все там норм, с нормальным форматированием
Гость
16 - 06.05.2014 - 21:06
16-Сайты > прочти внимательно
6-Фанат NASCAR >
Гость
17 - 07.05.2014 - 20:32
18-Сайты > В сети все равны (пока по крайней мере). И мне в Вас тоже многое не нравиться (например то, что Вы не внимательно читаете то, что пишут другие пользователи), но не стоит в такие крайности.
Гость
18 - 07.05.2014 - 22:36
16-Сайты >это ещё ничего, на php.ru мне вообще советовали гуи-гном поставить на сервер.. Учитывая что я сам себе дал ответ в первом же посте..
Гость
19 - 10.05.2014 - 13:54
offtopic>> если я правильно понимаю, то "Сайты" нам уже не ответит т.к. сереньое "banned" означает "забанен"?
Гость
20 - 12.05.2014 - 00:06
22-Сайты > с возвращением! Извинений не жду.
Гость
21 - 12.05.2014 - 16:15
24-Сайты > прощен :-). Народ разный бывает, да и случаи тоже разные.
Гость
22 - 13.05.2014 - 00:49
22-Сайты >passwd имеет read от apache/other? Руки оторвать админу. Хотя к хешу ещё подбери как пару.
Гость
23 - 13.05.2014 - 00:50
А ответ - можно неделями писать либы, формируя заголовки, правильное содержимое полей http, рисовать зайчиков цирклами и попиксельно, подрачивать на свои таланты. Но, сука, долго. У меня столько времени нет.
Гость
24 - 13.05.2014 - 18:41
28-Сайты >некогда было их узнавать, ночью почитаю
Гость
25 - 13.05.2014 - 23:31
30-Сайты >а?
Гость
26 - 14.05.2014 - 01:47
33-Сайты >хорошо, хорошо) отключай инет, когда покуришь)))


К списку вопросов
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск




Copyright ©, Все права защищены