我们在用户执行两次特定操作时遇到了一些问题,我们有一种机制可以确保用户无法执行操作,但不知何故仍然会发生。这是我们目前的机制是如何工作的:防止用户执行两次动作
- 客户端:按钮将在1次点击被禁用。
- 服务器端:我们在URL中有一个关键的哈希值,它将根据存储在SESSIONS中的关键字进行检查,一旦匹配,关键字被删除。
- 数据库端:执行操作后,会有一个字段被标记,表示用户已完成操作。
但是,通过所有这些措施,仍然有用户能够执行两次操作,还有没有更安全的方法?
这里是数据库端的部分代码:
$db->beginTransaction();
// Get the user's datas
$user = $db->queryRow("SELECT flag FROM users WHERE userid = {$auth->getProperty('auth_user_id)}");
if ($user['flag'] != 0) {
$db->rollback();
// Return with error
return false;
}
// Proceed with performing the action
// --- Action Here ---
// Double checking process, the user data is retrieved again
$user = $db->queryRow("SELECT flag FROM users WHERE userid = {$auth->getProperty('auth_user_id)}");
if ($user['flag'] != 0) {
$db->rollback();
// Return with error
return false;
}
// --- The final inserting query ---
// Update the flag
$db->query("UPDATE users SET flag = 1 WHERE userid = {$auth->getProperty('auth_user_id)}");
$db->commit();
return true;
事实上,最后一个足以阻止第二次执行,所以我猜这个问题不在想法中,而是在实现中。你可以请张贴一些代码吗? – Crozin 2010-04-17 11:28:11
你想看哪一部分代码? – TheOnly92 2010-04-17 11:35:18
我认为最重要的部分是......检查数据库中的*标志并执行操作。 – Crozin 2010-04-17 11:40:22