【问题标题】:strange PDO behaviour奇怪的 PDO 行为
【发布时间】:2013-09-22 18:31:51
【问题描述】:

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

问题是我想测试令牌,但即使我对此进行硬编码,我仍然会收到 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 子句总是捕获它找到的第一行,因此我 总是不匹配现在我必须解决这个问题。

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

【问题讨论】:

  • 我猜$result"; 是复制和粘贴错误? (语法错误)
  • 这样的东西只能通过调试来排序——系统地分析代码所做的每一步、存在的值和发送的查询。这是每个程序员的标准票价
  • 如何调试这个?好吧,我实际上并没有尝试测试一个值,如果它失败了我会尖叫
  • 你确定要SHA1(something-that-looks-like-a-sha1-hash-already);吗?
  • 您应该仔细查看if ($result == 1),我怀疑这是否符合您的预期。

标签: php pdo


【解决方案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

【讨论】:

  • 我在想它,我认为它就像“无效”,它在除了 tokenColumn 之外的所有列上都匹配,也许你是对的。我现在有点绊倒。我现在要喝汤了。
  • 哦,我明白你的意思了。也许我误解了意图。
  • 无论如何,这一定是非常明显的事情,所以我将一次从一个参数开始,我会告诉你
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多