Пересылка Web-файлов из командной строки. Оттачиваем мастерство работы с cURL Curl параметры командной строки

Жизнь веб-разработчика омрачена сложностями. Особенно неприятно, когда источник этих сложностей неизвестен. То ли это проблема с отправкой запроса, то ли с ответом, то ли со сторонней библиотекой, то ли внешний API глючит? Существует куча различных прилад, способных упростить нам жизнь. Вот некоторые инструменты командной строки, которые лично я считаю бесценными.

cURL
cURL - программа для передачи данных по различным протоколам, похожая на wget. Основное отличие в том, что по умолчанию wget сохраняет в файл, а cURL выводит в командную строку. Так можно очень просто посмотреть контент веб-сайта. Например, вот как быстро получить свой текущий внешний IP:

$ curl ifconfig.me 93.96.141.93
Параметры -i (показывать заголовки) и -I (показывать только заголовки) делают cURL отличным инструментом для дебаггинга HTTP-ответов и анализа того, что конкретно сервер вам отправляет:

$ curl -I habrahabr.ru HTTP/1.1 200 OK Server: nginx Date: Thu, 18 Aug 2011 14:15:36 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Keep-alive: timeout=25
Параметр -L тоже полезный, он заставляет cURL автоматически следовать по редиректам. cURL поддерживает HTTP-аутентификацию, cookies, туннелирование через HTTP-прокси, ручные настройки в заголовках и многое, многое другое.

Siege
Siege - инструмент для нагрузочного тестирования. Плюс, у него есть удобная опция -g , которая очень похожа на curl –iL , но вдобавок показывает вам ещё и заголовки http-запроса. Вот пример с google.com (некоторые заголовки удалены для краткости):

$ siege -g www.google.com GET / HTTP/1.1 Host: www.google.com User-Agent: JoeDog/1.00 (X11; I; Siege 2.70) Connection: close HTTP/1.1 302 Found Location: http://www.google.co.uk/ Content-Type: text/html; charset=UTF-8 Server: gws Content-Length: 221 Connection: close GET / HTTP/1.1 Host: www.google.co.uk User-Agent: JoeDog/1.00 (X11; I; Siege 2.70) Connection: close HTTP/1.1 200 OK Content-Type: text/html; charset=ISO-8859-1 X-XSS-Protection: 1; mode=block Connection: close
Но для чего Siege действительно великолепно подходит, так это для нагрузочного тестирования. Как и апачевский бенчмарк ab , он может отправить множество параллельных запросов к сайту и посмотреть, как он справляется с трафиком. В следующем примере показано, как мы тестируем Google с помощью 20 запросов в течение 30 секунд, после чего выводится результат:

$ siege -c20 www.google.co.uk -b -t30s ... Lifting the server siege... done. Transactions: 1400 hits Availability: 100.00 % Elapsed time: 29.22 secs Data transferred: 13.32 MB Response time: 0.41 secs Transaction rate: 47.91 trans/sec Throughput: 0.46 MB/sec Concurrency: 19.53 Successful transactions: 1400 Failed transactions: 0 Longest transaction: 4.08 Shortest transaction: 0.08
Одна из самых полезных функций Siege - то, что он может работать не только с одним адресом, но и со списком URL’ов из файла. Это отлично подходит для нагрузочного тестирования, потому что можно моделировать реальный трафик на сайте, а не просто жать один и тот же URL снова и снова. Например, вот как использовать Siege, чтобы нагрузить сервер, используя адреса из вашего лога Apache:

$ cut -d " " -f7 /var/log/apache2/access.log > urls.txt $ siege -c -b -f urls.txt
Ngrep
Для серьёзного анализа трафика существует Wireshark с тысячами настроек, фильтров и конфигураций. Есть также версия для командной строки tshark . Но для простых задач функционал Wireshark я считаю избыточным. Так что до тех пор, пока мне не нужно мощное оружие, я использую . Он позволяет делать с сетевыми пакетами то же самое, что grep делает с файлами.

Для веб-трафика вы почти всегда захотите использовать параметр -W , чтобы сохранить форматирование строк, а также параметр -q , который скрывает избыточную информацию о неподходящих пакетах. Вот пример команды, которая перехватывает все пакеты с командой GET или POST:

Ngrep -q -W byline "^(GET|POST) .*"
Вы можете добавить дополнительный фильтр для пакетов, например, по заданному хосту, IP-адресу или порту. Вот фильтр для всего входящего и исходящего трафика на google.com, порт 80, который содержит слово “search”.

Ngrep -q -W byline "search" host www.google.com and port 80

Эта статья предполагает, что вам известны основы построения сетей и язык HTML.

Возможность написания скриптов является существенной при построении хорошей компьютерной системы. Расширяемость возможностей Unix-систем при помощи shell-скриптов и различных программ, выполняющих автоматизированные команды - вот одна из причин того, почему они имеют такой успех.

