CURL CSRF Token

Я несколько месяцев назад мой коллега создал подписку на календарь, получив график работы. Я считаю, что он сделал это cURL.

Теперь я создаю веб-сайт, чтобы ознакомиться с задачами, которые должны быть выполнены сегодня.

Я хочу получить расписание, чтобы я мог использовать его для отображения имени людей, работающих в определенный день.

Я нашел учебное пособие в Интернете, в котором объясняется, как я могу получить данные после входа в систему. я сделал то, что я скопировал имя полей ввода в форме входа, а имя скрытого поля с именем signin [_csrf_token]

с этими именами я создал следующий код:

<?php $username = "myusername"; $password = "mypassword"; $url = "http://planner.a-mac.nl/employeeSchedule"; $cookie= "koekje.txt"; $token = "2e4c16f2b664f3ed01827dd38dc11d22"; $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/'.$cookie); curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/'.$cookie); curl_setopt($ch, CURLOPT_POSTFIELDS, "signin[username]=" . $username ."&signin[password]=" . $password . "&signin[_csrf_token]=" . $token); //stuur de gegevens uit het formulier door naar de link curl_exec($ch); //Zet de output op het scherm if (curl_errno($ch)) { print curl_error($ch); //Als er een fout is geef deze dan } else { curl_close($ch); //Sluit de link met de website } ?> 

Когда я загружаю свою страницу с указанным выше кодом, я получаю форму для входа с сообщением об ошибке:

Обнаружена атака CSRF

Может ли кто-нибудь помочь мне решить эту проблему, чтобы я мог получить данные, которые я получил с веб-сайта?

Я связался со своим старым коллегой, но он говорит: «Он больше не знает» …

Значение поля токена CSRF не является фиксированным, но является случайно генерируемым значением для вновь созданных сеансов. Сначала вам нужен «чистый» вызов веб-страницы, чтобы получить значение токена CSRF, только после этого вы можете POST имя пользователя / пароль вместе с токеном CSRF, как в:

 <?php $username = "myusername"; $password = "mypassword"; $url = "http://planner.a-mac.nl/employeeSchedule"; $cookie= "koekje.txt"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/'.$cookie); curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/'.$cookie); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if (curl_errno($ch)) die(curl_error($ch)); $doc = new DOMDocument(); $doc->loadHTML($response); $token = $doc->getElementById("signin__csrf_token")->attributes->getNamedItem("value")->value; curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); curl_setopt($ch, CURLOPT_POST, true); $params = array( 'signin[username]' => $username, 'signin[password]' => $password, 'signin[_csrf_token]' => $token ); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_exec($ch); if (curl_errno($ch)) print curl_error($ch); curl_close($ch); ?> 

Идея защиты CSRF основана на создании уникального токена для каждой загрузки страницы, которую вы должны передать с помощью формы.

Вам нужно будет загрузить страницу с помощью формы, извлечь токен со страницы и передать это вместе с запросом POST. Как правило, после любой попытки токен недействителен, и вы должны снова запросить форму, чтобы получить новый токен.

Маркер CSRF хранится в сеансе, поэтому сервер может видеть, совпадает ли тот, который был сгенерирован в форме, с запросом, отправляющим форму.

У меня такое ощущение, что вы должны добавить токен следующим образом:

 $headers[] = 'X-CSRF-Token:' . $token; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);