CURL (Client URL Library)

PHP 10.10.21 10.10.21 22
Бесплатные курсына главную сниппетов

Помимо сокетов и потоков, обеспечивающих низкоуровневое обращение к серверу, PHP располагает специальным расширением CURL (Client URL Library).
Расширение предоставляет более широкие средства управления сетевыми операциями.

Подключение расширений

Для установки расширения в операционной систем Windows необходимо отредактировать конфигурационный файл php.ini, раскомментировав строку extension=php_curl.dll
В случае Ubuntu установить расширение можно при помощи команды $ sudo apt-get install php7-curl
Для Mac OS X можно воспользоваться менеджером пакетов Homebrew, указав директи-ву --with-curl при установке $ brew install php70 --with-curl либо отдельно установив расширение при помощи команды $ brew install php70-curl

ЗАМЕЧАНИЕ
Для того, чтобы функции библиотеки CURL были доступны из PHP-скрипта, в конфигурационном файле php.ini необходимо подключить расширение php_curl.dll, сняв комментарий (точка с запятой ;) c директивы extension. Помимо этого нужно скопировать библиотеки ssleay32.dll и libeay32.dll из каталога, где расположен PHP, в папку, прописанную в переменной окружения PATH, например, в C:\Windows\system32.
<?php 
  // Задаем адрес удаленного сервера 
  $curl = curl_init("http://php.net"); 
  // Устанавливаем параметры соединения 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
  // Получаем содержимое страницы 
  $content = curl_exec($curl); 
  // Закрываем CURL-соединение 
  curl_close($curl); 
  // Выводим содержимое страницы 
  echo $content; 
?>

Параметры CURL-соединения

Тип Описание
CURLOPT_AUTOREFERER При установке этого параметра в true, если осуществляетсяследование HTTP-заголовку Location, HTTP-заголовок Referer устанавливается автоматически
CURLOPT_CRLF При установке этого параметра в true UNIX-переводы строк \n автоматически преобразуются к виду \r\n
CURLOPT_HEADER При установке этого параметра в true результат будет включать полученные HTTP-заголовки
CURLOPT_NOBODY При установке этого параметра в true результат не будет включать документ. Часто используется для того, чтобы получить только HTTP-заголовки
CURLOPT_POST При установке этого параметра в true отправляется POST-запрос типа application/x-www-form-urlencoded
CURLOPT_PUT При установке этого параметра в true будет производиться закачка файла методом PUT протокола HTTP. Файл задается параметрами CURLOPT_INFILE и CURLOPT_INFILESIZE. Впрочем, метод PUT на большинстве серверов запрещен к использованию
CURLOPT_RETURNTRANSFER При установке этого параметра в true CURL будет возвращать результат, а не выводить его
CURLOPT_UPLOAD При установке этого параметра в true производится закачка файла на удаленный сервер
CURLOPT_HTTP_VERSION Версия HTTP-протокола; допустимы три значения:
CURL_HTTP_VERSION_NONE (версия выбирается автоматически),
CURL_HTTP_VERSION_1_0 (используется HTTP 1.0),
CURL_HTTP_VERSION_1_1 (используется HTTP 1.1)
CURLOPT_HTTPAUTH Метод (методы) HTTP-аутентификации; допустимые значения:
CURLAUTH_BASIC, CURLAUTH_DIGEST, CURLAUTH_GSSNEGOTIATE, CURLAUTH_NTLM, CURLAUTH_ANY и CURLAUTH_ANYSAFE
CURLOPT_INFILESIZE Размер файла при его загрузке на удаленный сервер
CURLOPT_COOKIE Содержимое HTTP-заголовка Cookie. Для установки нескольких значений cookie можно использовать несколько вызовов функции curl_setopt()
CURLOPT_COOKIEFILE Имя файла, содержащего данные cookie
CURLOPT_COOKIEJAR Имя файла, в который сохраняются несессионные cookies, доступные при следующем сеансе соединения с сервером
CURLOPT_RANGE Координаты фрагмента загружаемого файла в формате “X-Y” (вместо X и Y указываются позиции байта в файле). Одна из координат может быть опущена, например: “X-”. Протокол HTTP также поддерживает передачу нескольких фрагментов файла, это задается в виде “X-Y,N-M”. Используется для загрузки файла с точки последнего обрыва связи
CURLOPT_REFERER Значение HTTP-заголовка Referer
CURLOPT_URL URL, с которым будет производиться операция. Значение этого параметра также может быть задано при вызове функции curl_init()
CURLOPT_USERAGENT Задает значение HTTP-заголовка User-Agent
CURLOPT_USERPWD Строка с именем пользователя и паролем в виде [username]:[password]
CURLOPT_HTTPHEADER Массив со всеми HTTP-заголовками

