Авторизация с помощью curl
Рассмотрим случай, когда форма содержит скрытоe поле для защиты от CSRF-атаки. Поэтому необходимо получить страницу с формой, забрать скрытые данные, затем отправить post-запрос для авторизации и затем перейти на страницу личного кабинета (если нет редиректа после авторизации).
При этом будем сохранять cookies в файл $cookiefile.
Так как часто требуется точно моделировать браузер, то есть указывать нужные заголовки (иначе запрос отклоняется), то установим программу Burp Suite (бесплатную версию) и добавим через браузер прокси 127.0.0.1:8080. Браузер надо будет перезагрузить. При этом выключим intercept (это возможность останавливать запрос, корректировать и отправлять после этого по назначению).
Еще придется добавить сертификат cacert.der (выгрузить файл из Burp Suite).
Далее отправляем запросы с браузера и с curl и сравниваем в Proxy/HTTP History: все отличия добавляем в curl.
На время работы с proxy добавляем строки:
1 2 |
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8080'); curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); |
Возможна проблема с кодировкой. То есть с proxy все правильно, без - не работает (например, ошибка Malformed UTF-8 characters, possibly incorrectly encoded). Кроме преобразования кодировки можно еще попробовать изменить или удалить строку 'Accept-Encoding: gzip, deflate'.
Фрагмент кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
$ch = curl_init('https://site.ru/login.html'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'X-Requested-With: XMLHttpRequest', 'Accept: application/xml, text/xml, */*; q=0.01', 'Faces-Request: partial/ajax', 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7', 'Host: site.ru', 'Origin: https://site.ru', 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' ]); curl_setopt($ch, CURLOPT_REFERER, 'https://site/login.html'); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'login:login' => $login, 'login:pwd' => $password, 'login:token' => $token, 'javax.behavior.event' => 'action', 'javax.partial.event' => 'click', 'login:SUBMIT' => 1 ]) ); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8080'); curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); $html = curl_exec($ch); curl_close($ch); |
Обратите внимание на функцию http_build_query, чтобы заменить символы +, : и др. на %2B и т.п.
Если https, то добавляем
1 2 |
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); |