17

リンクのクリックによる自動ログインが必要なクライアントのプロジェクトに取り組んでいます。

次のコードでこれを行うためにハンドシェイク ページを使用しています。

$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 アプリケーションは "blog" ディレクトリ内の "wordpress" ディレクトリにあります。ブラウザの URL には..blog/handshake.php. ただし、ブラウザ ウィンドウには WordPress の管理セクションがあります。../blogディレクトリにある必要があるときにURL がディレクトリにあるため、WordPress の管理リンクが正しく機能しません..blog/wordpress/wp-admin

cURLでブラウザの URL が実際のページを反映するようにする方法はありますか?

代わりに FSockOPen を使用する必要がありますか?

4

5 に答える 5

14

Kaliumはこれを正しく理解しました。WordPressインターフェースのパスは相対的であるため、この方法でアクセスすると管理インターフェースが正しく機能しません。

あなたのアプローチはいくつかの点で懸念されているので、私はいくつかの簡単な提案をしたいと思います。

まず、ハードコーディングされていない変数$usernameと変数を削除する方法を見つけようとします。$passwordこれがいかに簡単に破れるかを考えてみてください。たとえば、管理インターフェースを介してパスワードが更新された場合、コード内のハードコードされた値は正しくなくなり、「自動ログイン」は失敗します。さらに、誰かが何らかの形でサイトを構成し、アクセスをhandshake.php取得した場合、あなたのブログのユーザー名とパスワードを入手できます。

/blog(サンプルコード内の)へのパスが相対的であることを考えると、WordPressのインストールは作成したハンドシェイクスクリプトと同じサーバー上にあるように見えます。したがって、親アプリケーションのログインで検証するセッションを模倣することをお勧めします。私は過去にこれを数回行いました-詳細を思い出せません。したがって、たとえば、ログインスクリプトは、ログインクレデンシャルを設定するだけでなく、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を使用してユーザーを認証し、管理インターフェイスを現在のページに乗っ取ろうとするのではなく、通常の管理インターフェイスにリダイレクトします。

これがお役に立てば幸いです。さらにサポートが必要な場合はお知らせください/解決策が明確ではありません。

于 2010-01-05T22:11:47.513 に答える
1

HTMLソースを確認してください。WPのリンクは相対的なもののようです。ただし、このプロセスをこれまでよりもさらに複雑にするのではなく、ログインを実行し、必要なCookieをユーザーに渡して、リダイレクトすることをお勧めします。

それ以外の場合は、プロキシを1つずつコーディングしています。

于 2009-04-08T04:14:11.093 に答える
1

スクリプトが 1 回の実行で必要なすべての機能を実行しない場合は、Cookie 値を解析してファイルに保存し、次の実行時に再送信する必要がある場合があります。CURLOPT_COOKIEFILE オプションを確認してください。

于 2009-05-20T05:17:53.257 に答える
1

これが私のために働いたコードです:

主な変更点は、投稿文字列から「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)
于 2020-05-31T03:02:33.860 に答える
0

Zend Framework の Cookiesクラスを使用して、それらを管理します。cURLを使用して Web サイトの安全なセクションをクロールするために、これを過去に使用しました。

于 2010-01-11T20:19:12.553 に答える