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-Сайты >хорошо, хорошо) отключай инет, когда покуришь))) | |
![]() | Интернет-форум Краснодарского края и Краснодара |