-1

几个小时后,我必须发布这个问题,即使答案对其他人来说可能很明显。

问题是我想测试令牌,但即使我对此进行硬编码,我仍然会得到无效。而且我知道它必须是正确的,因为我直接在 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; }
    }

编辑

限制子句总是捕获它找到的第一行,因此我总是得到不匹配现在我必须解决这个问题。

解决方案很简单。在使用新生成的令牌插入新行之前删除刚刚验证的条目。新行应包含您刚刚验证的 SAME persistenceToken。请记住,这仍然是不安全的,因此在服务器端设置一个标志,表明这是一个 cookielogin,并且需要一个 REAL LOGIN 来处理重要数据。

4

1 回答 1

1

我认为您的if支票顺序错误:

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

在 SQL 中,1 表示已找到,-1 表示未找到,其他任何内容均无效。但是在 PHP 中,-1 会落入else子句并返回self::TRIPLET_INVALID,而无效的结果会落入if(!$result)并返回self::TRIPLET_NOT_FOUND

于 2013-09-22T18:55:15.033 回答