-1

数時間後、答えが他の誰かにとって明らかであっても、この質問を投稿する必要があります。

問題は、トークンをテストしたいということですが、これをハードコーディングしても、まだ INVALID になります。PHPADMINで直接テストしたので、それが正しいに違いないことはわかっています。奇妙なのは、最初は (ハードコードされずに) 常にパスするが、その後は役に立たないことです。トークンは Cookie から取得されます。

public function findTriplet($credential, $token, $persistentToken) {

    $token = "459078a3b05ce938ed58f9678ac78f1agcgfsewe4";
    $persistentToken = "24d317b742da89ddf5b8ed50993d0f3cgcgfsewe4";
    $credential ="34";
    $q = "SELECT IF(SHA1(?) = {$this->tokenColumn}, 1, -1) AS token_match " .
         "FROM {$this->tableName} WHERE {$this->credentialColumn} = ? " .
         "AND {$this->persistentTokenColumn} = SHA1(?) LIMIT 1 ";
    $query = $this->db->prepare($q);
    $query->execute(array($token, $credential, $persistentToken));
    $result = $query->fetchColumn();

    if (!$result) {
        return self::TRIPLET_NOT_FOUND;
    } else if ($result == 1) {
        return self::TRIPLET_FOUND;
    } else {
        return self::TRIPLET_INVALID; }
    }

編集

limit 句は常に最初に見つかった行をキャッチするため、常に不一致が発生します。これを修正する必要があります。

解決策は簡単でした。新しく生成されたトークンを使用して新しい行を挿入する前に、検証されたばかりのエントリを削除します。新しい行には、検証したばかりの同じ persistenceToken が含まれている必要があります。覚えておいてください、これはまだ安全ではないので、サーバー側でこれが cookielogin であることを示す FLAG を設定し、重要なデータを処理するために REAL LOGIN を必要とします。

4

1 に答える 1