(решено) “curl.exe”
Содержание:
- Как происходит заражение вирусом CURL.EXE?
- Config File
- Web-протоколы
- 13. Отладка
- 5 последних уроков рубрики «PHP»
- HTTP-клиент на Python
- Cookie Basics
- Множественный cURL
- Опции Править
- Описание Править
- PHP cURL POST
- Лучшие практики для исправления проблем с curl
- Пример FTP-сессии
- 9. Перенаправления (redirects)
- User Agent
- Certificates
- Подготовка помещения
- Итак, приступим:
- Формы
Как происходит заражение вирусом CURL.EXE?
Мой братишка — заядлый геймер. Что ни зайду в гости — он постоянно во что-то рубится. Иногда я думаю, что ест, спит и справляет нужду — тоже возле компьютера. Играет просто во все, что движется. Онлайн, оффлайн…
В общем, скачивает он порядочное количество всякого интернет мусора, не обращая внимание на содержимое и безопасность установочного процесса. Все, что он инсталлирует — он инсталлирует по-умолчанию
Так же быстрее! Короче, я не был удивлен, когда вчера он пожаловался мне, что его комп ужасно тормозит и живет своей жизнью.
Так что это за зловред такой — CURL.EXE? Обычный криптомайнер, который использует вашу машину в качестве генератора криптовалюты в пользу злоумышленника.
Config File
Curl automatically tries to read the file (or file on
Microsoft Windows systems) from the user’s home dir on startup.
The config file could be made up with normal command line switches, but you
can also specify the long options without the dashes to make it more
readable. You can separate the options and the parameter with spaces, or with
or . Comments can be used within the file. If the first letter on a
line is a -symbol the rest of the line is treated as a comment.
If you want the parameter to contain spaces, you must enclose the entire
parameter within double quotes (). Within those quotes, you specify a quote
as .
NOTE: You must specify options and their arguments on the same line.
Example, set default time out and proxy in a config file:
Whitespaces ARE significant at the end of lines, but all whitespace leading
up to the first characters of each line are ignored.
Prevent curl from reading the default file by using -q as the first command
line parameter, like:
Force curl to get and display a local help page in case it is invoked without
URL by making a config file similar to:
You can specify another config file to be read by using the /
flag. If you set config file name to it’ll read the config from stdin,
which can be handy if you want to hide options from being visible in process
tables etc:
Web-протоколы
Эти Web-сервисы, как правило, построены поверх уровня сокетов стека сетевых протоколов (рисунок 1).
Уровень сокетов реализует API, который восходит к операционной системе Berkeley Software Distribution (BSD) и изолирует детали нижележащих протоколов транспортного и сетевого уровней.
Рисунок 1.
Стек сетевых протоколов и libcurl
Web-сервисы обеспечивают взаимодействие между протоколами клиента и сервера.
В контексте HTTP сервер – это оконечное устройство, а клиент – браузер в удаленной точке.
Для SMTP сервер – это почтовый шлюз или удаленный пользователь, а клиент – оконечное устройство.
В некоторых случаях взаимодействие протоколов происходит в два этапа (запрос и ответ), а в других для поддержания связи требуется гораздо больше трафика.
Такое взаимодействие может создать значительные трудности, которые преодолеваются с помощью API, таких как libcurl.
13. Отладка
Часто бывает так, что сайт реагирует на запросы curl не так, как
на запросы браузера. В этом случае нужно максимально уподобить curl
браузеру:
-
Используйте ключ —trace-ascii для
сохранения подробного отчета запросов, чтобы затем подробно изучить
их и разобраться в проблеме. -
Убедитесь, что вы проверяете на
cookies и используете их при необходимости (ключ чтения -b и
сохранения -c) -
Укажите в поле ‘user-agent’ один
из последних популярных браузеров -
Заполните поле ‘referer’ как это
делает браузер - Если вы используете POST-запросы, убедитесь, что все поля
передаются в том же порядке, что и браузер (см. выше, пункт 4.5)
Хороший помощник в этом нелегком деле — плагин для Mozilla/Firefox
,
который позволяет просматривать все заголовки, которые отправляет и
принимает этот браузер (даже при использовании HTTPS).
Более низкоуровневый подход — захват HTTP-траффика в сети с
помощью программ, таких как ethereal или tcpdump, с последующим
анализом, какие заголовки были получены и отправлены браузером (HTTPS
делает этот подход неэффективным).
5 последних уроков рубрики «PHP»
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак
В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение
В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
HTTP-клиент на Python
В этом разделе приводится пример, подобный HTTP-клиенту на языке С, но на этот раз написанный на Python.
Python – это полезный объектно-ориентированный язык сценариев, который отлично подходит для создания прототипов и коммерческого программного обеспечения.
В примере предполагается, что вы немного знакомы с Python, но он используется очень мало, так что глубокие знания не потребуются.
Код простого HTTP-клиента, написанный на языке Python с использованием, приведен в листинге 4.
Листинг 4.
HTTP-клиент на Python с использованием интерфейса из libcurl
import sys import pycurl wr_buf = '' def write_data( buf ): global wr_buf wr_buf += buf def main(): c = pycurl.Curl() c.setopt( pycurl.URL, 'http://www.exampledomain.com' ) c.setopt( pycurl.WRITEFUNCTION, write_data ) c.perform() c.close() main() sys.stdout.write(wr_buf)
Создание прототипа на Python
Здесь иллюстрируется одно из преимуществ языка Python при создании прототипов.
Довольно широкая функциональность достигается при небольшом количестве кода.
На С можно получить более высокую производительность, но если вашей целью является быстрое создание кода для проверки идеи, лучше воспользоваться высокоуровневыми языками сценариев, такими как Python.
Этот код значительно проще, чем версия на C
Он начинается с импортирования необходимых модулей (стандартного системного модуля и модуля ).
Далее определяется буфер записи ().
Как и в программе на C, я декларирую функцию .
Обратите внимание, что эта функция принимает один аргумент:
буфер данных, считанных с сервера HTTP. Я просто взял этот буфер и добавил его к глобальному буферу записи
Функция начинает с создания указателя , затем использует для записи методы для определения и .
Она вызывает метод для запуска передачи и закрывает указатель.
Наконец, она вызывает функцию и передает буфер записи в .
Обратите внимание, что в данном случае указатель ошибки контекста не нужен, поскольку используется конкатенация строк Python, а значит, не нужно использовать строку со статически заданным размером.
Cookie Basics
The way the web browsers do «client side state control» is by using
cookies. Cookies are just names with associated contents. The cookies are
sent to the client by the server. The server tells the client for what path
and host name it wants the cookie sent back, and it also sends an expiration
date and a few more properties.
When a client communicates with a server with a name and path as previously
specified in a received cookie, the client sends back the cookies and their
contents to the server, unless of course they are expired.
Many applications and servers use this method to connect a series of requests
into a single logical session. To be able to use curl in such occasions, we
must be able to record and send back cookies the way the web application
expects them. The same way browsers deal with them.
Множественный cURL
Одной из самых сильных сторон cURL является возможность создания «множественных» cURL обработчиков. Это позволяет вам открывать соединение к множеству URL одновременно и асинхронно.
В классическом варианте cURL запроса выполнение скрипта приостанавливается, и происходит ожидание завершения операции URL запроса, после чего работа скрипта может продолжиться. Если вы намереваетесь взаимодействовать с целым множеством URL, это приведёт к довольно-таки значительным затратам времени, поскольку в классическом варианте вы можете работать только с одним URL за один раз. Однако, мы можем исправить данную ситуацию, воспользовавшись специальными обработчиками.
Давайте рассмотрим пример кода, который я взял с php.net:
// создаём несколько cURL ресурсов $ch1 = curl_init(); $ch2 = curl_init(); // указываем URL и другие параметры curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); //создаём множественный cURL обработчик $mh = curl_multi_init(); //добавляем несколько обработчиков curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $active = null; //выполнение do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } //закрытие curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
Идея состоит в том, что вы можете использовать множественные cURL обработчики. Используя простой цикл, вы можете отследить, какие запросы ещё не выполнились.
В этом примере есть два основных цикла. Первый цикл do-while вызывает функцию curl_multi_exec(). Эта функция не блокируемая. Она выполняется с той скоростью, с которой может, и возвращает состояние запроса. Пока возвращенное значение является константой ‘CURLM_CALL_MULTI_PERFORM’, это означает, что работа ещё не завершена (например, в данный момент происходит отправка http заголовков в URL); Именно поэтому мы продолжаем проверять это возвращаемое значение, пока не получим другой результат.
В следующем цикле мы проверяем условие, пока переменная $active = ‘true’. Она является вторым параметром для функции curl_multi_exec(). Значение данной переменной будет равно ‘true’, до тех пор, пока какое-то из существующих изменений является активным. Далее мы вызываем функцию curl_multi_select(). Её выполнение ‘блокируется’, пока существует хоть одно активное соединение, до тех пор, пока не будет получен ответ. Когда это произойдёт, мы возвращаемся в основной цикл, чтобы продолжить выполнение запросов.
А теперь давайте применим полученные знания на примере, который будет реально полезным для большого количества людей.
Опции Править
Здесь перечислены только самые распространенные параметры, для получения полного списка см. статью curl_easy_setopt параметры.
CURLOPT_URL Править
Тип аргумента: char* строка с терминальным нулем
Определяет URL, с которым будет работать Libcurl. Это единственный параметр, который обязательно должен быть определен перед вызовом curl_easy_perform. Отправляемая в параметр строка должна быть закодирована, следуя.
CURLOPT_VERBOSE Править
Тип аргумента: long
Установите в параметр 1, чтобы позволить библиотеке подробно отображать информацию о ходе работы. Подробные сведения будут отправлены на STDERR, или в поток установленный параметром CURLOPT_STDERR.
Хотя этот параметр вряд ли пригодится в release версии вашего продукта, его можно эффективно использовать при отладке или составлении отчета об ошибке. Еще одна полезная опция для отладки — CURLOPT_DEBUGFUNCTION.
CURLOPT_WRITEFUNCTION Править
Тип аргумента: Указатель на функцию, которая должна соответствовать следующему прототипу: size_t function( void* ptr, size_t size, size_t nmemb, void* userdata);.
Эта функция вызывается в Libcurl, как только есть полученные данные, которые должны быть сохранены. Размер данных, на которую указывает аргумент ptr является size*nmemb. Получаемые данные не имеют терминальный ноль. Задаваемая функция должна возвращать количество обработанных байт. Если эта сумма будет отличаться от суммы, полученной на входе вашей функции, то будет отдан сигнал об ошибке в библиотеке. Это можно использовать для прервания передачи, с возвращемым значениемCURLE_WRITE_ERROR.
Функция может вернуть значение CURL_WRITEFUNC_PAUSE, которое приведет к приостановке записи в этом соединении. См. curl_easy_pause для более подробной информации.
Эта функция может быть вызвана с нулевым размером данных, если получаемые данные отсутствуют.
Установите этот параметр в NULL, чтобы определить встроенную функцию по умолчанию. Эта функция будет записывать данные в FILE* полученный из CURLOPT_WRITEDATA.
Установить значение в userdata можно параметром CURLOPT_WRITEDATA.
В функцию обратного вызова будет передаваться максимально возможное количество данных во всех вызовах, но это количество невозможно узнать заранее. Максимальный объем данных, который может быть передан в функцию записи, определен в заголовочном файле curl.h, как CURL_MAX_WRITE_SIZE.
CURLOPT_WRITEDATA Править
Тип аргумента: указатель void*, определяемый разработчиком, по умолчанию FILE*
Если вы используете параметр CURLOPT_WRITEFUNCTION, то этот указатель вы получите в качестве аргумента в callback функции. Встроенная функция в CURLOPT_WRITEFUNCTION будет записывать данные в поток FILE*, заданный этим параметром, или в stdout, если этот параметр не был установлен.
Если вы используете Libcurl в Win32 DLL, вы обязательно должны переопределить CURLOPT_WRITEFUNCTION, если вы используете этот параметр, иначе Libcurl будет некорректно работать.
Этот параметр также известен под старым названием CURLOPT_FILE.
Описание Править
curl_easy_setopt используется для задания libcurl соответствующего поведения через установку опций. Опции определяются парой аргументов option и parameter. В зависимости от опции, тип данных для аргумента parameter может быть long, указателем на функцию, указателем на объект или curl_off_t. Внимательно прочитайте данное руководство, так как неправильные входные значения могут привести к некорректной работе libcurl! Вы можете установить только одну опцию за один вызов функции. Обычно используют множество вызовов curl_easy_setopt для установки всех необходимых опций.
Установленные вызовом этой функции опции действительны для всех последующих передач, которые осуществляются с помощью дескриптора handle. Опции не сбрасываются после выполнения передачи, поэтому если для дальнейших передач вы хотите использовать другую комбинацию опций, вам необходимо их изменить явным образом. Возможен сброс всех опций в значение по умолчанию с помощью вызова curl_easy_reset().
Строки, которые передаются в libcurl как аргументы с типом char*, копируются библиотекой, поэтому после возврата из curl_easy_setopt можно их использовать для собственных нужд. Исключения из этого правила приведены в подробном описании опций.
Дескриптор handle можно получить вызовами curl_easy_init() и curl_easy_duphandle().
PHP cURL POST
Разница между и запросами — это синтаксиc для отправки. Для можно указать больше параметров, например, поля, которые будут отправляться. Допустим, вы хотите отправить форму на сайте куда делаете запрос, тогда в данном случае вам точно понадобиться .
// Для начала скажем, что мы хотим использовать cURL $curl = curl_init(); // Определение прааметров. Ссылку (куда будет делаться запрос), какие заголовки будут у этого запроса, задаем, что запрос должен быть в формате POST и передаем параметры этого запроса в виде массива 'ключ' => 'значение'. curl_setopt_array($curl, [ CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'http://testcURL.com', CURLOPT_USERAGENT => 'Codular Sample cURL Request', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => ]); // Отправляем запроса и сохраняем его в $res $res = curl_exec($curl); // Закрываем запрос и удаляем инициализацию $curl curl_close($curl);
Процедура отправки этого запроса почти идентична тому, что было в за исключением двух дополнительных строчек. С помощью мы говорим cURL о том, что хотим отправить запрос и затем прописываем параметры для отправки с в виде массива (сначала имя параметра и затем его значение).
CURLOPT_POSTFIELDS =>
Обратите внимание на то, что если на форме будет стоять капча (проверка на ботов), тогда зарегистрироваться автоматически не получится
Лучшие практики для исправления проблем с curl
Аккуратный и опрятный компьютер — это главное требование для избежания проблем с curl. Для этого требуется регулярная проверка компьютера на вирусы, очистка жесткого диска, используя cleanmgr и sfc /scannow, удаление программ, которые больше не нужны, проверка программ, которые запускаются при старте Windows (используя msconfig) и активация Автоматическое обновление Windows. Всегда помните о создании периодических бэкапов, или в крайнем случае о создании точек восстановления.
Если у вас актуальные проблемы, попробуйте вспомнить, что вы делали в последнее время, или последнюю программу, которую вы устанавливали перед тем, как появилась впервые проблема. Используйте команду resmon, чтобы определить процесс, который вызывает проблемы. Даже если у вас серьезные проблемы с компьютером, прежде чем переустанавливать Windows, лучше попробуйте восстановить целостность установки ОС или для Windows 8 и более поздних версий Windows выполнить команду DISM.exe /Online /Cleanup-image /Restorehealth. Это позволит восстановить операционную систему без потери данных.
Пример FTP-сессии
$fp = fopen(__FILE__, "r"); $url = "ftp://username:password@mydomain.com:21/path/to/newfile.php"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_FTPASCII, 1); curl_setopt($ch, CURLOPT_INFILESIZE, filesize(__FILE__)); $result = curl_exec($ch); curl_close($ch);
При возникновении проблем в использование cURL необходимо добавить следующие строки перед вызовом curl_close для получения отчета о последнем выполненном запросе:
print_r(curl_getinfo($ch)); echo "cURL error number:".curl_errno($ch)." "; echo "cURL error:".curl_error($ch)." "; curl_close($ch);
3672
Веб разработка
9. Перенаправления (redirects)
Отвечая на ваш запрос, сервер вместо самой страницы может вернуть
указание, куда браузер должен пойти дальше, чтобы попасть на нужную
страницу. Заголовок, который указывает браузеру такое перенаправление
— это ‘Location:’.
По умолчанию curl не идет по адресу, указанному в ‘Location:’, а
просто показывает страницу как обычно. Но можно его направить
следующим образом:
# curl -L www.sitethatredirects.com
Если вы используете curl для POST-запросов на сайт, который сразу же
перенаправляет на другую страницу, вы можете смело использовать
связку -L и -d/-F. Curl сформирует POST-запрос для первой страницы, а
затем GET-запрос для последующей.
User Agent
Very similar to the referer field, all HTTP requests may set the User-Agent
field. It names what user agent (client) that is being used. Many
applications use this information to decide how to display pages. Silly web
programmers try to make different pages for users of different browsers to
make them look the best possible for their particular browsers. They usually
also do different kinds of javascript, vbscript etc.
At times, you will see that getting a page with curl will not return the same
page that you see when getting the page with your browser. Then you know it
is time to set the User Agent field to fool the server into thinking you’re
one of those browsers.
To make curl look like Internet Explorer 5 on a Windows 2000 box:
Or why not look like you’re using Netscape 4.73 on an old Linux box:
Certificates
In the HTTPS world, you use certificates to validate that you are the one
you claim to be, as an addition to normal passwords. Curl supports client-
side certificates. All certificates are locked with a pass phrase, which you
need to enter before the certificate can be used by curl. The pass phrase
can be specified on the command line or if not, entered interactively when
curl queries for it. Use a certificate with curl on a HTTPS server like:
curl also tries to verify that the server is who it claims to be, by
verifying the server’s certificate against a locally stored CA cert
bundle. Failing the verification will cause curl to deny the connection. You
must then use
() in case you want to tell curl to ignore that the server can’t be
verified.
More about server certificate verification and ca cert bundles can be read in
the SSLCERTS document.
At times you may end up with your own CA cert store and then you can tell
curl to use that to verify the server’s certificate:
Подготовка помещения
Пожалуй, никто не возьмёт на себя смелость утверждать, что новая мебель хорошо смотрится со старыми обоями. Поэтому, перед тем как спроектировать кухню, необходимо определить, какой ремонт будет произведён, какие материалы при этом будут использованы и какие изменения внесены.
Предполагаемый ремонт можно условно разделить на несколько позиций:
- пол;
- потолок;
- стены (в т. ч. фартук);
- проводка;
- вентиляция и канализация.
Покрытие из плитки и керамогранита холодное и жёсткое, посуда, упавшая на такой пол, разобьётся сразу. Линолеум дешевле, теплее, мягче, однако он не отличается особой долговечностью, к тому же выцветает под действием солнечных лучей. Материалы, используемые при отделке потолка, ничем не отличаются от материалов, применяемых в других комнатах. Используют гипсокартон, краску, натяжные полотна, некоторые до сих пор белят по старинке.
Стены на кухне пачкаются гораздо чаще, чем в других комнатах, ведь брызги жира во время приготовления, всевозможные капли и подтёки постоянно появляются на их поверхности. Поэтому многие отдают предпочтение влагостойким материалам, которые легко очищаются: моющимся обоям, пластиковым панелям, керамической плитке. Между верхними и нижними рядами шкафов гарнитура, в местах максимального загрязнения, обычно прокладывают фартук. Его можно сделать из стекла, из керамической плитки или даже составить из мозаики.
Чтобы оценить, какой из проектов будет смотреться выигрышнее всего, можно создать несколько вариантов оформления помещения в картинках или объёмных 3D моделях. Сразу же на рисунке необходимо отметить места расположения розеток, канализационных труб и вытяжки.
Итак, приступим:
Шаг 1. Установите UnHackMe (1 минута).
- Скачали софт, желательно последней версии. И не надо искать на всяких развалах, вполне возможно там вы нарветесь на пиратскую версию с вшитым очередным мусором. Оно вам надо? Идите на сайт производителя, тем более там есть бесплатный триал. Запустите установку программы.
Затем следует принять лицензионное соглашение.
И наконец указать папку для установки. На этом процесс инсталляции можно считать завершенным.
Шаг 2. Запустите поиск вредоносных программ в UnHackMe (1 минута).
- Итак, запускаем UnHackMe, и сразу стартуем тестирование, можно использовать быстрое, за 1 минуту. Но если время есть — рекомендую расширенное онлайн тестирование с использованием VirusTotal — это повысит вероятность обнаружения не только криптомайнера CURL.EXE, но и остальной нечисти.
Мы увидим как начался процесс сканирования.
Шаг 3. Удалите вредоносные программы (3 минуты).
- Обнаруживаем что-то на очередном этапе. UnHackMe отличается тем, что показывает вообще все, и очень плохое, и подозрительное, и даже хорошее. Не будьте обезьяной с гранатой! Не уверены в объектах из разряда “подозрительный” или “нейтральный” — не трогайте их. А вот в опасное лучше поверить. Итак, нашли опасный элемент, он будет подсвечен красным. Что делаем, как думаете? Правильно — убить! Ну или в английской версии — Remove Checked. В общем, жмем красную кнопку.
После этого вам возможно будет предложено подтверждение. И приглашение закрыть все браузеры. Стоит прислушаться, это поможет.
В случае, если понадобится удалить файл, или каталог, пожалуй лучше использовать опцию удаления в безопасном режиме. Да, понадобится перезагрузка, но это быстрее, чем начинать все сначала, поверьте.
Ну и в конце вы увидите результаты сканирования и лечения.
Итак, как вы наверное заметили, автоматизированное лечение значительно быстрее и проще! Лично у меня избавление от криптомайнера CURL.EXE заняло 5 минут! Поэтому я настоятельно рекомендую использовать UnHackMe для лечения вашего компьютера от любых нежелательных программ!
Формы
Формы — основной способ представления web-сайта как HTML-страницы
с полями, в которые пользователь вводит данные, и затем нажимает на
кнопку ‘OK’ или ‘Отправить’, после чего данные отсылаются на сервер.
Затем сервер использует принятые данные и решает, как действовать
дальше: искать информацию в базе данных, показать введенный адрес на
карте, добавить сообщение об ошибке или использовать информацию для
аутентификации пользователя. Разумеется, на стороне сервера имеется
какая-то программа, которая принимает ваши данные.
4.1 GET
GET-форма использует метод GET, например следующим образом:
<form method="GET" action="junk.cgi"> <input type=text name="birthyear"> <input type=submit name=press value="OK"> </form>
Если вы откроете этот код в вашем браузере, вы увидите форму с
текстовым полем и кнопку с надписью «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-запрос, похожа на предыдущую:
<form method="POST" action="junk.cgi"> <input type=text name="birthyear"> <input type=submit name=press value=" OK "> </form>
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 и т.п. Недостаток внимания к этому вопросу — частая ошибка,
из-за чего данные передаются не так, как надо.
4.3 Загрузка файлов с помощью POST (File Upload POST)
В далеком 1995 был определен дополнительный способ передавать
данные по HTTP. Он задокументирован в RFC 1867, поэтому этот способ
иногда называют RFC1867-posting.
Этот метод в основном разработан для лучшей поддержки загрузки
файлов. Форма, которая позволяет пользователю загрузить файл,
выглядит на HTML примерно следующим образом:
<form method="POST" enctype='multipart/form-data' action="upload.cgi"> <input type=file name=upload> <input type=submit name=press value="OK"> </form>
Заметьте, что тип содержимого Content-Type установлен в
multipart/form-data.
Чтобы отослать данные в такую форму с помощью curl, введите
команду:
# curl -F upload=@localfilename -F press=OK
4.4 Скрытые поля
Обычный способ для передачи информации о состоянии в
HTML-приложениях — использование скрытых полей в формах. Скрытые поля
не заполняются, они невидимы для пользователя и передаются так же,
как и обычные поля.
Простой пример формы с одним видимым полем, одним скрытым и
кнопкой ОК:
<form method="POST" action="foobar.cgi"> <input type=text name="birthyear"> <input type=hidden name="person" value="daniel"> <input type=submit name="press" value="OK"> </form>
Чтобы отправить POST-запрос с помощью curl, вам не нужно думать о
том, скрытое поле или нет. Для curl они все одинаковы:
# curl -d "birthyear=1905&press=OK&person=daniel"
4.5 Узнать, как выглядит POST-запрос
Когда вы хотите заполнить форму и отослать данные на сервер с
помощью curl, вы наверняка хотите, чтобы POST-запрос выглядел точно
также, как и выполненный с помощью браузера.
Простой способ увидеть свой POST-запрос, это сохранить
HTML-страницу с формой на диск, изменить метод на GET, и нажать
кнопку ‘Отправить’ (вы можете также изменить URL, которому будет
передаваться данные).
Вы увидите, что данные присоединились к URL, отделенные символами
‘?’, как и предполагается при использовании GET-форм.