几个小时后,我必须发布这个问题,即使答案对其他人来说可能很明显。
问题是我想测试令牌,但即使我对此进行硬编码,我仍然会得到无效。而且我知道它必须是正确的,因为我直接在 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 来处理重要数据。