PHP, cURL пост для входа в WordPress
Я работаю над проектом для клиента, которому нужен автоматический вход по ссылке.
Я использую страницу рукопожатия, чтобы сделать это с помощью следующего кода:
$username = "admin";
$password = "blog";
$url = "http://wordpressblogURL/";
$cookie = "cookie.txt";
$postdata = "log=" . $username . "&pwd=" . $password . "&wp-submit=Log%20In&redirect_to=" . $url . "blog/wordpress/wp-admin/&testcookie=1";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url . "blog/wordpress/wp-login.php");
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_REFERER, $url . "blog/wordpress/wp-login.php");
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);
curl_close($ch);
echo $result;
exit;
Это отлично работает. Это регистрирует меня в великой.
Проблема в том, что я считаю, что WordPress отключает URL.
Чтобы уточнить, моя страница рукопожатия (которая регистрирует меня) находится в каталоге "blog", а мое приложение WordPress находится в каталоге "wordpress", который находится внутри каталога "blog". URL в браузере говорит ..blog/handshake.php
, Тем не менее, он имеет раздел администратора WordPress в окне браузера. Ссылки администратора WordPress теперь не работают должным образом, потому что URL находится в ../blog
каталог, когда он должен быть в ..blog/wordpress/wp-admin
каталог.
Есть ли способ в cURL сделать так, чтобы URL в браузере отражал реальную страницу?
Должен ли я использовать FSockOPen вместо этого?
4 ответа
Kalium понял это правильно - пути в интерфейсе WordPress являются относительными, поэтому интерфейс администратора не работает должным образом при доступе таким способом.
Ваш подход касается нескольких аспектов, поэтому я хотел бы дать несколько быстрых рекомендаций.
Во-первых, я бы попытался найти способ удалить $username
а также $password
переменные от жестко закодированы. Подумайте о том, как легко это сломать - например, если пароль обновляется через интерфейс администрирования, жестко заданное значение в вашем коде больше не будет правильным, и ваш "автоматический вход" теперь не удастся. Кроме того, если кто-то каким-то образом включает в себя сайт и получает доступ к handshake.php
- Ну, теперь у них есть имя пользователя и пароль для вашего блога.
Похоже, что ваша установка WordPress покоится на том же сервере, что и скрипт рукопожатия, который вы написали, учитывая путь к /blog
является относительным (в вашем примере кода). Соответственно, я бы предложил попытаться имитировать сеанс, который они проверяют при входе в родительские приложения. Я делал это несколько раз в прошлом - просто не могу вспомнить конкретику. Так, например, ваш сценарий входа в систему не только установит ваши учетные данные для входа, но также и установит ключи сеанса, необходимые для аутентификации WordPress.
Этот процесс будет включать в себя копание большого количества кода WordPress, но в этом вся прелесть открытого исходного кода! Вместо использования значений cURL и жесткого кодирования попробуйте просто интегрировать механизм аутентификации WordPress в механизм входа в приложение. Я бы начал с поиска источника wp-login.php
и идти оттуда.
Если ничего не помогает, и вы решили не пытаться объединить механизм аутентификации сеанса с механизмом WordPress, то вы можете немедленно решить вашу проблему (не затрагивая более важные аспекты вашего подхода) с помощью следующих изменений в коде:
Сначала добавьте следующий curl_opt:
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); // Enables session support
Затем добавьте это после закрытия обработчика cURL:
curl_close($ch);
// Instead of echoing the result, redirect to the administration interface, now that the valid, authenticated session has been established
header('location: blog/wordpress/wp-admin/');
die();
Таким образом, в этом далеко не идеальном решении вы будете использовать cURL для аутентификации пользователя, а затем вместо попытки перехватить интерфейс администрирования на текущей странице, перенаправить их на обычный интерфейс администрирования.
Надеюсь, это поможет! Дайте мне знать, если вам нужна дополнительная помощь / решение не ясно.
Вот код, который у меня сработал:
Ключевое изменение состоит в том, что я удалил параметр под названием "testcookie" из строки сообщения.
Примечание: добавьте свой веб-сайт вместо mywordpress, а также имя пользователя и пароль в приведенный ниже код.
$curl = curl_init();
//---------------- generic cURL settings start ----------------
$header = array(
"Referer: https://mywordpress/wp-login.php",
"Origin: https://mywordpress",
"Content-Type: application/x-www-form-urlencoded",
"Cache-Control: no-cache",
"Pragma: no-cache",
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15"
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookies.txt');
//---------------- generic cURL settings end ----------------
$url = 'https://mywordpress/wp-login.php';
curl_setopt($curl, CURLOPT_URL, $url);
$post = 'log=username&pwd=password&wp-submit=Log+In&redirect_to=https%3A%2F% mywordpress%2Fwp-admin%2F';
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
$output = curl_exec($curl);
curl_close ($curl);
echo ($output)
Если ваш скрипт не выполняет все функции, которые вам нужны в одном выполнении, вам может понадобиться проанализировать значения файлов cookie, сохранить их в файле и затем повторно отправить при следующем выполнении. Проверьте опцию CURLOPT_COOKIEFILE.
Проверьте исходный код HTML. Похоже, что ссылки WP могут быть относительными. Однако вместо того, чтобы сделать этот процесс еще более сложным, чем он есть, я предлагаю вам выполнить вход, передать пользователю все файлы cookie и перенаправить их.
В противном случае вы кодируете прокси по частям.
Используйте класс Cookies Zend Framework, чтобы управлять ими за вас. Я использовал это в прошлом для сканирования защищенных разделов веб-сайта с использованием cURL.