Увеличивающееся число приложений, которые переходят на веб, привело к тому, что тема HTTP-скриптов становится все более востребованной. Важными задачами в этой области являются автоматическое извлечение информации из интернета, отсылание или загрузка данных на web-сервера и т.п.

Curl - инструмент командной строки, который позволяет проделывать URL-манипуляции и передачи различного рода. Эта статья сфокусирована на создании простых HTTP-запросов. Предполагается, что вы уже знаете где набирать

# curl --help

# curl --manual

для получения информации о curl.

Curl не является инструментом, который будет делать все за вас. Он создает запросы, принимает данные и отсылает данные. Возможно, вам потребуется какой-то "клей" для объединения всего, возможно какой-то скриптовый язык (например bash) или несколько ручных вызовов.

1. Протокол HTTP

HTTP - это протокол, используемый при приеме данных от web-серверов. Это очень простой протокол, который построен на TCP/IP. Протокол также позволяет отправлять информацию на сервер от клиента, используя несколько методов, как будет показано далее.

HTTP - это строки ASCII-текста, отсылаемые от клиента к серверу для запроса какого-либо действия. При получении запроса сервер отвечает клиенту несколькими служебными текстовыми строками, а затем и собственно контентом.

Используя ключ curl -v, вы можете увидеть, какие команды curl отсылает серверу, а также другой информационный текст. Ключ -v - пожалуй, единственная возможность отладить или даже понять особенности взаимодействия curl и веб-сервера.

2. URL

Формат URL (Uniform Resource Locator - универсальный адрес ресурса) задает адрес определенного ресурса в Интернете. Вам это наверняка известно, примеры URL: http://curl.haxx.se или https://yourbank.com.

3. Получить (GET) страницу

Простейший и самый обычный HTTP-запрос - получить содержимое URL. URL может ссылаться на web-страницу, картинку или файл. Клиент отсылает GET-запрос на сервер и получает запрашиваемый документ. Если выполнить команду

# curl http://curl.haxx.se

вы получите web-страницу, выведенную в ваше терминальное окно. Полный HTML-документ, который содержится по этому адресу URL.

Все HTTP-ответы содержат набор заголовков, которые обычно скрыты. Чтобы их увидеть вместе с самим документом, используйте ключ curl -i. Вы можете также запросить только заголовки при помощи ключа -I (который заставит curl сделать HEAD-запрос).

4. Формы

Формы - основной способ представления web-сайта как HTML-страницы с полями, в которые пользователь вводит данные, и затем нажимает на кнопку "OK" или "Отправить", после чего данные отсылаются на сервер. Затем сервер использует принятые данные и решает, как действовать дальше: искать информацию в базе данных, показать введенный адрес на карте, добавить сообщение об ошибке или использовать информацию для аутентификации пользователя. Разумеется, на стороне сервера имеется какая-то программа, которая принимает ваши данные.

4.1 GET

GET-форма использует метод GET, например следующим образом:

Если вы откроете этот код в вашем браузере, вы увидите форму с текстовым полем и кнопку с надписью "OK". Если вы введете "1905" и нажмете OK, браузер создаст новый URL, по которому и проследует. URL будет представляться строкой, состоящей из пути предыдущего URL и строки, подобной "junk.cgi?birthyear=1905&press=OK".

Например, если форма располагалась по адресу "www.hotmail.com/when/birth.html", то при нажатии на кнопку OK вы попадете на URL "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK".

Большинство поисковых систем работают таким образом.

Чтобы curl сформировал GET-запрос, просто введите то, что ожидалось от формы:

# curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"

4.2 POST

Метод GET приводит к тому, что вся введенная информация отображается в адресной строке вашего браузера. Может быть это хорошо, когда вам нужно добавить страницу в закладки, но это очевидный недостаток, когда вы вводите в поля формы секретную информацию, либо когда объем информации, вводимый в поля, слишком велик (что приводит к нечитаемому URL).

Протокол HTTP предоставляет метод POST. С помощью него клиент отправляет данные отдельно от URL и поэтому вы не увидете их в адресной строке.

Форма, генерирующая POST-запрос, похожа на предыдущую:

Curl может сформировать POST-запрос с теми же данными следующим образом:

# curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi

Этот POST-запрос использует "Content-Type application/x-www-form-urlencoded", это самый широко используемый способ.

Данные, которые вы отправляете к серверу, должны быть правильно закодированы, curl не будет делать это за вас. К примеру, если вы хотите, чтобы данные содержали пробел, вам нужно заменить этот пробел на %20 и т.п. Недостаток внимания к этому вопросу - частая ошибка, из-за чего данные передаются не так, как надо.

В далеком 1995 был определен дополнительный способ передавать данные по HTTP. Он задокументирован в RFC 1867, поэтому этот способ иногда называют RFC1867-posting.

Этот метод в основном разработан для лучшей поддержки загрузки файлов. Форма, которая позволяет пользователю загрузить файл, выглядит на HTML примерно следующим образом:

