@NeTLeaDeR

Авторизация с помощью cUrl. В чём ошибка?

Всем привет. Необходимо авторизоваться на сайте с помощью Curl.
$curl = curl_init();
        curl_setopt($curl, CURLOPT_COOKIEJAR, "cookies.txt");
        curl_setopt($curl, CURLOPT_COOKIEFILE, "cookies.txt"); 
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3'); 
        curl_setopt($curl, CURLOPT_URL, 'https://sitename.com'); 
        $html = curl_exec($curl);

- Получаю страницу авторизации

При авторизации отправляется 3 параметра (посмотрел через консоль). В url'е, на который отправляется, меняется get-параметр signin (не проблема, вытаскиваем со страницы авторизации), так же отправляется динамическое значение idsrv.xsrf (указано в скрытом поле, его тоже парсим и отправляем).
$post = 'idsrv.xsrf='.$idsrv_xsrf.'&Username=example@inbox.ru&Password=passwrd';
        
        curl_setopt($curl, CURLOPT_URL, 'https://sitename.com/identity/login?signin='.$key.'&checkout=False&showAllOptions=False');
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
        $html = curl_exec($curl);


Сама проблема - до попытки авторизации всё проходит отлично, кукисы записываются в файл, страница парсится. Но, как только я пытаюсь отправить данные на авторизацию, приходит пустой ответ и в кукисы записывается "[]". В чём может быть проблема?

P.S. поле idsrv_xsrf обновляется постоянно, открывал исходный код с интервалом ~1 сек, значения были разные. Может ли быть проблема в этом? Заранее спасибо
  • Вопрос задан
  • 1572 просмотра
Решения вопроса 1
glebovgin
@glebovgin
Full Stack Web Developer
День добрый.

XSRF (он же CSRF) ключ генерируется и сохраняется на стороне сервера (вероятно, в сессии), это нормально, но для этого и нужен.
Логика скрипта должна быть такой:
1. Скрип получает страницу авторизации
2. Берет значение XSRF-поля
3. Отправляет все данные для авторизации.

Все это должно делаться в рамках одной сессии скрипта.
Попробуйте объект curl перед отправкой данных авторизации создать новый. Из вашего кода создается ощущение, что вы используете один и тот же объект и для получения данных и для отправки данных авторизации.
Ну и в панели разработчика Хрома или Firefox проверьте - точно ли отправляются только эти 3 поля или сервер "ждет" еще какое-то поле, значение которого генерируется через JS. Проверить просто - отключите JS и попробуйте авторизоваться на сайте.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы