![]() |
как получить 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 из первого запроса и передать во второй? |
если не позволяет - curl позволит? |
phpsessid получил, передал, но во второй раз все равно нужен basic auth. Ковыряю.. Два элемента массива с двумя заголовками не помогают ))) |
0-Фанат NASCAR > Поиграй заголовком Content-type. По идее post запрос с передачей файлов должен иметь заголовок multipart/form-data У меня (правда в perl-скрипте) была аналогичная проблема, после смены заголовка формы в документе - решилась. |
3-КК СПД >вопросов с передачей post-запроса (включая файлы) нет, был вопрос с basic авторизацией при этом. Либо я передаю Authorization: basic, либо multipart/. Подряд два запроса с сохранением и передачей кук (присутствует также session-auth средствами targer-скрипта) - тоже не работало. Получилось забавным способом: file_get_contents("http://$username:$password@$hostname/target", false, $context); |
В своих проектах я использую токен-аутентификацию (при успешной авторизации пользователь получает динамический токен) который пишется или в form>input>hidden или в "печеньки". Можно даже в оба. Работает, а вот $username:$password передавать не особо безопасно. |
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 АТС и оставляет ей возможность нормально обновлятся. |
Тогда да, извиняюсь что забыл за специфику твоей работы. |
Поделюсь в итоге рабочим вариантом. Функция оч удобна, может работать с куками при нужде несколько раз обращаться к странице. Основа честно содрана с нескольких мест ) ################### # получить миме тип файла 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); ############################ первый раз куки передаем пустыми, второй - переданные из первого запроса |
[code]php работает?[/code] |
млин, простите [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] |
Вспомнился башорг :-) насчет php. Честно, мне сишнику и перловоду - не особо все понятно, хотя многое. |
11-КК СПД >админ должен уметь программировать на всем, что шевелится) |
я тут в php нашел это [url]http://www.php.net/manual/en/function.ssh2-exec.php[/url] такие схемы уже строил для своих нужд, а тут.. в общем, мое неимоверное уважение к php выросло еще дальше. А на си хорошо только атмеги с пиками программировать, в наше время.. |
У меня с 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 ветки тоже напрягает. И ничего - работает. |
Это местный форум убивает скобки)) все там норм, с нормальным форматированием |
16-Сайты > прочти внимательно 6-Фанат NASCAR > |
18-Сайты > В сети все равны (пока по крайней мере). И мне в Вас тоже многое не нравиться (например то, что Вы не внимательно читаете то, что пишут другие пользователи), но не стоит в такие крайности. |
16-Сайты >это ещё ничего, на php.ru мне вообще советовали гуи-гном поставить на сервер.. Учитывая что я сам себе дал ответ в первом же посте.. |
offtopic>> если я правильно понимаю, то "Сайты" нам уже не ответит т.к. сереньое "banned" означает "забанен"? |
22-Сайты > с возвращением! Извинений не жду. |
24-Сайты > прощен :-). Народ разный бывает, да и случаи тоже разные. |
22-Сайты >passwd имеет read от apache/other? Руки оторвать админу. Хотя к хешу ещё подбери как пару. |
А ответ - можно неделями писать либы, формируя заголовки, правильное содержимое полей http, рисовать зайчиков цирклами и попиксельно, подрачивать на свои таланты. Но, сука, долго. У меня столько времени нет. |
28-Сайты >некогда было их узнавать, ночью почитаю |
30-Сайты >а? |
33-Сайты >хорошо, хорошо) отключай инет, когда покуришь))) |
Текущее время: 01:06. Часовой пояс GMT +3. |