Заметьте, что тип содержимого Content-Type установлен в multipart/form-data.

Чтобы отослать данные в такую форму с помощью curl, введите команду:

# curl -F upload=@localfilename -F press=OK

4.4 Скрытые поля

Обычный способ для передачи информации о состоянии в HTML-приложениях - использование скрытых полей в формах. Скрытые поля не заполняются, они невидимы для пользователя и передаются так же, как и обычные поля.

Простой пример формы с одним видимым полем, одним скрытым и кнопкой ОК:

Чтобы отправить POST-запрос с помощью curl, вам не нужно думать о том, скрытое поле или нет. Для curl они все одинаковы:

# curl -d "birthyear=1905&press=OK&person=daniel"

4.5 Узнать, как выглядит POST-запрос

Когда вы хотите заполнить форму и отослать данные на сервер с помощью curl, вы наверняка хотите, чтобы POST-запрос выглядел точно также, как и выполненный с помощью браузера.

Простой способ увидеть свой POST-запрос, это сохранить HTML-страницу с формой на диск, изменить метод на GET, и нажать кнопку "Отправить" (вы можете также изменить URL, которому будет передаваться данные).

Вы увидите, что данные присоединились к URL, отделенные символами "?", как и предполагается при использовании GET-форм.

5. PUT

Пожалуй, лучший способ загружать данные на HTTP-сервер, это использовать PUT. Опять же, это требует программы (скрипта) на серверной части, которая знает, что делать и как принимать поток HTTP PUT.

Отослать файл на сервер при помощи curl:

# curl -T uploadfile www.uploadhttp.com/receive.cgi

6. Аутентификация

Аутентификация - передача серверу имени пользователя и пароля, после этого он проверяет, имеете ли вы право выполнить требуемый запрос. Аутентификация по методу Basic (которым curl пользуется по умолчанию) основана на открытом тексте, что означает, что имя пользователя и пароль не будут зашифрованы, а лишь слегка "затуманены" по алгоритму Base64, что оставляет возможность узнать эту информацию злоумышленникам на пути между вами и HTTP-сервером.

Указание curl использовать имя пользователя и пароль:

# curl -u name:password www.secrets.com

Сайт может требовать использования другого метода аутентификации (посмотрите, что пишет сервер в заголовках), в этих случаях можно использовать ключи --ntlm, --digest, --negotiate или даже --anyauth. Иногда доступ к внешним HTTP-серверам происходит через прокси, так часто делают в компаниях и фирмах. HTTP-прокси может требовать свои логин и пароль для доступа к Интернету. Соответствующий ключ curl:

# curl -U proxyuser:proxypassword curl.haxx.se

Если прокси требует аутентификации по методу NTLM, укажите --proxy-ntlm, если метод Digest, то --proxy-digest.

Если вы не укажете пароль в ключах -u и -U, то curl спросит его у вас в интерактивном режиме.

Заметьте, что когда curl работает, строка запуска (а вместе с этим и ключи, и пароли) могут быть видны другим пользователям вашей системы в списке задач. Есть способы предотвратить это. Об этом ниже.

7. Referer

HTTP-запрос может включать поле "referer", которое указывает, с какого URL пользователь пришел на данный ресурс. Некоторые программы/скрипты проверяют поле "referer" и не выполняют запрос, если пользователь пришел с неизвестной страницы. Хотя это и глупый способ проверки, тем не менее многие скрипты используют его. С помощью curl вы можете вписать что угодно в поле "referer" и таким образом заставлять выполнять то, что вам нужно.

Это делается следующим образом:

# curl -e http://curl.haxx.se daniel.haxx.se

8. User Agent

Все HTTP-запросы поддерживают поле "User-Agent", в котором указывается клиентское приложение пользователя. Многие web-приложения используют эту информацию, чтобы тем или иным способом отобразить страницу. Web-программисты создают несколько версий страницы для пользователей разных браузеров в целях улучшения внешнего вида, использования различных скриптов javascript, vbscript и т.д.

Иногда вы можете обнаружить, что curl возвращает страницу не такой, какой вы ее видели в своем браузере. В этом случае как раз уместно использовать поле "User Agent", чтобы в очередной раз обмануть сервер.

Замаскировать curl под Internet Explorer на машине с Windows 2000:

# curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"

Почему бы не стать Netscape 4.73 на Linux-машине (PIII):

# curl -A "Mozilla/4.73 (X11; U; Linux 2.2.15 i686)"

9. Перенаправления (redirects)

Отвечая на ваш запрос, сервер вместо самой страницы может вернуть указание, куда браузер должен пойти дальше, чтобы попасть на нужную страницу. Заголовок, который указывает браузеру такое перенаправление - это "Location:".

По умолчанию curl не идет по адресу, указанному в "Location:", а просто показывает страницу как обычно. Но можно его направить следующим образом:

# curl -L www.sitethatredirects.com

