Я купил книгу о веб-соскабливании с помощью php. В нем автор входит в систему https://www.packtpub.com/. Книга устарела, поэтому я не могу проверить идеи, потому что веб-сайт изменился с момента выпуска. Это модифицированный код, который я использую, но логины не увенчались успехом, и я пришел к выводу, что строка «Параметры учетной записи» не входит в переменную $results
. Что я должен изменить? Я считаю, что ошибка исходит из неправильного указания адресата.Войти на веб-страницу с php с cURL
<?php
// Function to submit form using cURL POST method
function curlPost($postUrl, $postFields, $successString) {
$useragent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5;
en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3'; // Setting useragent of a popular browser
$cookie = 'cookie.txt'; // Setting a cookie file to storecookie
$ch = curl_init(); // Initialising cURL session
// Setting cURL options
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // PreventcURL from verifying SSL certificate
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_FAILONERROR, TRUE); // Script shouldfail silently on error
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE); // Use cookies
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // FollowLocation: headers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // Returningtransfer as a string
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); // Settingcookiefile
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); // Settingcookiejar
curl_setopt($ch, CURLOPT_USERAGENT, $useragent); // Settinguseragent
curl_setopt($ch, CURLOPT_URL, $postUrl); // Setting URL to POSTto
curl_setopt($ch, CURLOPT_POST, TRUE); // Setting method as POST
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postFields)); // Setting POST fields as array
$results = curl_exec($ch); // Executing cURL session
$httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
echo "$httpcode";
curl_close($ch); // Closing cURL session
// Checking if login was successful by checking existence of string
if (strpos($results, $successString)) {
echo "I'm in.";
return $results;
} else {
echo "Nope, sth went wrong.";
return FALSE;
}
}
$userEmail = '[email protected]'; // Setting your email address for site login
$userPass = 'yourpass'; // Setting your password for sitelogin
$postUrl = 'https://www.packtpub.com'; // Setting URL toPOST to
// Setting form input fields as 'name' => 'value'
$postFields = array(
'email' => $userEmail,
'password' => $userPass,
'destination' => 'https://www.packtpub.com',
'form_id' => 'packt-user-login-form'
);
$successString = 'Account Options';
$loggedIn = curlPost($postUrl, $postFields, $successString); //Executing curlPost login and storing results page in $loggedIn
EDIT: после запроса:
Я заменил линию
'destination' => 'https://www.packtpub.com'
with
'op' => 'Login'
, добавлено
'form_build_id' => ''
и редактируются
$postUrl = 'https://www.packtpub.com/register';
так как это URL, который я получаю при выборе копии как cURL и вставки в редакторе.
Я все еще получаю сообщение «Нет, я ошибался». Я думаю, это потому, что $successString
не хранится в curl в первую очередь. Каким должен быть установлен тип-build-id? Он меняется каждый раз, когда я вхожу в систему.
'form_build_id' может быть токеном CSRF. Если это так, вам нужно будет сделать запрос на страницу входа в систему (запрос GET), а затем проанализировать HTML, чтобы извлечь это значение. Вероятно, это скрытое поле формы. Попробуйте воспроизвести запрос в Firefox с пустым 'form_build_id' и проверить ответ. – BugHunterUK
Похоже, что 'form_build_id' является токеном CSRF. Кажется, они используют Drupal. У меня нет времени, чтобы написать запрос cURL в PHP. Если у меня будет время, когда я вернусь домой, я выбью пример для вас. Вот некоторая полезная информация о том, что такое токен CSRF и почему они используются: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29 – BugHunterUK
Также обратите внимание: вместо этого вы использовали '-' '_' в' form_id': p – BugHunterUK