После продолжительной эксплуатации операционной системы в ней закономерно...
cURL — инструмент командной строки для получения или отправки данных с использованием синтаксиса URL.
Если вы работаете в службе поддержки, то должны уметь использовать команды cURL для устранения неполадок веб-приложений. cURL
— кроссплатформенная утилита для Windows, MAC и UNIX.
Ниже приведены некоторые часто используемые примеры синтаксиса.
1. Проверка возможности подключения к URL-адресу
Если вы работаете в UNIX-системе и пытаетесь подключиться к внешнему URL-адресу, то сначала проверьте наличие доступа к ресурсу через curl . Для этого используйте следующую команду:
# curl yoururl.com
2. Сохранение вывод URL / URI в файл
# curl yoururl.com > yoururl.html
Например:
# curl 74.125.68.100 >/tmp/google.html
Приведенный выше пример сохранит все содержимое с хоста 74.125.68.100 в файл /tmp/google.html .
3. Показать заголовок запроса и ответа
Если хотите удостовериться, что получаете ожидаемый заголовок запроса и ответа, используйте следующую команду:
# curl -v yoururl.com
например:
# curl -v 74.125.68.100
* About to connect() to 74.125.68.100 port 80 (#0)
* Trying 74.125.68.100...
* Connected to 74.125.68.100 (74.125.68.100) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
>Host: 74.125.68.100
>Accept: */*
>< HTTP/1.1 200 OK
Если нужно узнать, сколько времени требуется для загрузки с определенной скоростью, то используйте следующую команду: # curl –-limit-rate 2000B например: # curl –-limit-rate 2000B 74.125.68.100 Если необходимо проверить, можно ли использовать прокси-сервер, примените следующий синтаксис: # curl --proxyyourproxy:port http://yoururl.com Для устранения конкретной проблемы можно использовать Curl
, чтобы вставить в header
свои данные. Рассмотрим следующий пример запроса с Content-Type: # curl --header "Content-Type: application/json" http://yoururl.com Мы просим curl
передать Content-Type в качестве application / json
в заголовок запроса. Вы можете добавить заголовок к запросу с помощью синтаксиса — header
. # curl –-header “X-CustomHeader: GeekFlare” http://yoururl.com например: # curl -v --header "X-CustomHeader: GeekFlare" 74.125.68
* About to connect() to 74.125.68.100 port 80 (#0)
* Trying 74.125.68.100...
* Connected to 74.125.68.100 (74.125.68.100) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
>Host: 74.125.68.100
>Accept: */*
> X-CustomHeader: GeekFlare
>< HTTP/1.1 200 OK
Если вы хотите быстро проверить заголовок ответа, то для этого можно использовать следующий синтаксис. # curl --head http://yoururl.com # curl -I 74.125.68.100
HTTP/1.1 200 OK
Date: Sun, 18 Jan 2015 08:31:22 GMT
Expires: -1
Cache-Control:
private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: NID=67=SpnXKTDUhw7QGakIeLxmDSF;
expires=Mon, 20-Jul-2015 08:31:22 GMT; path=/; domain=.; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for moreinfo."
Server: gws X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic,p=0.02
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding
# Если необходимо получить доступ к https URL-адресу, который выдает ошибку сертификата из-за несоответствия имени хоста, можно использовать следующий синтаксис. curl --insecure https://yoururl.com Чтобы подключиться к URL- адресу только по протоколу SSL V2 / V3
или TLS
,используйте следующий синтаксис. Для подключения с использованием SSLV2: # curl --sslv2 https://yoururl.com Для подключения с использованием SSLV3: # curl --sslv3 https://yoururl.com Для подключения через TLS: # curl --tlsv1 https://yoururl.com С помощью cURL
можно загрузить файл с ftp-сервера
, указав имя пользователя и пароль. # curl -u user:password -O ftp://ftpurl/style.css Всегда можно использовать «-v» с любым синтаксисом для вывода в подробном режиме. Да, это возможно. Вы можете выполнить cURL
удаленно с помощью следующих инструментов. Connect-timeout
--cookie
--data
--header
--head
--location
--max-time
--proxy
--request
--user
--url
--user-agent Пример вывода: 16.02.2006
Джеф Феллинг
Curl поможет управлять данными, размещенными в Web
В данной статье рассматривается бесплатный инструмент Curl, с помощью которого можно передавать и принимать Web-страницы из командной строки. Благодаря Curl легко автоматизировать многие В данной статье рассматривается бесплатный инструмент Curl, с помощью которого можно передавать и принимать Web-страницы из командной строки. Благодаря Curl легко автоматизировать многие операции информационной защиты и администрирования, например извлечь Web-страницу для анализа или загрузить исправление для системы безопасности из Web. Curl входит в состав многих дистрибутивов Unix. Имеются двоичные файлы и исходные тексты для большинства других операционных систем. Даже программисты, работающие с открытым PHP, могут использовать Curl для безопасного доступа к Web-контенту непосредственно из PHP-сценариев. Для работы Curl с Web-узлами Secure Sockets Layer (SSL) необходим пакет OpenSSL. Существуют две версии Curl: одна с SSL, другая без SSL. Рекомендую первую, поскольку SSL надежно защищает данные. Прежде чем использовать Curl с функциями SSL, необходимо загрузить из сети и отдельно установить пакет OpenSSL. Двоичные файлы OpenSSL for Windows можно загрузить с сайта проекта GnuWin32 SourceForge по адресу . На этом сайте имеется и много других полезных инструментов, портированных в Windows. Следует загрузить и установить пакет OpenSSL, затем скопировать два DLL-файла в каталог system32: Copy "C:Program
FilesGnuWin32
binlibeay32.dll"
%windir%system32
copy "C:Program
FilesGnuWin32
binlibssl32.dll"
%windir%system32
После этого можно установить Curl. SSL-совместимые двоичные файлы Curl для Windows можно найти по адресу http://curl.haxx.se/latest.cgi?curl=win32-ssl-sspi
. Новейшая версия, curl 7.15.0, находится в win32-ssl-sspi.zip, который содержит файл curl.exe и документацию. После установки Curl следует убедиться в его работоспособности, введя команду Curl http://isc.sans.org/
infocon.txt
Если на экране появится слово, обозначающее цвет (например, green), значит, Curl работает. В этом простом примере Curl извлекает содержание Infocon из Web-узла Internet Storm Center института SANS. Green означает, что Internet функционирует нормально и серьезных угроз не обнаружено. Если же вместо green на экране появляются слова yellow, orange или red, то отложите эту статью и посетите сайт http://isc.sans.org
, чтобы узнать о состояниях повышенной опасности в Internet. В случае ошибки необходимо проверить правильность установки Curl. В сущности, Curl извлекает Web-страницу, а затем выдает исходный текст HTML страницы на консоль. Однако возможности утилиты шире. Curl располагает встроенной функцией проверки ошибок. Например, команда Curl http://noserverhere
выдает ошибку Curl: (6) Could not resolve host: noserverhere; Host not found. Коды ошибок можно использовать в сценариях, чтобы проверить доступность Web-страницы или реакцию Web-сервера. Например, если использовать Curl для ежедневного извлечения Web-страницы, в частности суточной статистики Web-узла, можно дополнить сценарий исходным текстом, отыскивающим коды ошибок. Если Curl выдает код ошибки Curl: (7) couldn?t connect to host, то можно немедленно передать предупреждение или отправить сообщение по электронной почте. Одно из важнейших достоинств Curl - совместимость с SSL. Запрошенные страницы HTTPS передаются через сеть в зашифрованном виде, а затем Curl выводит на экран восстановленный текст. Кроме того, Curl проверяет сертификаты - дату завершения действия сертификата, соответствие имени хост-компьютера хост-имени в сертификате и уровень доверия к корневому сертификату - и предупреждает, если сертификат некорректен. Параметр -cacert позволяет указать определенный файл сертификата. Проверка сертификатов отменяется с помощью параметра -k. Альтернативный подход - использовать параметр -insecure. Возможности Curl шире простой пересылки файлов через Internet. С помощью Curl можно быстро получить список каталогов FTP-сайта: Curl ftp://myftpsite
Чтобы увидеть подкаталоги сайта, следует ввести команду Curl ftp://myftpsite/subdir/
Для загрузки файла из сети достаточно указать в URL имя файла. В следующем примере файл с именем readme.txt загружается прямо из командной строки и отображается на экране: Curl ftp://ftp.microsoft.com/
deskapps/games/readme.txt
Нередко проще подготовить сценарий с Curl для ввода FTP-файлов, чем использовать команду FTP интерактивно. По умолчанию данные выводятся непосредственно на консоль, но их можно перенаправить в файл с помощью параметров -o и -O. Чтобы получить страницу и сохранить ее на диске, следует указать параметр -o. Параметр -O сохраняет полученную страницу в локальном файле, и Curl извлекает имя удаленного документа. Если в URL имя файла не указано, то эта операция закончится неудачей. Если использовать Curl для передачи на Web-узел запроса без имени файла, но нужно сохранить результат в файле, можно указать имя файла в командной строке, например: Curl обеспечивает методы аутентификации Basic, Digest и интегрированный. На большинстве сайтов доступ к страницам с аутентификацией на базе форм можно получить с использованием функций отправки Curl, что будет продемонстрировано чуть ниже. Это значит, что можно передать данные формы, в частности имя пользователя и пароль, на удаленный Web-узел, на Web-странице которого выводится запрос на ввод информации. Для пересылки учетных данных можно использовать параметр -u или вставить их в URL, что традиционно делается в FTP, например: Curl ftp://username:
password@myhtmlsite
С помощью Curl приемы, заимствованные из FTP, можно перенести в HTTP, как в следующем примере: Curl http://username:password
@myhtmlsite/default.htm
Curl также обеспечивает доступ к Web-страницам через proxy-сервер. Поэтому Curl можно настроить на использование proxy-сервера для аутентификации в режимах Basic, Digest и NTLM. В одной статье трудно охватить все многочисленные функции Curl, среди которых и загрузка файлов на сервер (-T), и просмотр только информации в заголовке HTTP (-I), и просмотр всех данных в детальном режиме (-V), и скрытый вывод (-s). Я рекомендую более подробно ознакомиться с функциями Curl в руководстве, опубликованном по адресу http://curl.haxx.se/docs
. Ознакомившись с основами Curl, рассмотрим простой пример извлечения данных из Web-узла при заданных входных данных. Построим простой инструмент Whois, который демонстрирует простоту и удобство применения Curl и процедуру отправки данных на Web-узел с использованием параметра -d. В данном примере Curl посылает IP-адрес на Web-узел Arin Whois, а затем извлекает результаты из этого сайта. Whois отыскивает информацию о владельце IP-адреса. Перед началом работы важно исследовать Web-узел, так как в исходном тексте каждого сайта есть свои особенности, и Curl не всегда одинаково работает с любыми сайтами. Предварительное посещение сайта позволяет собрать необходимую информацию для работы Curl. В данном примере я воспользовался браузером, чтобы посетить Web-узел http://www.arin.net/whois/
, и обратил внимание, что на сайте имеется единственное поле ввода данных, в котором посетители указывают интересующий их IP-адрес. Необходимо получить детали этого поля, которое представляет собой часть Web-формы. В данном примере используется Perl-сценарий formfind.pl (http://cool.haxx.se/cvs.cgi/curl/perl/contrib/ formfind?rev=HEAD&content-type=text/vnd.viewcvs-markup
). Сценарий Formfind.pl преобразует данные формы в удобные выходные результаты и упрощает ручной поиск данных в HTML. Конечно, для запуска Formfind на компьютере должен быть развернут Perl. Хороший пакет Win32 Perl можно заказать на сайте ActiveState ActivePerl по адресу http://www.activestate.com
. Рассмотрим пример более подробно. Во-первых, обратимся к Web-узлу, содержащему форму, которая запрашивает информацию: Curl -o whoisOutputFile
http://www.arin.net/whois/
Эта команда извлекает страницу Whois из http://www.arin.net и сохраняет ее в текстовом файле whoisOutputFile, который содержит исходный текст HTML, воспроизводимый браузером при посещении сайта. Затем необходимо найти и выделить данные формы: ./formfind.pl Formfind выдает переменные формы и их возможные величины. В данном примере выходные результаты имеют довольно простой вид (см. экран 1
). Следует обратить внимание на данные формы Input с именем queryinput. Это текстовое поле, в которое Curl должен послать искомый IP-адрес. Конкретный IP-адрес не имеет значения - в данном примере использовался адрес Microsoft. С помощью параметра -d искомый IP-адрес пересылается в поле queryinput: Curl -d "queryinput=
207.46.133.140"
http://ws.arin.net/cgibin/
whois.pl
Команда Curl с параметром -d отыскивает данные в форме, в данном случае queryinput, которые представляют собой искомый IP-адрес. При этом меняется целевой адрес; форма должна передавать данные на новый URL, который представляет сценарий whois.pl. Новый целевой адрес можно увидеть на выходе formfind на экране 1. В данном примере также получен исходный текст HTML ответа Whois, но он скрыт группой тэгов HTML. По умолчанию сообщение о статусе Curl показывает размер документа, процент выполнения и скорость пересылки. Выходные данные можно немного расчистить и отфильтровать имя организации, которой принадлежит IP-адрес. Статус Curl можно блокировать с помощью параметра -s. Команду следует выполнять через grep, чтобы получить только OrgName: Curl -s -d "queryinput=
207.46.133.140"
http://ws.arin.net/cgibin/
whois.pl
| grep OrgName
В данном примере выходные результаты показывают, что OrgName - Microsoft Corp. @echo off
curl -k -s -d "queryinput=
%1" http://ws.arin.net/cgibin/
whois.pl | grep OrgName
Пересылка Web-файлов из командной строки Реальный практический пример: вам нужно перезагрузить роутер (модем) для смены IP адреса. Для этого нужно: авторизоваться в роутере, перейти к странице обслуживания и нажать кнопку «Перезагрузка». Если это действие нужно выполнить несколько раз, то процедуру нужно повторить. Согласитесь, делать каждый раз в ручную эту рутину не хочется. cURL позволяет автоматизировать всё это. Буквально несколькими командами cURL можно добиться авторизации и выполнения задания на роутере. Т.е. случаи использования cURL вполне реальные, хотя, в большинстве, cURL нужна программистам, которые используют её для своих программ. CURL поддерживает множество протоколов и способов авторизации, умеет передавать файлы, правильно работает с кукиз, поддерживает SSL сертификаты, прокси и очень многое другое. cURL в PHP и командной строке
Мы можем использовать cURL двумя основными способами: в скриптах PHP и в командной строке. Чтобы включить cURL в PHP на сервере, необходимо в файле php.ini раскомментировать строку Extension=php_curl.dll А затем перезагрузить сервер. На Linux необходимо установить пакет curl. На Debian, Ubuntu или Linux Mint: $ sudo apt-get install curl $ sudo yum install curl Чтобы наглядно было видно разницу в использовании в PHP и в командной строке, будем одни и те же задачи выполнять дважды: сначала в скрипте PHP, а затем в командной строке. Постараемся при этом не запутаться. Получение данных при помощи cURL
Получение данных при помощи cURL в PHP
Пример на PHP: Всё очень просто: curl_init
- инициализирует новый сеанс и возвращает дискриптор, который в нашем примере присваивается переменной $ch
. Затем мы выполняем запрос cURL функцией curl_exec
, которой в качестве параметра передаётся дискриптор. Всё очень логично, но при выполнении этого скрипта, на нашей странице отобразиться содержимое сайта. А что если мы не хотим отображать содержимое, а хотим записать его в переменную (для последующей обработки или парсинга). Чуть дополним наш скрипт: 0) {
echo "Ошибка curl: " . curl_error($ch);
}
curl_close($ch);
?> У нас появилась строчка curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
. curl_setopt
- задаёт опции. Полный список опций можно найти на этой странице:
Скрыто от гостей $response_data = curl_exec($ch);
Теперь значение скрипта присваивается переменной $response_data, с которой можно проводить дальнейшие операции. Например, можно вывести её содержимое. Строчки If (curl_errno($ch) > 0) {
echo "Ошибка curl: " . curl_error($ch);
} служат для отладки, на случай возникновения ошибок. Получение данных при помощи cURL в командной строке
В командной строке достаточно набрать где вместо mi-al.ru
- адрес вашего сайта. Если нужно скопировать данные в переменную, а не выводить полученный результат на экран, то делаем так: Temp="curl mi-al.ru" При этом всё равно выводятся некие данные: Чтобы они не выводились, добавляем ключ -s
: Temp="curl -s mi-al.ru" Можно посмотреть, что записалось: Echo $temp | less Аутентификация, проще говоря, это введение имени пользователя и пароля. Базовая аутентификация - это аутентификация средствами сервера. Для этого создаются два файла: .htaccess
и .htpasswd
Содержимое файла.htaccess примерно такое AuthName "Только для зарегистрированных пользователей!"
AuthType Basic
require valid-user
AuthUserFile /home/freeforum.biz/htdocs/.htpassw Mial:CRdiI.ZrZQRRc Т.е. логин и хэш пароля. При попытке получить доступ к запароленной папке, в браузере отобразиться примерно такое окно: HTTP аутентификация - это тот случай, когда мы вводим логин и пароль в форму на сайте. Именно такая аутентификация используется при входе в почту, на форумы и т. д. Базовая аутентификация cURL (PHP)
Есть сайт
Скрыто от гостей Пробуем наш первоначальный скрипт: 0) {
echo "Ошибка curl: " . curl_error($ch);
} else {
echo $response_data;
}
curl_close($ch);
?> Хотя скрипт и считает, что ошибки нет, но выводимый результат нам совсем не нравится: Добавляем две строки: Curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "ru-board:ru-board"); Первой строкой мы задаём тип аутентификации - базовая. Вторая строка содержит имя и пароль через двоеточие (в нашем случае имя и пароль одинаковые - ru-board). Получилось так: 0) {
echo "Ошибка curl: " . curl_error($ch);
} else {
echo $response_data;
}
curl_close($ch);
?>
Пробуем:
30946
Отлично!
Базовая аутентификация cURL (в командной строке)
Этого же самого в командной строке можно добиться одной строчкой:
curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ Я не забыл указать тип аутентификации, просто в cURL базовый тип аутентификации является дефолтным. В командной строке всё получилось так быстро, что от расстройства я написал вот такую программу. Она подключается к сайту и скачивает самое последнее обновление: Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o "Update_FED_201{1}.{2}.{2}.7z" | uniq | tail -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp Буквально ещё несколькими командами можно добавить: HTTP аутентификация cURL в PHP
Нам нужно знать: Адрес, куда нужно отправить данные, можно взять из формы аутентификации. Например: Мы смотрим на свойство action
. Т.е. конечной страницей является login.php
. Нам нужен полный адрес, например такой
Скрыто от гостей Здесь же мы находим и метод отправки: method="post"
Логин и пароль я тоже знаю: admin и qwerasdfzxcv 0) {
echo "Ошибка curl: " . curl_error($ch);
} else {
}
curl_close($ch);
?> В скрипте новая строка curl_setopt($ch, CURLOPT_POSTFIELDS, "LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv");
Здесь curl_setopt
- уже знакомая нам функция по установлению опций для cURL, CURLOPT_POSTFIELDS
- эта имя опции, которую мы устанавливаем. CURLOPT_POSTFIELDS
содержит все данные, которые передаются методом POST. Ну и сама строчка LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv
- это те самые данные, которые мы передаём. Если внимательно изучить форму, то можно увидеть, что она содержит также и скрытые поля. А ещё данные могут обрабатываться или дополняться JavaScript"ами. Можно заняться изучением всего этого, но я предпочитаю более простой способ. Я использую Wireshark. Эта программа предназначена для снифинга (перехвата) трафика. И именно в ней очень удобно смотреть, что же именно передаётся на сайт. Посмотрите это крошечное видео: Я вписал верный параметр, а также чуть доработал скрипт, чтобы он не просто авторизовался, но и кое-что получал из роутера: 0) {
echo "Ошибка curl: " . curl_error($ch);
} else {
$target_url2 = "http://188.35.8.64:8080/bsc_wlan.php";
$ch2 = curl_init($target_url2);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
$response_data2 = curl_exec($ch2);
preg_match("|f.ssid.value = "(.*)";|", $response_data2, $results2);
$results2 = str_replace("f.ssid.value = "", "", $results2);
$results2 = str_replace("";", "", $results2);
echo "Имя wi-fi сети: $results2 Скрыто от гостей
(Это общеизвестная уязвимость роутеров D-Link DIR-300, D-Link DIR-320, и D-Link DAP-1353). HTTP аутентификация cURL в командной строке
Полный адрес, а также строку, которую нужно передать, мы уже знаем. Поэтому всё просто: Curl --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php Думаю, всё и так понятно, т. к. эти сроки мы уже рассмотрели. Если кому-то непонятно - спрашивайте в комментариях. Примером использования cURL для получения и парсинга данных может стать следующий набор команд: Curl -s --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php > /dev/null && echo -e "nn" && echo "Имя сети Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f.ssid.value = "(.)*";" | sed "s/f.ssid.value = "//" | sed "s/";//" && echo "Пароль сети Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f_wpa.wpapsk1.(.)*";" | sed "s/f_wpa.wpapsk1.value//" | sed "s/";//" | sed "s/="//" Данные заголовок правильнее было бы написать так: «Сложные» случаи авторизации. Т.е. слово «сложные» взять в кавычки. Сложными они видятся только на первый взгляд, когда непонятно: куда происходит отправка, какие имена полей, что именно отправляется и т. д. Но, на самом деле, все они сводятся к методам POST или GET. Чтобы понять, что именно отправляется, можно сохранить страницу с формой себе на диск и на кнопку отправки повесить функцию показа сформированных для отправки данных. Или ещё проще - как я, Wireshark"ом. Если данные правильные, а аутентификация не происходит, то нужно копать в следующих направлениях: Типсы и триксы cURL
cURL и получение кукиз помимо CURLOPT_COOKIEJAR
Думаю, уже стало понятно, что cURL правильно обрабатывает куки - сохраняет их, использует, когда сервер запрашивает, и т. д. Но иногда куки нужно сохранить. Для этого есть опция CURLOPT_COOKIEJAR, но воспользоваться ей можно не всегда. Этому и посвящён наш первый трюк. Иногда из-за особенностей настройки PHP на сервере, нам недоступны такие опции как CURLOPT_COOKIEJAR (позволяет сохранить полученные куки в файл) и CURLOPT_COOKIEFILE (позволяет использовать куки из файла). Т.к. они говорят, что используя эти опции мы сможем стянуть любой файл с их сервера. Вот решение этой проблемы: 1) Не используем CURLOPT_FOLLOWLOCATION Preg_match_all("|Set-Cookie: (.*);|U", $content, $results);
$cookies = implode(";", $results); 4) Задаём их используя curl_setopt($ch, CURLOPT_COOKIE, $cookies); Второй совет. Из атакующих мы можем превратиться в жертву. Чтобы не стать жертвой атаки человек-по-середине, делаем так.
Пожалуйста, все, перестаньте устанавливать настройку CURLOPT_SSL_VERIFYPEER на false или 0. Если ваша установка PHP не имеет актуального комплекта корневых сертификатов CA, загрузите один на веб-сайте curl и сохраните его на ваш сервер: Скрыто от гостей Затем задайте путь в вашем файле php.ini file, например, на Windows: Curl.cainfo=c:phpcacert.pem Отключение CURLOPT_SSL_VERIFYPEER позволяет осуществить атаку человек-по-середине (MITM), а это нам не надо! Ну и последняя на сегодня подсказка. Знаете ли вы, что возможно большое количество асинхронных запросов curl?
Для этого можно использовать curl_multi_init
. Подробности и пример кода в официальной документации
Скрыто от гостей Скрыто от гостей Скрыто от гостей (PHP 4 >= 4.0.2, PHP 5, PHP 7) curl_setopt
— Устанавливает параметр для сеанса CURL
Дескриптор cURL, полученный из curl_init()
. Устанавливаемый параметр CURLOPT_XXX
. Значение параметра option . bool
: TRUE
для отмены индикатора прогресса при передачах cURL. Замечание
: PHP автоматически устанавливает этот параметр в TRUE
, меняйте
его только для отладочных целей. Для следующих значений параметра option ,
параметр value должен быть типа
integer
: Замечание
: Эта опция устарела, так как никогда не была реализована в cURL и
не работала. Можно использовать побитовый оператор |
(или)
для комбинации нескольких методов вместе. В этом случае
cURL опросит сервер на предмет поддерживаемых методов
авторизации и выберет лучший из них. CURLAUTH_ANY - это псевдоним
CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM
. CURLAUTH_ANYSAFE - это псевдоним
CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM
. Битовая маска из значений CURLPROTO_*
.
Данная маска ограничивает используемые libcurl протоколы.
Это позволяет иметь libcurl, работающую с большим количеством
протоколов, и ограничивать работу определенных передач только
для некоторого их набора. По умолчанию, libcurl использует
все поддерживаемые протоколы.
Смотрите также параметр CURLOPT_REDIR_PROTOCOLS
. Корректные значения протоколов:
CURLPROTO_HTTP ,
CURLPROTO_HTTPS ,
CURLPROTO_FTP ,
CURLPROTO_FTPS ,
CURLPROTO_SCP ,
CURLPROTO_SFTP ,
CURLPROTO_TELNET ,
CURLPROTO_LDAP ,
CURLPROTO_LDAPS ,
CURLPROTO_DICT ,
CURLPROTO_FILE ,
CURLPROTO_TFTP ,
CURLPROTO_ALL Для следующих значений параметра option ,
параметр value должен быть типа
string
: Собственный метод запроса, используемый вместо
"GET"
или "HEAD"
при выполнении HTTP-запроса. Это полезно при запросах
"DELETE"
или других, более редких HTTP-запросах.
Корректными значениями будут слова наподобие "GET"
,
"POST"
, "CONNECT"
и так далее;
т.е. не вводите здесь всю строку с HTTP-запросом. Например,
указание "GET /index.html HTTP/1.0\r\n\r\n"
будет неправильным. Замечание
: Не используйте эту возможность пока не убедитесь, что
сервер поддерживает данный тип запроса. Тайный пароль, необходимый для использования закрытого
ключа SSL, указанного параметром
CURLOPT_SSLKEY
. Замечание
: Так как этот параметр содержит ценный пароль, помните,
что данный PHP-скрипт нужно хранить в безопасном месте. Для следующих значений параметра option ,
параметр value должен быть массивом: Для следующих значений параметра option ,
параметр value должен быть потоковым
дескриптором (возвращаемым, например, функцией fopen()
): Для следующих значений параметра option ,
параметр value должен быть правильным именем функции
или замыканием: Callback-функция принимает пять параметров.
Первый является декскриптором cURL, второй - общим количеством байт,
которое ожидается загрузить с сервера, третий - количество уже загруженных байт,
четвертый - общее количество байт, которое ожидается отправить на сервер,
и пятый - количество уже отправленных байт. Замечание
: Callback-функция вызывается только, если опция CURLOPT_NOPROGRESS
установлена в значение FALSE
. Можно вернуть ненулевое значение, чтобы отменить передачу.
В этом случае будет выставлена ошибка CURLE_ABORTED_BY_CALLBACK
. Другие значения: Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки. Пример #1 Инициализация сеанса CURL и загрузка web-страницы
// создание нового ресурса cURL /* http://localhost/upload.php:
$ch
=
curl_init
();
$data
= array("name"
=>
"Foo"
,
"file"
=>
"@/home/user/test.png"
); Curl_setopt
($ch
,
CURLOPT_URL
,
"http://localhost/upload.php"
); Curl_exec
($ch
); Результат выполнения данного примера: Array
( => Foo)
Array
( => Array
( => test.png
=> image/png
=> /tmp/phpcpjNeQ
=> 0
=> 279)) Замечание
: Передача массива в CURLOPT_POSTFIELDS
закодирует данные в виде multipart/form-data
,
тогда как передача URL-кодированной строки закодирует данные в виде
application/x-www-form-urlencoded
. У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта! PHP поддерживает libcurl, библиотеку, созданную Daniel"ом Stenberg"ом,
которая даёт возможность соединяться с серверами различных типов и по разным протоколам. Эти функции были введены в PHP 4.0.2. curl_init - инициализирует CURL-сессию. resource curl_init
() Функция curl_init()
инициализирует новую сессию и возвратит CURL-дескриптор для
использования в функциях ,
и .
Если необязательный параметр url
предоставлен, то опция
CURLOPT_URL получит значение этого параметра. Вы можете вручную устанавливать его с помощью функции
. curl_setopt - устанавливает опции для CURL-трансфера/transfer. bool curl_setopt
(resource ch, string option, mixed value) Функция curl_setopt()
устанавливает опции для CURL-сессии, идентифицируемой параметром ch
.
Параметр option
является опцией, которую вы хотите установить, а value
это значение опции
option
. Параметр value
должен быть long для следующих опций (специфицированных параметром option
): Параметр value
должен быть строкой для следующих значений параметра option
: Следующие опции ожидают дескриптора файла, который получается с помощью функции
fopen()
: Параметр value
long write_callback (resource ch, string data){ ... return strlen($data);}
option
: Параметр value
должен быть функцией следующего вида
string read_callback (resource ch, resource fd, long length){}
для следующих значений параметра option
: curl_exec - выполняет CURL-сессию. bool curl_exec
(resource ch) Эта функция должна вызываться после того, как вы инициализируете сессию CURL
и все опции этой сессии уже установлены. Её назначение в том, чтобы просто
выполнить предопределённую CURL-сессию (заданную в параметре ch
). curl_close - закрывает CURL-сессию. void curl_close
(resource ch) Эта функция закрывает сессию CURL и освобождает все ресурсы.
CURL-дескриптор ch
также удаляется. curl_errno - возвращает целое число, содержащее номер последней ошибки. Если Вам нужно будет отправить в POST запросе многомерный массив и файл, то вы столкнетесь с неразрешимой проблемой.
Если передавать в CURLOPT_POSTFIELDS многомерный массив, то второй уровень будет передан как строка "Array".
Если преобразовать с помощью http_build_query, то Вы не сможете передать файл. Ниже представлена функция кодирования двумерного массива с подгрузкой файлов для Curl,
которая будет работать как в старых версиях PHP 5.3, PHP 5.4, так и в PHP 5.6
/** преобразует многомерный массив в одномерный, используйя сложные индексы и заменяет @ в префиксе на CurlFile для испрользоания в Curl
* @param $inputArray
* @param string $inputKey
* @return array
$requestVars = array("id" => array(1, 2,"id"=>1234),
"name" => "log",
"logfile" => "@/tmp/test.log");
получим:
["id"]=> int(1)
["id"]=> int(2)
["id"]=> int(1234)
["name"]=> string(3) "log"
["logfile"]=> string(13) "/tmp/test.log" }
*/
function convertToStringArray($inputArray, $inputKey="") {
$resultArray=;
foreach ($inputArray as $key => $value) {
$tmpKey = (bool)$inputKey ? $inputKey."[$key]" : $key;
if (is_array($value)) {
$resultArray+=convertToStringArray($value, $tmpKey);
} elseif ($value == "@"){
$resultArray[$tmpKey] = (class_exists(" CURLFile ", false)) ? new CurlFile(ltrim($value, "@")) : $value;
} else {
$resultArray[$tmpKey] = $value;
}
}
return $resultArray;
}
// проверяем
$requestVars = array("id" => array(1, 2,"id"=>1234),
"name" => "log",
"logfile" => "@/tmp/test.log");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "htmlweb.ru");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars));
$res = curl_exec($ch);
curl_close($ch);
Прикладные4. Загрузить с предельной скоростью
5. Использование прокси для подключения
6. Проверка URL-адресас введением заголовка
7. Добавить дополнительный заголовок
8. Открыть только заголовок ответа
9. Подключить HTTPS / SSLURL-адрес и игнорировать любые ошибки SSL -сертификата
10. Подключиться с использованием определенного протокола (SSL / TLS)
11. Загрузить файл с FTP-сервера
Использования cURL онлайн
Online CURL
— компактный инструмент для извлечения URL-адреса онлайн и добавления следующих параметров.
cURL command line builder
–позволяет создать команду cURL, с помощью которой можно ввести информацию в пользовательский интерфейс.
Curl поможет управлять данными, размещенными в Web
Установка Curl
Извлечение шифрованных данных
Не только для WWW
Аутентификация
Читайте документацию
Пример использования Curl
Ещё один практический пример: мы хотим реализовать показ общей статистики для нескольких сайтов. Если использовать cURL, то это становится вполне тривиальной задачей: с помощью cURL мы проходим аутентификацию на сервисе сбора статистики (если это требуется), затем (опять же командами cURL) получаем необходимые страницы, парсим нужные нам данные; процедура повторяется для всех наших сайтов, затем мы складываем и выводим конечный результат.
На Fedora, CentOS или RHEL:
$target_url
- адрес сайта, который нас интересует. После адреса сайта можно поставить двоеточие и добавить адрес порта (если порт отличается от стандартного).
Содержимое файла.htpasswd примерно такое:
HTTP аутентификация cURL
Иногда этих данных оказывается недостаточно. Давайте разберёмся.
Т.е. на сервер из формы передаётся строка методом POST. Теоретически, наш предыдущий скрипт, в которое мы добавили новую строчку, должен работать. Т.е. должна происходить аутентификация.
Т.е. с адресом, куда передаются данные, я угадал. А вот передаваемая строка оказалась намного сложнее.
";
preg_match("|f_wpa.wpapsk1.value(.*)";|", $response_data2, $results3);
$results3 = str_replace("f_wpa.wpapsk1.value", "", $results3);
$results3 = str_replace("="", "", $results3);
$results3 = str_replace("";", "", $results3);
echo "Пароль wi-fi сети: $results3";
}
curl_close($ch);
?>
Всё это можно сделать базовыми методами cURL, но я не буду на этом останавливаться. Урок получился и без того большим, а ведь я ещё хотел показать пару трюков с cURL.
2) Используем curl_setopt($ch, CURLOPT_HEADER, 1)
3) Собираем кукизы из заголовка header примерно так:
Про cURL в командной строке
Для чтения на русском языке также подготовлена вторая часть урока cURL: " ".
Список параметров
Параметр
Замечания
CURLOPT_AUTOREFERER
TRUE
для автоматической установки поля Referer:
в запросах, перенаправленных заголовком Location:
.
CURLOPT_BINARYTRANSFER
TRUE
для возврата необработанного ответа при использовании
константы CURLOPT_RETURNTRANSFER
.
С PHP 5.1.3 эта опция больше не требуется: необработанный вывод
всегда возвращается при использовании опции CURLOPT_RETURNTRANSFER
.
CURLOPT_COOKIESESSION
TRUE
для указания текущему сеансу начать новую "сессию" cookies.
Это заставит libcurl проигнорировать все "сессионные" cookies,
которые она должна была бы загрузить, полученные из предыдущей
сессии. По умолчанию, libcurl всегда сохраняет и загружает
все cookies, вне зависимости от того, являются ли они "сессионными"
или нет. "Сессионные" cookies - это cookies без срока истечения,
которые должны существовать только для текущей "сессии".
CURLOPT_CERTINFO
TRUE
для вывода информации о сертификате SSL в поток STDERR
при безопасных соединениях.
Добавлена в cURL 7.19.1.
Доступна, начиная с версии PHP 5.3.2. Для корректной работы требует
включенной опции CURLOPT_VERBOSE
.
CURLOPT_CONNECT_ONLY
TRUE
сообщает библиотеке, чтобы она провела необходимые аутентификацию прокси
и настройку соединения, но не передавала данные. Эта опция реализована для
HTTP, SMTP и POP3.
Добавлена в 7.15.2.
Доступна с версии PHP 5.5.0.
CURLOPT_CRLF
TRUE
для преобразования концов строк Unix в CRLF.
CURLOPT_DNS_USE_GLOBAL_CACHE
TRUE
для использования глобального кэша DNS. Этот параметр не
является потокобезопасным и по умолчанию включен.
CURLOPT_FAILONERROR
TRUE
для подробного отчета при неудаче, если полученный HTTP-код
больше или равен 400. Поведение по умолчанию возвращает страницу
как обычно, игнорируя код.
CURLOPT_FILETIME
TRUE
для попытки получения даты модификации удаленного
документа. Это значение может быть получено с помощью
параметра CURLINFO_FILETIME из
функции curl_getinfo()
.
CURLOPT_FOLLOWLOCATION
TRUE
для следования любому заголовку
"Location: "
, отправленному сервером в своем
ответе (учтите, что это происходит рекурсивно, PHP будет следовать
за всеми посылаемыми заголовками "Location: "
,
за исключением случая, когда установлена константа
CURLOPT_MAXREDIRS
).
CURLOPT_FORBID_REUSE
TRUE
для принудительного закрытия соединения после
завершения его обработки так, чтобы его нельзя было использовать
повторно.
CURLOPT_FRESH_CONNECT
TRUE
для принудительного использования нового соединения
вместо закэшированного.
CURLOPT_FTP_USE_EPRT
TRUE
для использования EPRT (и LPRT) при активных FTP
загрузках. Используйте FALSE
для того, чтобы отключить EPRT и LPRT
и использовать только PORT.
CURLOPT_FTP_USE_EPSV
TRUE
для первоначальной пробы команды EPSV при FTP
передачах. Если команда не удалась, будет произведен обратный
откат к PASV. Установите в FALSE
для отключения EPSV.
CURLOPT_FTP_CREATE_MISSING_DIRS
TRUE
для создания отсутствующих директорий, если FTP-операция
обнаруживает несуществующий путь.
CURLOPT_FTPAPPEND
TRUE
для записи удаленного файла в конец, вместо
перезаписывания его поверх существующего файла.
CURLOPT_TCP_NODELAY
Задает на постоянной основе должна ли опция TCP_NODELAY установлена или
очищена (1 = установлена, 0 = очищена). По умолчанию опция очищается.
Доступна с версии PHP 5.2.1 для версий собранных с libcurl 7.11.2 или новее.
CURLOPT_FTPASCII
Псевдоним CURLOPT_TRANSFERTEXT
.
Используйте его вместо этого.
CURLOPT_FTPLISTONLY
TRUE
для возврата только списка имен из FTP директории.
CURLOPT_HEADER
TRUE
для включения заголовков в вывод.
CURLINFO_HEADER_OUT
TRUE
для отслеживания строки запроса дескриптора.
Доступен, начиная с версии PHP 5.1.3. Префикс CURLINFO_
употреблен специально.
CURLOPT_HTTPGET
TRUE
для сброса метода HTTP-запроса в метод GET.
Так как GET используется по умолчанию, этот параметр необходим только
в случае, если метод запроса был ранее изменен.
CURLOPT_HTTPPROXYTUNNEL
TRUE
для туннелирования через указанный HTTP-прокси.
CURLOPT_MUTE
TRUE
для полного отключения сообщений функций cURL.
Удалена в cURL 7.15.5 (Можно использовать опцию CURLOPT_RETURNTRANSFER)
CURLOPT_NETRC
TRUE
для считывания файла ~/.netrc
на предмет логина и пароля для удаленного сайта, с которым
устанавливается соединение.
CURLOPT_NOBODY
TRUE
для исключения тела ответа из вывода.
Метод запроса устанавливается в HEAD. Смена этого параметра в FALSE
не меняет его обратно в GET.
CURLOPT_NOPROGRESS
CURLOPT_NOSIGNAL
TRUE
для игнорирования любой функции cURL, посылающей сигналы
PHP процессу. Этот параметр включен по умолчанию в многопоточных
SAPIs для корректной работы таймаут параметров.
CURLOPT_POST
TRUE
для использования обычного HTTP POST. Данный метод POST
использует обычный ,
обычно используемый в HTML-формах.
CURLOPT_PUT
TRUE
для загрузки файла методом HTTP PUT. Используемый файл
должен быть установлен с помощью параметров
CURLOPT_INFILE
и
CURLOPT_INFILESIZE
.
CURLOPT_RETURNTRANSFER
TRUE
для возврата результата передачи в качестве
строки из curl_exec()
вместо прямого
вывода в браузер.
CURLOPT_SAFE_UPLOAD
TRUE
для отключения поддержки префикса @
для
загружаемых файлов в CURLOPT_POSTFIELDS
, который
означает, что значения, переданные с @
могут безопасно
передаваться в виде полей. Вместо префикса можно использовать опцию CURLFile
d.
Добавлена в PHP 5.5.0 со значением по умолчанию FALSE
. В PHP 5.6.0
стала по умолчанию равна TRUE
.
CURLOPT_SSL_VERIFYPEER
FALSE
для остановки cURL от проверки сертификата узла сети.
Альтернативные сверяемые сертификаты могут быть указаны с помощью
параметра CURLOPT_CAINFO
или директории с
сертификатами, указываемой параметром CURLOPT_CAPATH
.
По умолчанию равно TRUE
начиная с версии cURL 7.10.
Дистрибутив по умолчанию устанавливается начиная с версии cURL 7.10.
CURLOPT_TRANSFERTEXT
TRUE
для использования ASCII режима при FTP передачах.
При использовании LDAP данные возвращаются простым
текстом вместо HTML. В Windows системах поток STDOUT
не устанавливается в бинарный режим.
CURLOPT_UNRESTRICTED_AUTH
TRUE
для продолжения посылки логина и пароля при редиректах
(при использовании CURLOPT_FOLLOWLOCATION
),
даже при изменении имени хоста.
CURLOPT_UPLOAD
TRUE
для подготовки к загрузке файла на сервер.
CURLOPT_VERBOSE
TRUE
для вывода дополнительной информации. Записывает вывод в
поток STDERR
, или файл, указанный параметром
CURLOPT_STDERR
.
Параметр
Устанавливаемое значение value
Замечания
CURLOPT_BUFFERSIZE
Размер буфера, используемого при каждом чтении. Однако, нет никакой
гарантии что данный запрос будет завершен.
Добавлен в версии cURL 7.10.
CURLOPT_CLOSEPOLICY
Одна из констант CURLCLOSEPOLICY_*
.
Удалена в PHP 5.6.0.
CURLOPT_CONNECTTIMEOUT
Количество секунд ожидания при попытке соединения. Используйте
0 для бесконечного ожидания.
CURLOPT_CONNECTTIMEOUT_MS
Количество миллисекунд ожидания при попытке соединения. Используйте
0 для бесконечного ожидания.
Если библиотека libcurl скомпилирована с использованием стандартного системного преобразователя имен, то
соединение будет по-прежнему использовать полносекундное ожидание в качестве тайм-аута с
минимально допустимым тайм-аутом в 1 секунду.
Добавлен в версии cURL 7.16.2. Доступно, начиная с версии PHP 5.2.3.
CURLOPT_DNS_CACHE_TIMEOUT
Количество секунд, в течение которых в памяти хранятся DNS-записи.
По умолчанию этот параметр равен 120 (2 минуты).
CURLOPT_FTPSSLAUTH
Метод FTP аутентификации (в активном режиме):
CURLFTPAUTH_SSL
(сначала проверяется SSL),
CURLFTPAUTH_TLS
(сначала проверяется TLS) или
CURLFTPAUTH_DEFAULT
(cURL решает сама).
Добавлен в версии cURL 7.12.2.
CURLOPT_HTTP_VERSION
CURL_HTTP_VERSION_NONE (по умолчанию,
CURL сама выбирает используемую версию),
CURL_HTTP_VERSION_1_0 (принудительное использование HTTP/1.0),
or CURL_HTTP_VERSION_1_1 (принудительное использование HTTP/1.1).
CURLOPT_HTTPAUTH
CURLOPT_INFILESIZE
Ожидаемый размер файла, в байтах, при загрузке файла на удаленный сервер.
Учтите, что использование этой опции не остановит дальнейшую
посылку данных, превышающих это значение, так как посылаемые
данные зависят от результата
CURLOPT_READFUNCTION
.
CURLOPT_LOW_SPEED_LIMIT
Верхний порог скорости передачи данных, в байтах в секунду.
Проверка происходит в течение
CURLOPT_LOW_SPEED_TIME
секунд, после чего
PHP считает передачу слишком медленной и прерывает ее.
CURLOPT_LOW_SPEED_TIME
Максимальное количество секунд, в течение которых скорость передачи
не должна превышать CURLOPT_LOW_SPEED_LIMIT
, иначе
PHP пометит передачу как слишком медленную и прекратит ее.
CURLOPT_MAXCONNECTS
Максимальное количество постоянных соединений.
При достижении лимита для определения закрываемого соединения
используется параметр CURLOPT_CLOSEPOLICY
.
CURLOPT_MAXREDIRS
Максимальное количество принимаемых редиректов.
Используйте этот параметр вместе с параметром
CURLOPT_FOLLOWLOCATION
.
CURLOPT_PORT
Альтернативный порт соединения.
CURLOPT_POSTREDIR
Битовая маска, содержащая 1 (301 Moved Permanently), 2 (302 Found)
и 4 (303 See Other), чтобы задавать должен ли метод
HTTP POST обрабатываться при включенной опции
CURLOPT_FOLLOWLOCATION
, если произошел
указанный тип перенаправления.
Добавлено в cURL 7.19.1. Доступно с PHP 5.3.2.
CURLOPT_PROTOCOLS
CURLOPT_PROXYAUTH
Методы авторизации HTTP, используемые при соединении с
прокси-сервером. Используйте те же самые битовые маски,
которые были описаны у параметра
CURLOPT_HTTPAUTH
.
В данный момент для авторизации прокси поддерживаются только
CURLAUTH_BASIC и
CURLAUTH_NTLM .
Добавлен в версии cURL 7.10.7.
CURLOPT_PROXYPORT
Номер порта прокси-сервера, к которому осуществляется
соединение. Этот номер также может быть установлен
с помощью параметра CURLOPT_PROXY
.
CURLOPT_PROXYTYPE
Либо CURLPROXY_HTTP (по умолчанию), либо
CURLPROXY_SOCKS5 .
Добавлен в версии cURL 7.10.
CURLOPT_REDIR_PROTOCOLS
Битовая маска из значений CURLPROTO_*
.
Данная битовая масска ограничивает протоколы используемые
libcurl при редиректе (при включенном параметре
CURLOPT_FOLLOWLOCATION
).
Это позволяет ограничить набор используемых протоколов
при редиректах для некоторых передач.
По умолчанию, libcurl поддерживает все протоколы, кроме
FILE и SCP. В версиях, предшествовавших 7.19.4,
перенаправление использовалось для всех протоколов
без исключения.
Смотрите также описание параметра
CURLOPT_PROTOCOLS
для списка констант
со значениями протоколов.
Добавлен в версии cURL 7.19.4.
CURLOPT_RESUME_FROM
Смещение начала передачи, в байтах.
CURLOPT_SSL_VERIFYHOST
Используйте 1 для проверки существования общего имени в сертификате
SSL. Используйте 2 для проверки существования общего
имени и также его совпадения с указанным хостом. В боевом окружении
значение этого параметра должно быть 2 (установлено по умолчанию).
Поддержка значения 1 убрана в cURL 7.28.1
CURLOPT_SSLVERSION
Одна из констант CURL_SSLVERSION_DEFAULT
(0),
CURL_SSLVERSION_TLSv1
(1),
CURL_SSLVERSION_SSLv2
(2),
CURL_SSLVERSION_SSLv3
(3),
CURL_SSLVERSION_TLSv1_0
(4),
CURL_SSLVERSION_TLSv1_1
(5) или
CURL_SSLVERSION_TLSv1_2
(6).
CURLOPT_TIMECONDITION
Способ трактовки параметра CURLOPT_TIMEVALUE
.
Используйте CURL_TIMECOND_IFMODSINCE для
возвращения страницы, только если она была изменена со времени,
указанного в параметре CURLOPT_TIMEVALUE
.
Если страница не была изменена, вернется заголовок
"304 Not Modified"
, подразумевая, что
параметр CURLOPT_HEADER
установлен в TRUE
.
Используйте CURL_TIMECOND_IFUNMODSINCE
для обратного эффекта. По умолчанию используется
CURL_TIMECOND_IFMODSINCE .
CURLOPT_TIMEOUT
Максимально позволенное количество секунд для выполнения
cURL-функций.
CURLOPT_TIMEOUT_MS
Максимально позволенное количество миллисекунд для выполнения
cURL-функций.
Если libcurl собрана с использованием обычного системного
распознавателя имен, то этот промежуток соединения все еще
будет использовать секундное округление таймаутов,
с минимально разрешенным таймаутом в одну секунду.
Добавлен в версии cURL 7.16.2. Доступен, начиная с версии PHP 5.2.3.
CURLOPT_TIMEVALUE
Количество секунд, начиная с 1 января 1970 года. Это время
будет использовано параметром
CURLOPT_TIMECONDITION
. По умолчанию,
используется параметр
CURL_TIMECOND_IFMODSINCE .
CURLOPT_MAX_RECV_SPEED_LARGE
Если скорость скачки превысит это значение (указанное в байтах
в секунду) в среднем в течение всей передачи, то скачка будет
приостановлена для поддержания средней скорости меньше либо равной
данному параметру. По умолчанию скорость не ограничивается.
CURLOPT_MAX_SEND_SPEED_LARGE
Если загрузка на сервер превысит это значение (указанное в байтах
в секунду) в среднем в течение всей передачи, то загрузка будет
приостановлена для поддержания средней скорости меньше либо равной
данному параметру. По умолчанию скорость не ограничивается.
Добавлен в версии cURL 7.15.5. Доступен, начиная с версии PHP 5.4.0.
CURLOPT_SSH_AUTH_TYPES
Битовая маска, состоящая из одной или более констант:
CURLSSH_AUTH_PUBLICKEY
,
CURLSSH_AUTH_PASSWORD
,
CURLSSH_AUTH_HOST
,
CURLSSH_AUTH_KEYBOARD
. Установите
CURLSSH_AUTH_ANY
для того, чтобы libcurl выбрал одну из них самостоятельно.
Добавлено в cURL 7.16.1.
CURLOPT_IPRESOLVE
Позволяет приложению выбрать вид IP адреса, с которым определяется имя хоста.
Это необходимо, если используется имя хоста, которое получается с использованием
более одной версии IP адреса. Возможными значениями могут быть
CURL_IPRESOLVE_WHATEVER
,
CURL_IPRESOLVE_V4
,
CURL_IPRESOLVE_V6
, и по умолчанию
CURL_IPRESOLVE_WHATEVER
.
Добавлено в cURL 7.10.8.
Параметр
Устанавливаемое значение value
Замечания
CURLOPT_CAINFO
Имя файла, содержащего один или более сертификатов, с которыми
будут сверяться узлы. Этот параметр имеет смысл только при
использовании совместно с CURLOPT_SSL_VERIFYPEER
.
Требует абсолютный путь.
CURLOPT_CAPATH
Директория, содержащая несколько CA сертификатов.
Используйте этот параметр совместно с
CURLOPT_SSL_VERIFYPEER
.
CURLOPT_COOKIE
Содержимое заголовка "Cookie: "
,
используемого в HTTP-запросе.
Обратите внимание, что несколько cookies разделяются
точкой с запятой с последующим пробелом
(например, "fruit=apple; colour=red
")
CURLOPT_COOKIEFILE
Имя файла, содержащего cookies. Данный файл должен быть
в формате Netscape или просто заголовками HTTP, записанными
в файл.
Если в качестве имени файла передана пустая строка, то cookies
сохраняться не будут, но их обработка все еще будет включена.
CURLOPT_COOKIEJAR
Имя файла, в котором будут сохранены все внутренние cookies
текущей передачи после закрытия дескриптора, например,
после вызова curl_close.
CURLOPT_CUSTOMREQUEST
CURLOPT_EGDSOCKET
Наподобие CURLOPT_RANDOM_FILE
, за исключением
того, что имя файла устанавливается в сокет Entropy
Gathering Daemon.
CURLOPT_ENCODING
Содержимое заголовка "Accept-Encoding: "
.
Это позволяет декодировать запрос. Поддерживаемыми
кодировками являются "identity"
,
"deflate"
и "gzip"
.
Если передана пустая строка, ""
,
посылается заголовок, содержащий все поддерживаемые
типы кодировок.
Добавлен в версии cURL 7.10.
CURLOPT_FTPPORT
Значение, которое будет использоваться для определения
IP-адреса для команды "PORT" FTP-протокола. Команда "PORT"
сообщает серверу, с каким IP-адресом он должен устанавливать
соединение. Это может быть IP-адрес, имя хоста, имя сетевого
интерфейса (под Unix), или просто "-" для использования системного
IP-адреса по умолчанию.
CURLOPT_INTERFACE
Имя используемого сетевого интерфейса. Может быть
именем интерфейса, IP адресом или именем хоста.
CURLOPT_KEYPASSWD
Пароль, который требуется для использования приватного ключа CURLOPT_SSLKEY
или CURLOPT_SSH_PRIVATE_KEYFILE
.
Добавлено в cURL 7.16.1.
CURLOPT_KRB4LEVEL
Уровень безопасности KRB4 (Kerberos 4). Любое из следующих
значений (в порядке от слабого к самому сильному) корректно:
"clear"
,
"safe"
,
"confidential"
,
"private".
.
Если указанная строка отличается от данных значений,
будет использовано значение "private"
.
Установка этого параметра в NULL
полностью отключит
безопасность KRB4. На данный момент безопасность KRB4
работает только с FTP транзакциями.
CURLOPT_POSTFIELDS
Все данные, передаваемые в HTTP POST-запросе.
Для передачи файла, укажите перед именем файла @
, а
также используйте полный путь к файлу. Тип файла также может
быть указан с помощью формата ";type=mimetype
",
следующим за именем файла. Этот параметр может быть передан
как в качестве url-закодированной строки, наподобие
"para1=val1¶2=val2&...
", так и
в виде массива, ключами которого будут имена полей, а значениями
- их содержимое.
Если value является массивом,
заголовок Content-Type
будет установлен в
значение multipart/form-data
.
Начиная с версии PHP 5.2.0, при передаче файлов с префиксом
@
, value должен быть
массивом.
С версии PHP 5.5.0, префикс @
устарел и
файлы можно отправлять с помощью CURLFile
.
Префикс @
можно отключить, чтобы можно
было передавать значения, начинающиеся с @
,
задав опцию CURLOPT_SAFE_UPLOAD
в значение TRUE
.
CURLOPT_PROXY
HTTP-прокси, через который будут направляться запросы.
CURLOPT_PROXYUSERPWD
Логин и пароль, записанные в виде
":"
, используемые при
соединении через прокси.
CURLOPT_RANDOM_FILE
Имя файла, используемого для инициализации генератора
случайных чисел для SSL.
CURLOPT_RANGE
Диапазон данных, которые нужно загрузить, в формате
"X-Y"
, причем либо X, либо Y могут быть
опущены. Протокол HTTP также поддерживает передачу
нескольких диапазонов, разделенных запятыми, они задаются
в формате "X-Y,N-M"
.
CURLOPT_REFERER
Содержимое заголовка "Referer: "
, который будет
использован в HTTP-запросе.
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
Строка, содержащая 32 шестнадцатеричных цифры. Строка должна являться
контрольной суммой по алгоритму MD5 публичного ключа удаленного компьютера и libcurl будет сбрасывать
соединение к удаленному хосту до тех пор, пока контрольная сумма не будет соответствовать публичному ключу.
Эта опция предназначена только для передачи данных с помощью SCP и SFTP.
Добавлено в cURL 7.17.1.
CURLOPT_SSH_PUBLIC_KEYFILE
Имя файла для вашего публичного ключа. Если не задано, то libcurl использует по
умолчанию файл $HOME/.ssh/id_dsa.pub, если переменная окружения HOME установлена и
файл "id_dsa.pub" в текущей директории, если переменная HOME не установлена.
Добавлено в cURL 7.16.1.
CURLOPT_SSH_PRIVATE_KEYFILE
Имя файла для вашего приватного ключа. Если не задано, то libcurl использует по
умолчанию файл $HOME/.ssh/id_dsa, если переменная окружения HOME установлена и
файл "id_dsa" в текущей директории, если переменная HOME не установлена.
Если файл защищен паролем, установите пароль с помощью
CURLOPT_KEYPASSWD
.
Добавлено в cURL 7.16.1.
CURLOPT_SSL_CIPHER_LIST
Список шифров, используемый в SSL-передачах. Например,
RC4-SHA
и TLSv1
являются
корректными списками шифров.
CURLOPT_SSLCERT
Имя файла с корректно отформатированным PEM-сертификатом.
CURLOPT_SSLCERTPASSWD
Пароль, необходимый для использования сертификата
CURLOPT_SSLCERT
.
CURLOPT_SSLCERTTYPE
Формат сертификата. Поддерживаются форматы
"PEM"
(по умолчанию), "DER"
и "ENG"
.
Добавлен в версии cURL 7.9.3.
CURLOPT_SSLENGINE
Идентификатор механизма шифрования для закрытого ключа SSL,
указанного в параметре CURLOPT_SSLKEY
.
CURLOPT_SSLENGINE_DEFAULT
Идентификатор механизма шифрования, используемого для
ассиметричных операций шифрования.
CURLOPT_SSLKEY
Имя файла с закрытым ключом SSL.
CURLOPT_SSLKEYPASSWD
CURLOPT_SSLKEYTYPE
Тип закрытого ключа SSL, указанного в параметре
CURLOPT_SSLKEY
. Поддерживаются следующие
типы ключей:
"PEM"
(по умолчанию), "DER"
и "ENG"
.
CURLOPT_URL
Загружаемый URL. Данный параметр может быть также установлен
при инициализации сеанса с помощью curl_init()
.
CURLOPT_USERAGENT
Содержимое заголовка "User-Agent: "
, посылаемого
в HTTP-запросе.
CURLOPT_USERPWD
Логин и пароль, используемые при соединении,
указанные в формате
":"
.
Параметр
Устанавливаемое значение value
Замечания
CURLOPT_HTTP200ALIASES
Массив HTTP 200 ответов, которые будут трактоваться
корректными ответами, а не ошибочными.
Добавлен в версии cURL 7.10.3.
CURLOPT_HTTPHEADER
Массив устанавливаемых HTTP-заголовков, в формате
array("Content-type: text/plain", "Content-length: 100")
CURLOPT_POSTQUOTE
Массив FTP-команд, выполняемых на сервере, после выполнения
FTP-запроса.
CURLOPT_QUOTE
Массив FTP-команд, выполняемых на сервере, перед выполнением
FTP-запроса.
Параметр
Устанавливаемое значение value
CURLOPT_FILE
Файл, в который будет записан результат передачи. По умолчанию
используется поток вывода STDOUT
(окно браузера).
CURLOPT_INFILE
Файл, из которого должно идти чтение данных, при загрузке на сервер.
CURLOPT_STDERR
Альтернативное файл для вывода ошибок, используемый вместо потока ошибок
STDERR
.
CURLOPT_WRITEHEADER
Файл, в который будут записаны заголовки текущей операции.
Параметр
Устанавливаемое значение value
CURLOPT_HEADERFUNCTION
Callback-функция принимает два параметра.
Первым параметром является дескриптор cURL, вторым параметром
является строка с записываемыми заголовками. Заголовки должны
быть записаны с помощью данной callback-функции. Должна возвратить
количество записанных байт.
CURLOPT_PASSWDFUNCTION
Callback-функция принимает три параметра.
Первым параметром является дескриптор cURL, вторым параметром
является строка с запросом пароля, третьим параметром является
максимальная длина пароля. Должна возвратить строку, содержащую пароль.
CURLOPT_PROGRESSFUNCTION
CURLOPT_READFUNCTION
Callback-функция принимает три параметра.
Первым параметром является дескриптор cURL,
вторым параметром является ресурс потока, переданный
cURL через опцию CURLOPT_INFILE
,
а третьим параметром является максимально разрешенное
количество данных для чтения.
Callback-функция должна возвратить строку, с длиной
не превышающей запрошенного количества данных, обычно
с помощью чтения из переданного потокового ресурса.
Должна возвратить пустую строку для сигнала о конце файла
EOF
.
CURLOPT_WRITEFUNCTION
Callback-функция принимает два параметра.
Первым параметром является дескриптор cURL, а
вторым параметром является строка с записываемыми данными.
Данные должны быть сохранены с помощью данной функции.
Она должна возвратить точное количество записанных байт, иначе
закачка будет прервана с ошибкой.
Возвращаемые значения
Список изменений
Версия
Описание
5.6.0
Опция CURL_SAFE_UPLOAD
теперь имеет значение по умолчанию равное TRUE
.
5.6.0
Удалена опция CURLOPT_CLOSEPOLICY
и связанные с ней значения.
5.5.0
Ресурс cURL добавлен первым аргументом в callback-функцию
CURLOPT_PROGRESSFUNCTION
.
5.5.0
Добавлена опция CURLOPT_SHARE
.
5.3.0
Добавлена опция CURLOPT_PROGRESSFUNCTION
.
5.2.10
Добавлены параметры CURLOPT_PROTOCOLS
и
CURLOPT_REDIR_PROTOCOLS
.
5.1.0
Добавлены параметры CURLOPT_AUTOREFERER
,
CURLOPT_BINARYTRANSFER
,
CURLOPT_FTPSSLAUTH
,
CURLOPT_PROXYAUTH
и
CURLOPT_TIMECONDITION
.
5.0.0
Добавлены параметры CURLOPT_FTP_USE_EPRT
,
CURLOPT_NOSIGNAL
,
CURLOPT_UNRESTRICTED_AUTH
,
CURLOPT_BUFFERSIZE
,
CURLOPT_HTTPAUTH
,
CURLOPT_PROXYPORT
,
CURLOPT_PROXYTYPE
,
CURLOPT_SSLCERTTYPE
и
CURLOPT_HTTP200ALIASES
.
Примеры
$ch
=
curl_init
();
print_r($_POST);
print_r($_FILES);
*/
curl_setopt
($ch
,
CURLOPT_POST
,
1
);
curl_setopt
($ch
,
CURLOPT_POSTFIELDS
,
$data
);
?>
Примечания
Curl
libcurl в настоящее время поддерживает протоколы http, https, ftp, gopher, telnet, dict, file и ldap.
libcurl также поддерживает сертификаты HTTPS, HTTP POST, HTTP PUT, загрузку по FTP (это можно сделать также РНР-расширением ftp),
загрузку на основе форм HTTP, прокси, куки и аутентификацию user+password.curl_init
Описание
curl_setopt
Описание
curl_exec
Описание
curl_close
Описание
curl_errno
Описание
Пример 1. Инициализация новой сессии CURL и получение web-страницы.
Пример 2. Использование модуля CURL РНР для получения example.com
Пример 3. Проверка доступности URL с помощью CURL РНР
Пример 4. Отделение заголовка от тела, полученного с помощью CURL РНР
Пример 5. Определение адреса перехода URL с помощью CURL РНР
the problem: curl_setopt($ch,FOLLOW_LOCATION,1);
the error: trouble with open_basedir and safe_mode
the solution: a function already developed by someone
the solution n 2: the same function, modifed, works great for me..
= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
list($header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302)
{
$matches = ;
preg_match("/Location:(.*?)\n/", $header, $matches);
$url = @parse_url(trim(array_pop($matches)));
if (!$url)
{
//couldn"t process the url to redirect to
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
if (!$url["scheme"])
$url["scheme"] = $last_url["scheme"];
if (!$url["host"])
$url["host"] = $last_url["host"];
if (!$url["path"])
$url["path"] = $last_url["path"];
$new_url = $url["scheme"] . "://" . $url["host"] . $url["path"] . ($url["query"]?"?".$url["query"]:"");
curl_setopt($ch, CURLOPT_URL, $new_url);
debug("Redirecting to", $new_url);
return curl_redir_exec($ch);
} else {
$curl_loops=0;
return $data;
}
}
?>
just use this function without de FOLLOW_LOCATION and should work. the problem was that when you get to the line where you return the data if http_code was different than 301 oe 302, $data has obsolete information or none. so $debbbb does the job.
Пример 6. Разбор cookie из заголовка с помощью CURL РНР
Sometimes you can"t use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE becoz of the server
php-settings(They say u may grab any files from server using these options). Here is the solution
1)Don"t use CURLOPT_FOLLOWLOCATION
2)Use curl_setopt($ch, CURLOPT_HEADER, 1)
3)Grab from the header cookies like this:
preg_match_all("|Set-Cookie: (.*);|U", $content, $results);
$cookies = implode(";", $results);
4)Set them using curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Пример 7. Разбор cookie из заголовка с помощью CURL РНР
As Yevgen mentioned earlier sometimes we can"t use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE. Below is a header callback function I wrote back in
January that lets you maintain cookies between cURL requests. Cookies are added to $ch during all requests even during redirection,
so you can use it together with CURLOPT_FOLLOWLOCATION.
Here is the code:
function read_header($ch, $string)
{
global $location; #keep track of location/redirects
global $cookiearr; #store cookies here
global $ch;
# ^overrides the function param $ch
# this is okay because we need to
# update the global $ch with
# new cookies
$length = strlen($string);
if(!strncmp($string, "Location:", 9))
{ #keep track of last redirect
$location = trim(substr($string, 9, -1));
}
if(!strncmp($string, "Set-Cookie:", 11))
{ #get the cookie
$cookiestr = trim(substr($string, 11, -1));
$cookie = explode(";", $cookiestr);
$cookie = explode("=", $cookie);
$cookiename = trim(array_shift($cookie));
$cookiearr[$cookiename] = trim(implode("=", $cookie));
}
$cookie = "";
if(trim($string) == "")
{ #execute only at end of header
foreach ($cookiearr as $key=>$value)
{
$cookie .= "$key=$value; ";
}
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
return $length;
}
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_header");
This code assumes that you will reuse $ch without initializing it every time (call curl_init only once, in the beginning).
If you need to initialize $ch again at any point in your code you can access the currently stored cookies in $cookiearr and include them in the new $ch.
I wrote this function before I had enough experience with regular expressions so you won"t find any preg_match calls here.
I have used this code for quite a while and without any problems accessing gmail, yahoo, hotmail, aol etc.
where I had to go through login and a few pages before getting to what I was looking for.
Пример 8. Установка обработчика загрузки заголовка с помощью CURL РНР
Using cURL, I needed to call a third-party script which was returning binary data as attachment to pass on retrieved data again as attachment.
Problem was that the third-party script occassionally returned HTTP errors and I wanted to avoid passing on zero-length attachment in such case.
Combination of using CURLOPT_FAILONERROR and CURLOPT_HEADERFUNCTION callback helped to process the third-party script HTTP errors neatly:
function curlHeaderCallback($resURL, $strHeader) {
if (preg_match("/^HTTP/i", $strHeader)) {
header($strHeader);
header("Content-Disposition: attachment; filename="file-name.zip"");
}
return strlen($strHeader);
}
$resURL = curl_init("http://сайт/");
curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resURL, CURLOPT_HEADERFUNCTION, "curlHeaderCallback");
curl_setopt($resURL, CURLOPT_FAILONERROR, 1);
curl_exec ($resURL);
$intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE);
curl_close ($resURL);
if ($intReturnCode != 200) {
print "Ошибка с кодом: " . $intReturnCode;
}
Пример 9. Сохранение страницы в файл с подсчетом скорости передачи с помощью CURL РНР
WritePageToFile("http://es.php.net", "es.php.net.txt");
function WritePageToFile($sHTMLpage, $sTxtfile) {
$sh = curl_init($sHTMLpage);
$hFile = FOpen($sTxtfile, "w");
curl_setopt($sh, CURLOPT_FILE, $hFile);
curl_setopt($sh, CURLOPT_HEADER, 0);
curl_exec ($sh);
$sAverageSpeedDownload = curl_getInfo($sh, CURLINFO_SPEED_DOWNLOAD);
$sAverageSpeedUpload = curl_getInfo($sh, CURLINFO_SPEED_UPLOAD);
echo "";
echo "Average speed download == " . $sAverageSpeedDownload . "
";
curl_close($sh);
FClose ($hFile);
echo "(See the file "".$sTxtfile."" in the same path of the hosting".
" to where this script PHP).
";
echo "Average Speed upload == " . $sAverageSpeedUpload . "
";
echo "
";
$aCURLinfo = curl_getInfo($sh);
print_r($aCURLinfo);
echo "
";
}
Пример 9. Получение страницы через SSL соединение (https)
$ch=curl_init("https://сайт");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Отключить ошибку "SSL certificate problem, verify that the CA cert is OK"
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// Отключить ошибку "SSL: certificate subject name "hostname.ru" does not match target host name "123.123""
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$out=curl_exec($ch);
//$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//echo "http_code=".$http_code,", err=".curl_error($ch);
curl_close($ch);
Пример 10. Использование сессий и cookie в curl
$cookie_filename=sys_get_temp_dir()+"/cookie.tmp";
$curl=curl_init("http://сайт");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename);//сохранять полученные COOKIE в файл
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //отсылаем серверу COOKIE полученные от него при авторизации
$out=curl_exec($curl);
Пример 11. Отправка файла и многомерный массив в Curl. CURLOPT_POSTFIELDS + CurlFile