Если вы используете curl для POST-запросов на сайт, который сразу же перенаправляет на другую страницу, вы можете смело использовать связку -L и -d/-F. Curl сформирует POST-запрос для первой страницы, а затем GET-запрос для последующей.

10. Cookies

С помощью cookies веб-браузеры контролируют состояние на стороне клиента. Cookie - это имя с присоединенным содержимым. Сервер при помощи отправки cookies сообщает клиенту путь и имя хоста, по которому в следующий раз должны быть отправлены cookies, сообщает время жизни cookies и некоторые другие параметры.

Когда клиент соединяется с сервером по адресу, указанному в принятом cookie, клиент посылает этот cookie к серверу (если время жизни не истекло).

Многие приложения и сервера используют этот метод, чтобы объединить нескольких запросов в одну логическую сессию. Чтобы curl также мог выполнять такую функцию, мы должны уметь сохранять и отправлять cookies, как и делают браузеры.

Простейший способ отправить cookie к серверу при получении страницы с помощью curl, это добавить соответствующий ключ в командной строке:

# curl -b "name=Daniel" www.cookiesite.com

Cookies отправляются как обычные HTTP-заголовки. Это позволяет curl сохранять cookies, сохраняя заголовки. Сохранение cookies с помощью curl выполняется командой:

# curl -D headers_and_cookies www.cookiesite.com

(кстати, для сохранения cookies лучше использовать ключ -c, об этом ниже).

У curl имеется полнофункциональный обработчик cookies, который полезен, когда вы хотите соединиться в очередной раз к серверу и использовать cookies, сохраненные в прошлый раз (либо подработанные вручную). Для использования cookies, сохраненных в файле, вызовите curl так:

# curl -b stored_cookies_in_file www.cookiesite.com

"Cookie-движок" curl включается, когда вы указываете ключ -b. Если вы хотите, чтобы curl лишь воспринимал cookies, используйте -b с указанием файла, которого не существует. Например, если вы хотите, чтобы curl принял cookies со страницы, а затем пошел по перенаправлению (возможно, отдав принятый только что cookie), то можно вызывать curl так:

# curl -b nada -L www.cookiesite.com

Curl умеет читать и писать cookie-файлы, имеющие формат Netscape и Mozilla. Это удобный способ обмениваться cookies между браузерами и автоматическими скриптами. Ключ -b автоматически определяет, является ли данный файл cookie-файлом указанных браузеров и обрабатывает его соответствующим образом, а используя ключ -c/--cookie-jar, вы можете заставить curl записать новый cookie-файл по завершении операции:

# curl -b cookies.txt -c newcookies.txt www.cookiesite.com

11. HTTPS

Есть несколько способов обезопасить ваши HTTP-передачи. Наиболее известным протоколом, решающим эту задачу, является HTTPS, или HTTP over SSL. SSL зашифровывает все посылаемые и принимаемые по сети данные, что увеличивает вероятность того, что ваша информация останется в тайне.

Curl поддерживает запросы к HTTPS-серверам благодаря свободно распространяемой библиотеке OpenSSL. Запросы происходят обычным способом:

# curl https://that.secure.server.com

11.1 Сертификаты

В мире HTTPS для аутентификации в дополнение к имени пользовавателя и паролю вы используете сертификаты. Curl поддерживает сертификаты на стороне клиента. Все сертификаты заперты ключевой фразой, которую вам нужно ввести прежде чем curl может начать с ними работу. Ключевая фраза может быть указана либо в командной строке, либо введена в интерактивном режиме. Сертификаты в curl используются следующим образом:

# curl -E mycert.pem https://that.secure.server.com

Curl также проверяет сервер на подлинность, сверяя сертификат сервера с локально хранящимся. Обнаружившееся несоответствие приведет к тому, что curl откажется соединяться. Для игнорирования проверки на подлинность используйте ключ -k.

Более подробная информация о сертификатах может быть найдена на странице http://curl.haxx.se/docs/sslcerts.html.

12. Произвольные заголовки запроса

Возможно, вам понадобится изменять или добавлять элементы отдельных запросов curl.

К примеру, вы можете изменить запрос POST на PROPFIND и отправить данные как "Content-Type: text/xml" (вместо обычного Content-Type):

# curl -d "" -H "Content-Type: text/xml" -X PROPFIND url.com

Вы можете удалить какой-нибудь заголовок, указав его без содержимого. Например, вы можете удалить заголовок "Host:", тем самым сделав запрос "пустым":

# curl -H "Host:" http://mysite.com

Также вы можете добавлять заголовки. Возможно, вашему серверу потребуется заголовок "Destination:":

# curl -H "Destination: http://moo.com/nowhere" http://url.com

13. Отладка

Часто бывает так, что сайт реагирует на запросы curl не так, как на запросы браузера. В этом случае нужно максимально уподобить curl браузеру:

  • Используйте ключ --trace-ascii для сохранения подробного отчета запросов, чтобы затем подробно изучить их и разобраться в проблеме.
  • Убедитесь, что вы проверяете на cookies и используете их при необходимости (ключ чтения -b и сохранения -c)
  • Укажите в поле "user-agent" один из последних популярных браузеров
  • Заполните поле "referer" как это делает браузер
  • Если вы используете POST-запросы, убедитесь, что все поля передаются в том же порядке, что и браузер (см. выше, пункт 4.5)

