奇怪的PDO行为

时间:2013-09-22 18:31:52

标签: php pdo

几个小时之后,即使答案对其他人来说显而易见,我也要发布这个问题。

问题在于我想测试令牌,但即使我对其进行硬编码,我仍然会获得无效。而且我知道它必须是正确的,因为我直接在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子句总是捕获它找到的第一行,因此我 永远不匹配现在我必须解决这个问题。

解决方案很简单。在使用新生成的令牌插入新行之前,删除刚验证的条目。新行应包含刚刚验证的SAME persistenceToken。记住,这仍然是UNSECURE,所以在服务器端设置一个FLAG,这是一个cookielogin,并需要一个REAL LOGIN来处理重要数据。

1 个答案:

答案 0 :(得分: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