我们在用户执行特定操作两次时遇到了一些问题,我们有一种机制可以确保用户无法执行此操作但不知何故它仍然会发生。以下是我们当前机制的工作原理:
- 客户端:点击 1 次后按钮将被禁用。
- 服务器端:我们在 URL 中有一个 key 散列,将根据存储在 SESSIONS 中的 key 进行检查,一旦匹配,该 key 就会被删除。
- 数据库端:执行操作后,将标记一个字段,指示用户已完成操作。
但是,采取了所有这些措施,仍然有用户可以执行两次操作,是否有更安全的方法?
这是数据库端的部分代码:
$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;
最佳答案
很高兴看到您已采取一切措施打败坏人。说到坏人:
客户端:这可以通过简单地禁用 javascript 轻松绕过。无论如何都很好,但又不能对抗坏人。
服务器端:这很重要,但是请确保您在每次提交时生成不同的散列/ key 。这是一个 good tutorial at nettutes on how to submit forms in a secure fashion.
数据库端: 不确定,但我怀疑可能存在 SQL 注入(inject)问题。查看有关 SQL Injection 的更多信息 和 how to possibly fix that.
最后:
我建议您查看:
OWASP PHP 项目的目标(OWASP PHP 项目路线图)是使开发人员、系统管理员和应用程序架构师能够构建和部署使用 PHP 编程语言构建的安全应用程序。
关于php - 防止用户执行两次操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2658163/