Хороший помощник в этом нелегком деле - плагин для Mozilla/Firefox LiveHTTPHeader, который позволяет просматривать все заголовки, которые отправляет и принимает этот браузер (даже при использовании HTTPS).

Более низкоуровневый подход - захват HTTP-траффика в сети с помощью программ, таких как ethereal или tcpdump, с последующим анализом, какие заголовки были получены и отправлены браузером (HTTPS делает этот подход неэффективным).

RFC 2616 обязательно для чтения всем, кто хочет понять протокол HTTP.

RFC 2396 объясняет синтаксис URL.

RFC 2109 определяет работу cookies.

RFC 1867 определяет формат File Upload Post.

http://openssl.planetmirror.com - домашняя страница проекта OpenSSL

http://curl.haxx.se - домашняя страница проекта cURL

Реальный практический пример: вам нужно перезагрузить роутер (модем) для смены IP адреса. Для этого нужно: авторизоваться в роутере, перейти к странице обслуживания и нажать кнопку «Перезагрузка». Если это действие нужно выполнить несколько раз, то процедуру нужно повторить. Согласитесь, делать каждый раз в ручную эту рутину не хочется. cURL позволяет автоматизировать всё это. Буквально несколькими командами cURL можно добиться авторизации и выполнения задания на роутере.

  • cURL удобен для получения данных с веб-сайтов в командной строке.
Ещё один практический пример: мы хотим реализовать показ общей статистики для нескольких сайтов. Если использовать cURL, то это становится вполне тривиальной задачей: с помощью 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


На Fedora, CentOS или RHEL:

$ sudo yum install curl

Чтобы наглядно было видно разницу в использовании в PHP и в командной строке, будем одни и те же задачи выполнять дважды: сначала в скрипте PHP, а затем в командной строке. Постараемся при этом не запутаться.

Получение данных при помощи cURL

Получение данных при помощи cURL в PHP

Пример на PHP:

Всё очень просто:
$target_url - адрес сайта, который нас интересует. После адреса сайта можно поставить двоеточие и добавить адрес порта (если порт отличается от стандартного).

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

Базовая аутентификация и аутентификация HTTP

Аутентификация, проще говоря, это введение имени пользователя и пароля.

Базовая аутентификация - это аутентификация средствами сервера. Для этого создаются два файла: .htaccess и .htpasswd

Содержимое файла.htaccess примерно такое

AuthName "Только для зарегистрированных пользователей!" AuthType Basic require valid-user AuthUserFile /home/freeforum.biz/htdocs/.htpassw


Содержимое файла.htpasswd примерно такое:

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

Буквально ещё несколькими командами можно добавить:

  • распаковку архива в указанный каталог;
  • запуск обновлений КонсультантПлюс (это обновления для него);
  • можно реализовать проверку - было ли уже скачено последнее доступное обновление или появилось новое;
  • добавить это всё в Cron для ежедневных обновлений.
HTTP аутентификация cURL

HTTP аутентификация cURL в PHP

Нам нужно знать:

  • адрес, куда отправлять данные для аутентификации
  • метод отправки GET или POST
  • логин
  • пароль
Иногда этих данных оказывается недостаточно. Давайте разберёмся.

Адрес, куда нужно отправить данные, можно взять из формы аутентификации. Например:

Мы смотрим на свойство action . Т.е. конечной страницей является login.php . Нам нужен полный адрес, например такой

Скрыто от гостей

Здесь же мы находим и метод отправки: method="post"

Логин и пароль я тоже знаю: admin и qwerasdfzxcv
Т.е. на сервер из формы передаётся строка методом POST. Теоретически, наш предыдущий скрипт, в которое мы добавили новую строчку, должен работать. Т.е. должна происходить аутентификация.

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
"; 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); ?>

Кстати, если владелец обновит пароль (но не обновит прошивку), то новый пароль всегда можно посмотреть по адресу

Скрыто от гостей

(Это общеизвестная уязвимость роутеров 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.

Типсы и триксы cURL

cURL и получение кукиз помимо CURLOPT_COOKIEJAR

Думаю, уже стало понятно, что cURL правильно обрабатывает куки - сохраняет их, использует, когда сервер запрашивает, и т. д. Но иногда куки нужно сохранить. Для этого есть опция CURLOPT_COOKIEJAR, но воспользоваться ей можно не всегда. Этому и посвящён наш первый трюк.

Иногда из-за особенностей настройки PHP на сервере, нам недоступны такие опции как CURLOPT_COOKIEJAR (позволяет сохранить полученные куки в файл) и CURLOPT_COOKIEFILE (позволяет использовать куки из файла). Т.к. они говорят, что используя эти опции мы сможем стянуть любой файл с их сервера. Вот решение этой проблемы:

1) Не используем CURLOPT_FOLLOWLOCATION
2) Используем curl_setopt($ch, CURLOPT_HEADER, 1)
3) Собираем кукизы из заголовка header примерно так:

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 . Подробности и пример кода в официальной документации

