web-dev-qa-db-ja.com

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

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

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

16
mmundiff

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

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

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

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

これがお役に立てば幸いです。さらにヘルプが必要な場合/解決策が明確でない場合はお知らせください。

13
Skone

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

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

1
Kalium

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

1
Chris Henry

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

0
Jake N