2

PHP スクリプトとの通信に libcurl を使用する C++ クライアントを作成しています。

通信はセッション ベースである必要があるため、最初のタスクはログインして、PHP スクリプトでセッションを設定することです。

私は、C++ や PHP からセッションを操作することに慣れていません。私は基本的に、それが Cookie とセッション ID の通信に関係していることを知っています。

簡単なセッション管理の使用例を示す curl ホームページの例が見つかりません。

curl の次のオプションの 1 つまたは多くと関係があると思います。

CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST

しかし、たとえば CURLOPT_COOKIESESSION のドキュメントだけでは全体像はわかりません。

これを行ったことのある人は、コンセプトを示す簡単なコードを共有してください。

よろしく

ロバート

4

3 に答える 3

3

私が理解している限り、セッションの各リクエストで CURL ハンドルを再利用する限り、Cookie を有効にすると、CURL はセッション Cookie を自動的に処理します。

CURL *Handle = curl_easy_init();

// Read cookies from a previous session, as stored in MyCookieFileName.
curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, MyCookieFileName );
// Save cookies from *this* session in MyCookieFileName
curl_easy_setopt( Handle, CURLOPT_COOKIEJAR, MyCookieFileName );

curl_easy_setopt( Handle, CURLOPT_URL, MyLoginPageUrl );
assert( curl_easy_perform( Handle ) == CURLE_OK );

curl_easy_setopt( Handle, CURLOPT_URL, MyActionPageUrl );
assert( curl_easy_perform( Handle ) == CURLE_OK );

// The cookies are actually saved here.
curl_easy_cleanup( Handle );

COOKIEFILE と COOKIEJAR の両方を設定する必要があるとは断言できませんが、ドキュメントではそのように思われます。いずれにせよ、CURL で Cookie を有効にするには、2 つのうちの 1 つを設定する必要があります。次のような簡単なことを行うことができます。

curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, "" );

これにより、ディスクから Cookie が読み取られることはありませんが、curl ハンドルの期間中はセッション Cookie が有効になります。

于 2008-10-15T16:28:07.143 に答える
1

bash でのコマンド ライン curl の例があります。PHPMyAdmin にログインし、そのエクスポート機能を使用します。多分それはあなたを助けるでしょう:

#!/bin/bash

PHPMYADMINURL="http://www.example.com/phpmyadmin/"

# Username and password, has to be URL-encoded
MYUSERNAME="username"
MYPASSWORD="password"

TMPCOOKIES="$(mktemp)" || exit 1

TOKEN=$(
        curl \
                --silent \
                --show-error \
                --data @- \
                --data "lang=en-utf-8" \
                --cookie-jar "$TMPCOOKIES" \
                --dump-header - \
                --url "$PHPMYADMINURL" \
                <<< "pma_username=$MYUSERNAME&pma_password=$MYPASSWORD" \
                | egrep 'token=[0-9a-h]+' \
                | head -1 \
                | sed -r 's/^(.*token=)([0-9a-h]+)(.*)/\2/' \
        ) || exit 1

curl \
       --cookie "$TMPCOOKIES" \
       --data "token=$TOKEN" \
       --data "export_type=server" \
       --data "what=sql" \
       --data "asfile=sendit" \
       --data "sql_data=something" \
       --data "sql_columns=something" \
       --data "sql_hex_for_blob=something" \
       --data "compression=gzip" \
       --url "$PHPMYADMINURL"export.php 1>&2 || exit 1

rm -f "$TMPCOOKIES" || exit 1

PHPMyAdmin は Cookie 以外にトークンを使用するため、コードは通常よりも少し複雑です。

于 2008-10-15T11:15:13.877 に答える
-1

HTTP 自体はステートレスであるため、PHP のセッションには、複数のリクエストにわたって特定の状態を保持する目的があります。PHP からセッションを取得するには、セッションを開始する php ページをリクエストするだけで、その後のリクエストのために取得した Cookie を保持します。

PHP でセッションを開始するのは簡単です。session_start() 関数を呼び出します。リクエストに Cookie が存在する場合、その関数は既存のセッションを再開します。セッションが開始されると、スーパーグローバル配列 $_SESSION を使用して永続変数を設定できます。そこに「ログイン済み」トークンを保存することをお勧めします =) PHP セッションを終了するには、$_SESSION を array() に設定し、トークンが破棄されるようにします。

于 2008-10-15T08:26:42.110 に答える