Скрыто от гостей

Скрыто от гостей


Про cURL в командной строке

Скрыто от гостей


Для чтения на русском языке также подготовлена вторая часть урока cURL: " ".

CURL - это пакет программного обеспечения, состоящий из утилиты командной строки и библиотеки для передачи данных с использованием синтаксиса URL.

CURL поддерижвает множество протоколов, среди них DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet и TFTP.

Загрузить отдельный файл
Следующая команда получит содержимое URL и отобразит его в стандартном выводе (т. е. в вашем терминале).

Curl https://mi-al.ru/ > mi-al.htm % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 14378 0 14378 0 0 5387 0 --:--:-- 0:00:02 --:--:-- 5387

Сохранение вывода cURL в файл
Мы можем сохранить результат команды curl в файл, используя опции -o/-O.
  • -o (o нижнего регистра) результат будет сохранён в файле, заданном в командной строке
  • -O (O верхнего регистра) имя файла будет взято из URL и будет использовано для сохранения полученных данных.

$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html

Теперь будет сохранена страница gettext.html в файле с названием ‘mygettext.html’. Когда curl запущена с опцией -o, она отображает шкалу прогресса загрузки следующим образом.

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 66 1215k 66 805k 0 0 33060 0 0:00:37 0:00:24 0:00:13 45900 100 1215k 100 1215k 0 0 39474 0 0:00:31 0:00:31 --:--:-- 68987

Когда вы используете curl -O (O верхнего регистра), она сама по себе сохранит содержимое в файл под названием ‘gettext.html’ на локальной машине.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html

Примечание: Когда curl должна писать данные в терминал, она отключает шкалу прогресса, чтобы не было путаницы в напечатанных данных. Мы можем исользовать ‘>’|’-o’|’-O’ опции для передачи результатов в файл.

Выборка нескольких файлов одновременно
Мы можем загрузить несколько файлов за один раз, задав все URL в командной строке.

Curl -O URL1 -O URL2

Команда ниже загрузит оба index.html и gettext.html и сохранит их с теми же именами в текущей директории.

Curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html

Пожалуйста, обратите внимание, когда мы загружаем несколько файлов с одного сервера как показано выше, curl попытается повторно использовать соединение.

Следуем за HTTP Location в заголовках с опцией -L
По умолчанию, CURL не следует за HTTP Location в заголовках (редиректы). Когда запрошенная веб-страница перемещена в другое место, то соответствующий ответ будет передан в заголовках HTTP Location.
Например, когда кто-то печатает google.com в строке браузера из своей страны, они автоматически будут перенаправлены на ‘google.co.xx’. Это делается на основе заголовка HTTP Location как показано ниже.

Curl https://www.google.com/?gws_rd=ssl

302 Moved

302 Moved

The document has moved here.

Приведённый выше вывод говорит, что запрашиваемый документ был перемещён в ‘

Скрыто от гостей

.
Вы можете указать curl следовать редиректам, это делается с использованием опции -L как показано ниже. Теперь будет загружен исходный код html с

Скрыто от гостей

.

Curl -L https://www.google.com/?gws_rd=ssl

Вообновление предыдущей закачки

Используя опцию -C вы можете продолжить закачку, которая была остановлена по каким-либо причинам. Это будет полезным при обрыве загрузки больших файлов.
Если мы говорим ‘-C -’, то curl будет искать, с какого места возобновить загрузку. Мы также можем задать ‘-C <смещение>’. Заданное смещение байт будет пропущено от начала исходного файла.
Начните большую загрузку с curl и нажмите Ctrl-C для остановки посреди закачки.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html ############## 20.1%

Закачка была остановлена на 20.1%. Используя “curl -C -” мы можем продолжить загрузку с того места, где мы остановились. Теперь загрузка продолжиться с 20.1%.

Curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html ############### 21.1%

Ограничение скорости передачи данных
Вы можете ограничить величину скорости передачи данных опцией –limit-rate. Вы можете передать максимальную скорость в качестве аргумента.

$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html

Команда выше ограничит скорость передачи на 1000 байт/секунду. curl может использовать скорость выше на пиках. Но средняя скорость будет примерно 1000 байт/секунду.
Ниже показан индикатор прогресса для представленной выше команды. Вы можете видеть, что текущая скорость в районе 1000 байт.

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 1 1215k 1 13601 0 0 957 0 0:21:40 0:00:14 0:21:26 999 1 1215k 1 14601 0 0 960 0 0:21:36 0:00:15 0:21:21 999 1 1215k 1 15601 0 0 962 0 0:21:34 0:00:16 0:21:18 999