Использование CURL. Файл curl.php

<?php ## Использование CURL 
  // Задаем адрес удаленного сервера 
  $curl = curl_init("http://php.net"); 
  // Получаем содержимое страницы 
  echo curl_exec($curl); 
  // Закрываем CURL-соединение 
  curl_close($curl); 
?>

Получение HTTP-заголовков. Файл headers.php

<?php ## Получение HTTP-заголовков 
  function get_content($hostname) 
  { 
    // Задаем адрес удаленного сервера 
    $curl = curl_init($hostname); 
     // Вернуть результат в виде строки 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
    // Включить в результат HTTP-заголовки 
    curl_setopt($curl, CURLOPT_HEADER, 1); 
    // Исключить тело HTTP-документа 
    curl_setopt($curl, CURLOPT_NOBODY, 1); 
     // Получаем HTTP-заголовки 
    $content = curl_exec($curl); 
    // Закрываем CURL-соединение 
    curl_close($curl); 
     // Преобразуем строку $content в массив 
    return explode("\r\n", $content); 
  } 
  $hostname = "http://php.net"; 
  $out = get_content($hostname); 
   echo "<pre>"; 
  print_r($out); 
  echo "</pre>"; 
?>

Обращение к серверу точного времени. Файл time.php

<?php ## Обращение к серверу точного времени 
  // Задаем адрес удаленного сервера 
  $curl = curl_init("http://wwv.nist.gov:13"); 
  // Получаем содержимое страницы 
  echo curl_exec($curl); 
  // Закрываем CURL-соединение 
  curl_close($curl); 
?>

////////////

Отправка данных методом POST. Файл post.php

<?php ## Отправка данных методом POST 
  // Задаем адрес удаленного сервера 
  $curl = curl_init("http://localhost/handler.php"); 
   // Передача данных осуществляется методом POST 
  curl_setopt($curl, CURLOPT_POST, 1); 
  // Задаем POST-данные 
  $data = "name=".urlencode("Игорь"). 
          "&pass=".urlencode("пароль")."\r\n\r\n"; 
  curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 
   // Выполняем запрос 
  curl_exec($curl);
  // Закрываем CURL-соединение 
  curl_close($curl); 
?>

HTML-форма. Файл form.html

<!DOCTYPE html> 
<html lang="ru"> 
<head> 
  <title>Форма</title> 
  <meta charset='utf-8'> 
</head> 
<body> 
  <form action='handler.php' method='post'> 
  Имя : <input type='text' name='name'><br /> 
  Пароль : <input type='text' name='pass'><br /> 
  <input type='submit' value='Отправить'> 
  </form> 
</body> 
</html> 

POST-обработчик формы. Файл handler.php

<?php ## POST-обработчик формы 
  if(!empty($_POST)) { 
    echo "Имя - ".htmlspecialchars($_POST['name'])." <br />"; 
    echo "Пароль - ".htmlspecialchars($_POST['pass'])." <br />"; 
  } 
?>

Остается только удалить HTTP-заголовки, и результат будет идентичен обращению к обработчику из HTML-формы.

ЗАМЕЧАНИЕ
Такого рода скрипты используются для автопостинга — автоматического размещения рекламных или провокационных сообщений в гостевых книгах и форумах в значительных количествах. Самым эффективным способом защиты от такого вида атак является автоматическая генерация изображения с кодом, который помещается в сессию. Пока пользователь не введет код в HTML-форму, сервис не срабатывает. Изображение может быть дополнено помехами, которые не помешают его прочитать "живому" посетителю, но потребуют от злоумышленника решения серьезной задачи распознавания образов.

////////////

При обращении PHP-скрипта к страницам сайта при помощи файловых функций сервер делает в переменную окружения USER_AGENT запись вида: PHP 5.3. Вид этой записи определяется директивой user_agent конфигурационного файла php.ini. В результате скрипт получает доступ к этому идентификатору через элемент суперглобального массива $_SERVER['USER_AGENT']. Однако этот способ проверки не может считаться универсальным, т. к. переменную окружения устанавливает клиент при помощи HTTP-заголовка User-Agent. Любой HTTP-заголовок, который передает клиент, может быть изменен.

Передача пользовательского агента. Файл user_agent.php

<?php ## Передача пользовательского агента 
  // Задаем адрес удаленного сервера 
  $curl = curl_init("http://localhost/handler.php"); 
   // Устанавливаем реферер 
  $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"; 
  curl_setopt($curl, CURLOPT_USERAGENT, $useragent); 
   // Выполняем запрос 
  curl_exec($curl); 
  // Закрываем CURL-соединение 
  curl_close($curl); 
?>

 

на главную сниппетов
Курсы