Итак, немного о том, что происходит.
form_key
, по-видимому, используется как форма защиты от CSRF, в частности, это токен синхронизатора .
Короче говоря, пользователь посещает веб-страницу, веб-страница создает сеанс для пользователя и генерирует уникальный токен.Затем сервер присоединяет этот уникальный токен к форме как скрытое поле.Когда пользователь отправляет эту форму, она отправляется с этим скрытым полем, и сервер может перекрестно ссылаться на то, что полученный токен совпадает с отправленным.
Однако важной частью является то, что сервер должен знать, кто пользователь, и это делается в течение сеанса.Сеанс поддерживается с помощью файла cookie сеанса, поэтому файл cookie сеанса необходим.
Чтобы правильно смоделировать реального пользователя, вам необходимо сохранить куки-файлы, которые сервер отправляет вам при первом посещении, это делается с помощью CURLOPT_COOKIEJAR
:
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://b2b.chiemsee.com/customer/account/login/");
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true); // to allow redirections
//curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, FALSE); // to avoid error
curl_setopt($ch2, CURLOPT_POST, true); // to send info
curl_setopt($ch2, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch2, CURLOPT_COOKIEJAR, 'cookie.txt'); // to save session cookie
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); // to get the html
$response2 = curl_exec($ch2);
curl_close($ch2);
после того, как вы это сделалии получил токен CSRF, очистив страницу, которую необходимо отправить, вместе с соответствующими файлами cookie:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://b2b.chiemsee.com/customer/account/loginPost/"); //Make sure you have the correct URL
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // to allow redirections
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // to avoid error
curl_setopt($ch, CURLOPT_POST, true); // to send info
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // to read cookie data
curl_setopt($ch2, CURLOPT_COOKIEJAR, 'cookie.txt'); // optional, this will update existing cookies and add new ones if needed.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // to get the html
$response = curl_exec($ch);
if (curl_error($ch)) {
$error_msg = curl_error($ch);
var_dump($error_msg);
exit;
}
curl_close($ch);
echo $response;
Это должно позволить серверу загрузить правильный сеанс, для которого токен CSRF был создан в первую очередь.и затем проверьте тот токен, который вы отправляете.
Как примечание: Причина токена проста.Если я создаю веб-страницу, которая обманывает пользователей, чтобы они могли публиковать их непосредственно на другой веб-странице, то этот токен является частью данных, к которым у меня никогда не будет доступа, так как я делюсь ими напрямую только с пользователем, поэтому третьи стороны не могут получить к нему доступ.Это может усложнить реализацию таких автоматизаций, как ваша, но это очень эффективно для безопасности пользователей.