Загрузить файл только если он изменён до/после заданного времени
Вы можете получить файлы, которые были изменены после определённого времени, используя опцию -z в curl. Это будет работать и для FTP и для HTTP.

Команда выше загрузит yy.html только если он изменялся позднее чем заданная дата и время.

Команда выше загрузит файл file.html, если он изменялся до заданной даты и времени. Наберите ‘man curl_getdate’ чтобы узнать больше о различных поддерживаемых синтаксисах для выражений даты.

Прохождение аутентификации HTTP в cURL
Иногда веб-сайты требуют имя пользователя и пароль для просмотра их содержимого. С помощью опции -u вы можете передать эти учётные данные из cURL на веб-сервер как показано ниже.

$ curl -u username:password URL

Примечание: По умолчанию curl использует базовую HTTP аутентификацию. Мы можем задать иные методы аутентификации используя –ntlm | –digest.


cURL может также использоваться для загрузки файлов с FTP серверов. Если заданный FTP путь является директорией, то по умолчанию будет выведен список файлов в ней.

$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php

Команда выше загрузит файл xss.php с ftp-сервера и сохранит его в локальной директории.

$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/

Здесь URL отсылает к директории. Следовательно, cURL сделает список файлов и директорий по заданному URL адресу.


CURL поддерживает диапазоны заданные в URL. Когда дан диапазон, будут загружены соответствующие файлы внутри этого диапазона. Это будет полезным при загрузке пакетов с сайтов FTP зеркал.

$ curl ftp://ftp.uk.debian.org/debian/pool/main//

Команда выше сделает список всех пакетов в диапазоне a-z в терминале.

Выгрузка файлов на FTP-сервер
Curl также может использоваться для выгрузки на FTP-сервер с опцией -T.

$ curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com

Команда выше выгрузит файл с именем myfile.txt на FTP-сервер. Вы можете также выгрузить несколько файлов за один раз используя диапазоны.

$ curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com

Опционально мы можем использовать “.” для получения из стандартного ввода и передачи его на удалённую машину.

$ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

Команда выше получит вывод от пользователя из стандартного ввода и сохранит содержимое на ftp-сервере под именем ‘myfile_1.txt’.
Вы можете задать ‘-T’ для каждого URL, и каждая пара адрес-файл будут определять что куда выгружать

Больше информации с увеличением вербальности и опцией трассировки
Вы можете узнать что происходит, используя опцию -v. Опция -v включает вербальный режим и будет печатать подробности.

Curl -v https://www.google.co.th/?gws_rd=ssl

Команда выше выведет следующее

* Rebuilt URL to: https://www.google.co.th/?gws_rd=ssl * Hostname was NOT found in DNS cache * Trying 27.123.17.49... * Connected to www.google.co.th (27.123.17.49) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.38.0 > Host: www.google.co.th > Accept: */* > < HTTP/1.1 200 OK < Date: Fri, 14 Aug 2015 23:07:20 GMT < Expires: -1 < Cache-Control: private, max-age=0 < Content-Type: text/html; charset=windows-874 < P3P: CP="This is not a P3P policy! See https://support.google.com/accounts/answer/151657?hl=en for more info." * Server gws is not blacklisted < Server: gws < X-XSS-Protection: 1; mode=block < X-Frame-Options: SAMEORIGIN < Set-Cookie: PREF=ID=1111111111111111:FF=0:TM=1439593640:LM=1439593640:V=1:S=FfuoPPpKbyzTdJ6T; expires=Sun, 13-Aug-2017 23:07:20 GMT; path=/; domain=.google.co.th ... ... ...

Если вам нужно больше детальной информации, тогда вы можете использовать опцию –trace. Опция –trace включит полный дамп трассировки всех входящих/исходящих данных для заданного файла

(PHP 4 >= 4.0.2, PHP 5, PHP 7)

curl_setopt — Устанавливает параметр для сеанса CURL

Список параметров

Дескриптор cURL, полученный из curl_init() .

Устанавливаемый параметр CURLOPT_XXX .

Значение параметра option .

bool :

Параметр Замечания
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

TRUE для отмены индикатора прогресса при передачах cURL.

Замечание :

PHP автоматически устанавливает этот параметр в TRUE , меняйте его только для отладочных целей.

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 .

Для следующих значений параметра option , параметр value должен быть типа integer :

Параметр Устанавливаемое значение value Замечания
CURLOPT_BUFFERSIZE Размер буфера, используемого при каждом чтении. Однако, нет никакой гарантии что данный запрос будет завершен. Добавлен в версии cURL 7.10.
CURLOPT_CLOSEPOLICY Одна из констант CURLCLOSEPOLICY_* .

Замечание :

Эта опция устарела, так как никогда не была реализована в cURL и не работала.

Удалена в 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

Можно использовать побитовый оператор | (или) для комбинации нескольких методов вместе. В этом случае cURL опросит сервер на предмет поддерживаемых методов авторизации и выберет лучший из них.

CURLAUTH_ANY - это псевдоним CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM .

CURLAUTH_ANYSAFE - это псевдоним CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM .

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

Битовая маска из значений 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

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.

Для следующих значений параметра option , параметр value должен быть типа string :

Параметр Устанавливаемое значение 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

Собственный метод запроса, используемый вместо "GET" или "HEAD" при выполнении HTTP-запроса. Это полезно при запросах "DELETE" или других, более редких HTTP-запросах. Корректными значениями будут слова наподобие "GET" , "POST" , "CONNECT" и так далее; т.е. не вводите здесь всю строку с HTTP-запросом. Например, указание "GET /index.html HTTP/1.0\r\n\r\n" будет неправильным.

Замечание :

Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса.

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

Тайный пароль, необходимый для использования закрытого ключа SSL, указанного параметром CURLOPT_SSLKEY .

Замечание :

Так как этот параметр содержит ценный пароль, помните, что данный PHP-скрипт нужно хранить в безопасном месте.

CURLOPT_SSLKEYTYPE Тип закрытого ключа SSL, указанного в параметре CURLOPT_SSLKEY . Поддерживаются следующие типы ключей: "PEM" (по умолчанию), "DER" и "ENG" .
CURLOPT_URL Загружаемый URL. Данный параметр может быть также установлен при инициализации сеанса с помощью curl_init() .
CURLOPT_USERAGENT Содержимое заголовка "User-Agent: " , посылаемого в HTTP-запросе.
CURLOPT_USERPWD Логин и пароль, используемые при соединении, указанные в формате ":" .

Для следующих значений параметра option , параметр value должен быть массивом:

Параметр Устанавливаемое значение 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-запроса.

Для следующих значений параметра option , параметр value должен быть потоковым дескриптором (возвращаемым, например, функцией fopen() ):

Параметр Устанавливаемое значение value
CURLOPT_FILE Файл, в который будет записан результат передачи. По умолчанию используется поток вывода STDOUT (окно браузера).
CURLOPT_INFILE Файл, из которого должно идти чтение данных, при загрузке на сервер.
CURLOPT_STDERR Альтернативное файл для вывода ошибок, используемый вместо потока ошибок STDERR .
CURLOPT_WRITEHEADER Файл, в который будут записаны заголовки текущей операции.

Для следующих значений параметра option , параметр value должен быть правильным именем функции или замыканием:

Параметр Устанавливаемое значение value
CURLOPT_HEADERFUNCTION Callback-функция принимает два параметра. Первым параметром является дескриптор cURL, вторым параметром является строка с записываемыми заголовками. Заголовки должны быть записаны с помощью данной callback-функции. Должна возвратить количество записанных байт.
CURLOPT_PASSWDFUNCTION Callback-функция принимает три параметра. Первым параметром является дескриптор cURL, вторым параметром является строка с запросом пароля, третьим параметром является максимальная длина пароля. Должна возвратить строку, содержащую пароль.
CURLOPT_PROGRESSFUNCTION

Callback-функция принимает пять параметров. Первый является декскриптором cURL, второй - общим количеством байт, которое ожидается загрузить с сервера, третий - количество уже загруженных байт, четвертый - общее количество байт, которое ожидается отправить на сервер, и пятый - количество уже отправленных байт.

Замечание :

Callback-функция вызывается только, если опция CURLOPT_NOPROGRESS установлена в значение FALSE .

Можно вернуть ненулевое значение, чтобы отменить передачу. В этом случае будет выставлена ошибка CURLE_ABORTED_BY_CALLBACK .

CURLOPT_READFUNCTION Callback-функция принимает три параметра. Первым параметром является дескриптор cURL, вторым параметром является ресурс потока, переданный cURL через опцию CURLOPT_INFILE , а третьим параметром является максимально разрешенное количество данных для чтения. Callback-функция должна возвратить строку, с длиной не превышающей запрошенного количества данных, обычно с помощью чтения из переданного потокового ресурса. Должна возвратить пустую строку для сигнала о конце файла EOF .
CURLOPT_WRITEFUNCTION Callback-функция принимает два параметра. Первым параметром является дескриптор cURL, а вторым параметром является строка с записываемыми данными. Данные должны быть сохранены с помощью данной функции. Она должна возвратить точное количество записанных байт, иначе закачка будет прервана с ошибкой.

Другие значения:

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Список изменений

Версия Описание
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 .

Примеры

Пример #1 Инициализация сеанса CURL и загрузка web-страницы

// создание нового ресурса cURL
$ch = curl_init ();

/* http://localhost/upload.php:
print_r($_POST);
print_r($_FILES);
*/

$ch = curl_init ();

$data = array("name" => "Foo" , "file" => "@/home/user/test.png" );

Curl_setopt ($ch , CURLOPT_URL , "http://localhost/upload.php" );
curl_setopt ($ch , CURLOPT_POST , 1 );
curl_setopt ($ch , CURLOPT_POSTFIELDS , $data );

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 .